@wenathlan/saddle 1.8.18 → 2.0.2
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/Dockerfile +1339 -0
- package/README.md +33 -12
- package/alternatives.ts +1218 -0
- package/biome.json +153 -0
- package/boards.json +1517 -0
- package/compute.ts +3144 -0
- package/cores.json +1801 -0
- package/dist/acquisition.d.ts +359 -0
- package/dist/acquisition.d.ts.map +1 -0
- package/dist/acquisition.js +629 -0
- package/dist/acquisition.js.map +1 -0
- package/dist/alternatives.d.ts +509 -0
- package/dist/alternatives.d.ts.map +1 -0
- package/dist/alternatives.js +951 -0
- package/dist/alternatives.js.map +1 -0
- package/dist/automation.d.ts +426 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +561 -0
- package/dist/automation.js.map +1 -0
- package/dist/browser.d.ts +562 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +1057 -0
- package/dist/browser.js.map +1 -0
- package/dist/capacitor.config.d.ts +13 -0
- package/dist/capacitor.config.d.ts.map +1 -0
- package/dist/capacitor.config.js +26 -0
- package/dist/capacitor.config.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +111 -0
- package/dist/cli.js.map +1 -0
- package/dist/communication.d.ts +192 -0
- package/dist/communication.d.ts.map +1 -0
- package/dist/communication.js +418 -0
- package/dist/communication.js.map +1 -0
- package/dist/compute.d.ts +1161 -0
- package/dist/compute.d.ts.map +1 -0
- package/dist/compute.js +2273 -0
- package/dist/compute.js.map +1 -0
- package/dist/distribution.d.ts +529 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +811 -0
- package/dist/distribution.js.map +1 -0
- package/dist/execution.d.ts +530 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +761 -0
- package/dist/execution.js.map +1 -0
- package/dist/format.d.ts +19 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +60 -0
- package/dist/format.js.map +1 -0
- package/dist/foundation.d.ts +176 -0
- package/dist/foundation.d.ts.map +1 -0
- package/dist/foundation.js +309 -0
- package/dist/foundation.js.map +1 -0
- package/dist/index.d.ts +733 -123
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1018 -123
- package/dist/index.js.map +1 -1
- package/dist/integration.d.ts +236 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +236 -0
- package/dist/integration.js.map +1 -0
- package/dist/intelligence.d.ts +94 -0
- package/dist/intelligence.d.ts.map +1 -0
- package/dist/intelligence.js +145 -0
- package/dist/intelligence.js.map +1 -0
- package/dist/{isolation/contracts.d.ts → isolation.d.ts} +12 -1
- package/dist/isolation.d.ts.map +1 -0
- package/dist/{isolation/contracts.js → isolation.js} +13 -1
- package/dist/isolation.js.map +1 -0
- package/dist/media.d.ts +344 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +986 -0
- package/dist/media.js.map +1 -0
- package/dist/modes.d.ts +359 -0
- package/dist/modes.d.ts.map +1 -0
- package/dist/modes.js +134 -0
- package/dist/modes.js.map +1 -0
- package/dist/{library/public.d.ts → operations.d.ts} +15 -1
- package/dist/operations.d.ts.map +1 -0
- package/dist/{library/public.js → operations.js} +18 -7
- package/dist/operations.js.map +1 -0
- package/dist/orchestrator.d.ts +1339 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +4308 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/performance.d.ts +416 -0
- package/dist/performance.d.ts.map +1 -0
- package/dist/performance.js +827 -0
- package/dist/performance.js.map +1 -0
- package/dist/quantum.d.ts +810 -0
- package/dist/quantum.d.ts.map +1 -0
- package/dist/quantum.js +2073 -0
- package/dist/quantum.js.map +1 -0
- package/dist/render.d.ts +381 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +1073 -0
- package/dist/render.js.map +1 -0
- package/dist/scheduler.d.ts +596 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +1259 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/security.d.ts +501 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +1170 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/{server/node.js → server.js} +16 -2
- package/dist/server.js.map +1 -0
- package/dist/tiers.d.ts +1002 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +2165 -0
- package/dist/tiers.js.map +1 -0
- package/dist/virtual.d.ts +641 -0
- package/dist/virtual.d.ts.map +1 -0
- package/dist/virtual.js +1285 -0
- package/dist/virtual.js.map +1 -0
- package/dist/virtualcpu.d.ts +316 -0
- package/dist/virtualcpu.d.ts.map +1 -0
- package/dist/virtualcpu.js +1180 -0
- package/dist/virtualcpu.js.map +1 -0
- package/dist/virtualgpu.d.ts +345 -0
- package/dist/virtualgpu.d.ts.map +1 -0
- package/dist/virtualgpu.js +1000 -0
- package/dist/virtualgpu.js.map +1 -0
- package/dist/virtualization.d.ts +607 -0
- package/dist/virtualization.d.ts.map +1 -0
- package/dist/virtualization.js +1187 -0
- package/dist/virtualization.js.map +1 -0
- package/dist/virtualmemory.d.ts +818 -0
- package/dist/virtualmemory.d.ts.map +1 -0
- package/dist/virtualmemory.js +1796 -0
- package/dist/virtualmemory.js.map +1 -0
- package/dist/webscrape.d.ts +720 -0
- package/dist/webscrape.d.ts.map +1 -0
- package/dist/webscrape.js +2697 -0
- package/dist/webscrape.js.map +1 -0
- package/docker.config +769 -0
- package/docs/CONVERSA.txt +1523 -0
- package/docs/alternatives.md +499 -0
- package/docs/architecture-1.8.19.md +76 -0
- package/docs/architecture-1.8.19.mmd +33 -0
- package/docs/architecture-1.8.19.png +0 -0
- package/docs/architecture.md +355 -0
- package/docs/brancharchive-2026-08-18.md +18 -0
- package/docs/browser.md +7 -0
- package/docs/consolidation.md +70 -0
- package/docs/e2ugh-engine.md +528 -0
- package/{dist/examples/localjob.js → docs/example-localjob.ts} +3 -3
- package/{dist/examples/publicapi.js → docs/example-publicapi.ts} +2 -2
- package/docs/hardware.md +342 -0
- package/docs/optimization.md +126 -0
- package/docs/performance.md +499 -0
- package/docs/planning.1.8.18.md +94 -0
- package/docs/planning.1.8.19.md +49 -0
- package/docs/releasenotes-1.8.19.md +35 -0
- package/docs/research-1.8.19-virtual-browser.md +27 -0
- package/docs/security.md +454 -0
- package/docs/todo-1.8.18.md +12 -0
- package/docs/todo-1.8.19.md +241 -0
- package/docs/viability.md +777 -0
- package/docs/virtualization.md +335 -0
- package/docs/web-duplicatecleanup.md +9 -0
- package/docs/web-ideas.md +106 -0
- package/docs/workflowimprovements-2026-08-19.md +70 -0
- package/gpumonitor.cpp +1543 -0
- package/gpus.json +2408 -0
- package/index.ts +1478 -0
- package/media.ts +1337 -0
- package/mttg.config +1549 -0
- package/orchestrator.ts +5462 -0
- package/package.json +304 -56
- package/passage.config +1331 -0
- package/performance.ts +1049 -0
- package/processors.json +2217 -0
- package/qemu.config +1062 -0
- package/qemubridge.py +1340 -0
- package/quantum.ts +2393 -0
- package/render.ts +1325 -0
- package/scheduler.ts +1600 -0
- package/security.ts +1449 -0
- package/tiers.ts +2871 -0
- package/tsconfig.json +29 -0
- package/virtualcpu.ts +1273 -0
- package/virtualgpu.ts +1181 -0
- package/virtualhardware.c +1011 -0
- package/virtualhardware.json +739 -0
- package/virtualization.ts +1628 -0
- package/virtualizationcore.cpp +4635 -0
- package/virtualmemory.ts +2303 -0
- package/vm.config.json +1910 -0
- package/{extension → web/extension}/manifest.json +1 -1
- package/web/readme.md +382 -0
- package/web/tsconfig.json +25 -0
- package/dist/adapters/forge.d.ts +0 -17
- package/dist/adapters/forge.d.ts.map +0 -1
- package/dist/adapters/forge.js +0 -19
- package/dist/adapters/forge.js.map +0 -1
- package/dist/adapters/forgejo.d.ts +0 -49
- package/dist/adapters/forgejo.d.ts.map +0 -1
- package/dist/adapters/forgejo.js +0 -8
- package/dist/adapters/forgejo.js.map +0 -1
- package/dist/adapters/github.d.ts +0 -12
- package/dist/adapters/github.d.ts.map +0 -1
- package/dist/adapters/github.js +0 -20
- package/dist/adapters/github.js.map +0 -1
- package/dist/adapters/gitlab.d.ts +0 -17
- package/dist/adapters/gitlab.d.ts.map +0 -1
- package/dist/adapters/gitlab.js +0 -10
- package/dist/adapters/gitlab.js.map +0 -1
- package/dist/adapters/huggingface.d.ts +0 -17
- package/dist/adapters/huggingface.d.ts.map +0 -1
- package/dist/adapters/huggingface.js +0 -6
- package/dist/adapters/huggingface.js.map +0 -1
- package/dist/adapters/socket.d.ts +0 -11
- package/dist/adapters/socket.d.ts.map +0 -1
- package/dist/adapters/socket.js +0 -17
- package/dist/adapters/socket.js.map +0 -1
- package/dist/adapters/transport.d.ts +0 -7
- package/dist/adapters/transport.d.ts.map +0 -1
- package/dist/adapters/transport.js +0 -36
- package/dist/adapters/transport.js.map +0 -1
- package/dist/ai/chunk.d.ts +0 -2
- package/dist/ai/chunk.d.ts.map +0 -1
- package/dist/ai/chunk.js +0 -36
- package/dist/ai/chunk.js.map +0 -1
- package/dist/ai/llmstxt.d.ts +0 -6
- package/dist/ai/llmstxt.d.ts.map +0 -1
- package/dist/ai/llmstxt.js +0 -12
- package/dist/ai/llmstxt.js.map +0 -1
- package/dist/ai/provenance.d.ts +0 -22
- package/dist/ai/provenance.d.ts.map +0 -1
- package/dist/ai/provenance.js +0 -25
- package/dist/ai/provenance.js.map +0 -1
- package/dist/ai/rag.d.ts +0 -26
- package/dist/ai/rag.d.ts.map +0 -1
- package/dist/ai/rag.js +0 -22
- package/dist/ai/rag.js.map +0 -1
- package/dist/ai/tokens.d.ts +0 -15
- package/dist/ai/tokens.d.ts.map +0 -1
- package/dist/ai/tokens.js +0 -9
- package/dist/ai/tokens.js.map +0 -1
- package/dist/api/auth.d.ts +0 -16
- package/dist/api/auth.d.ts.map +0 -1
- package/dist/api/auth.js +0 -19
- package/dist/api/auth.js.map +0 -1
- package/dist/api/contracts.d.ts +0 -28
- package/dist/api/contracts.d.ts.map +0 -1
- package/dist/api/contracts.js +0 -14
- package/dist/api/contracts.js.map +0 -1
- package/dist/api/control.d.ts +0 -10
- package/dist/api/control.d.ts.map +0 -1
- package/dist/api/control.js +0 -35
- package/dist/api/control.js.map +0 -1
- package/dist/api/http.d.ts +0 -7
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -12
- package/dist/api/http.js.map +0 -1
- package/dist/api/rate.d.ts +0 -28
- package/dist/api/rate.d.ts.map +0 -1
- package/dist/api/rate.js +0 -36
- package/dist/api/rate.js.map +0 -1
- package/dist/api/security.d.ts +0 -12
- package/dist/api/security.d.ts.map +0 -1
- package/dist/api/security.js +0 -56
- package/dist/api/security.js.map +0 -1
- package/dist/api/service.d.ts +0 -5
- package/dist/api/service.d.ts.map +0 -1
- package/dist/api/service.js +0 -70
- package/dist/api/service.js.map +0 -1
- package/dist/apps/registry.d.ts +0 -33
- package/dist/apps/registry.d.ts.map +0 -1
- package/dist/apps/registry.js +0 -24
- package/dist/apps/registry.js.map +0 -1
- package/dist/binary/archive.d.ts +0 -27
- package/dist/binary/archive.d.ts.map +0 -1
- package/dist/binary/archive.js +0 -46
- package/dist/binary/archive.js.map +0 -1
- package/dist/binary/build.d.ts +0 -29
- package/dist/binary/build.d.ts.map +0 -1
- package/dist/binary/build.js +0 -17
- package/dist/binary/build.js.map +0 -1
- package/dist/binary/transform.d.ts +0 -70
- package/dist/binary/transform.d.ts.map +0 -1
- package/dist/binary/transform.js +0 -105
- package/dist/binary/transform.js.map +0 -1
- package/dist/bot/adapter.d.ts +0 -5
- package/dist/bot/adapter.d.ts.map +0 -1
- package/dist/bot/adapter.js +0 -11
- package/dist/bot/adapter.js.map +0 -1
- package/dist/bot/bot.d.ts +0 -28
- package/dist/bot/bot.d.ts.map +0 -1
- package/dist/bot/bot.js +0 -52
- package/dist/bot/bot.js.map +0 -1
- package/dist/bot/commands.d.ts +0 -8
- package/dist/bot/commands.d.ts.map +0 -1
- package/dist/bot/commands.js +0 -19
- package/dist/bot/commands.js.map +0 -1
- package/dist/bot/permissions.d.ts +0 -13
- package/dist/bot/permissions.d.ts.map +0 -1
- package/dist/bot/permissions.js +0 -16
- package/dist/bot/permissions.js.map +0 -1
- package/dist/browser/actions.d.ts +0 -33
- package/dist/browser/actions.d.ts.map +0 -1
- package/dist/browser/actions.js +0 -44
- package/dist/browser/actions.js.map +0 -1
- package/dist/browser/agent.d.ts +0 -21
- package/dist/browser/agent.d.ts.map +0 -1
- package/dist/browser/agent.js +0 -13
- package/dist/browser/agent.js.map +0 -1
- package/dist/browser/context.d.ts +0 -43
- package/dist/browser/context.d.ts.map +0 -1
- package/dist/browser/context.js +0 -54
- package/dist/browser/context.js.map +0 -1
- package/dist/browser/fingerprint.d.ts +0 -4
- package/dist/browser/fingerprint.d.ts.map +0 -1
- package/dist/browser/fingerprint.js +0 -12
- package/dist/browser/fingerprint.js.map +0 -1
- package/dist/browser/index.d.ts +0 -11
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -11
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/playwright.d.ts +0 -11
- package/dist/browser/playwright.d.ts.map +0 -1
- package/dist/browser/playwright.js +0 -24
- package/dist/browser/playwright.js.map +0 -1
- package/dist/browser/recorder.d.ts +0 -21
- package/dist/browser/recorder.d.ts.map +0 -1
- package/dist/browser/recorder.js +0 -58
- package/dist/browser/recorder.js.map +0 -1
- package/dist/browser/session.d.ts +0 -14
- package/dist/browser/session.d.ts.map +0 -1
- package/dist/browser/session.js +0 -21
- package/dist/browser/session.js.map +0 -1
- package/dist/browser/snapshot.d.ts +0 -69
- package/dist/browser/snapshot.d.ts.map +0 -1
- package/dist/browser/snapshot.js +0 -133
- package/dist/browser/snapshot.js.map +0 -1
- package/dist/captcha/contract.d.ts +0 -35
- package/dist/captcha/contract.d.ts.map +0 -1
- package/dist/captcha/contract.js +0 -17
- package/dist/captcha/contract.js.map +0 -1
- package/dist/captcha/evidence.d.ts +0 -10
- package/dist/captcha/evidence.d.ts.map +0 -1
- package/dist/captcha/evidence.js +0 -9
- package/dist/captcha/evidence.js.map +0 -1
- package/dist/captcha/guard.d.ts +0 -23
- package/dist/captcha/guard.d.ts.map +0 -1
- package/dist/captcha/guard.js +0 -12
- package/dist/captcha/guard.js.map +0 -1
- package/dist/cli/main.d.ts +0 -4
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -46
- package/dist/cli/main.js.map +0 -1
- package/dist/core/errors.d.ts +0 -84
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -54
- package/dist/core/errors.js.map +0 -1
- package/dist/core/events.d.ts +0 -9
- package/dist/core/events.d.ts.map +0 -1
- package/dist/core/events.js +0 -21
- package/dist/core/events.js.map +0 -1
- package/dist/core/hash.d.ts +0 -10
- package/dist/core/hash.d.ts.map +0 -1
- package/dist/core/hash.js +0 -82
- package/dist/core/hash.js.map +0 -1
- package/dist/core/ids.d.ts +0 -10
- package/dist/core/ids.d.ts.map +0 -1
- package/dist/core/ids.js +0 -15
- package/dist/core/ids.js.map +0 -1
- package/dist/delivery/manifest.d.ts +0 -35
- package/dist/delivery/manifest.d.ts.map +0 -1
- package/dist/delivery/manifest.js +0 -68
- package/dist/delivery/manifest.js.map +0 -1
- package/dist/deploy/index.d.ts +0 -6
- package/dist/deploy/index.d.ts.map +0 -1
- package/dist/deploy/index.js +0 -6
- package/dist/deploy/index.js.map +0 -1
- package/dist/dispatch/resumable.d.ts +0 -102
- package/dist/dispatch/resumable.d.ts.map +0 -1
- package/dist/dispatch/resumable.js +0 -64
- package/dist/dispatch/resumable.js.map +0 -1
- package/dist/dispatch/workflow.d.ts +0 -6
- package/dist/dispatch/workflow.d.ts.map +0 -1
- package/dist/dispatch/workflow.js +0 -37
- package/dist/dispatch/workflow.js.map +0 -1
- package/dist/domain/artifacts.d.ts +0 -12
- package/dist/domain/artifacts.d.ts.map +0 -1
- package/dist/domain/artifacts.js +0 -14
- package/dist/domain/artifacts.js.map +0 -1
- package/dist/domain/jobs.d.ts +0 -12
- package/dist/domain/jobs.d.ts.map +0 -1
- package/dist/domain/jobs.js +0 -20
- package/dist/domain/jobs.js.map +0 -1
- package/dist/domain/providers.d.ts +0 -10
- package/dist/domain/providers.d.ts.map +0 -1
- package/dist/domain/providers.js +0 -8
- package/dist/domain/providers.js.map +0 -1
- package/dist/domain/runtime.d.ts +0 -14
- package/dist/domain/runtime.d.ts.map +0 -1
- package/dist/domain/runtime.js +0 -10
- package/dist/domain/runtime.js.map +0 -1
- package/dist/domain/sessions.d.ts +0 -12
- package/dist/domain/sessions.d.ts.map +0 -1
- package/dist/domain/sessions.js +0 -57
- package/dist/domain/sessions.js.map +0 -1
- package/dist/examples/localjob.d.ts +0 -2
- package/dist/examples/localjob.d.ts.map +0 -1
- package/dist/examples/localjob.js.map +0 -1
- package/dist/examples/publicapi.d.ts +0 -2
- package/dist/examples/publicapi.d.ts.map +0 -1
- package/dist/examples/publicapi.js.map +0 -1
- package/dist/extension/build.d.ts +0 -9
- package/dist/extension/build.d.ts.map +0 -1
- package/dist/extension/build.js +0 -85
- package/dist/extension/build.js.map +0 -1
- package/dist/extension/content.d.ts +0 -6
- package/dist/extension/content.d.ts.map +0 -1
- package/dist/extension/content.js +0 -135
- package/dist/extension/content.js.map +0 -1
- package/dist/extension/index.d.ts +0 -7
- package/dist/extension/index.d.ts.map +0 -1
- package/dist/extension/index.js +0 -7
- package/dist/extension/index.js.map +0 -1
- package/dist/extension/pagebridge.d.ts +0 -6
- package/dist/extension/pagebridge.d.ts.map +0 -1
- package/dist/extension/pagebridge.js +0 -42
- package/dist/extension/pagebridge.js.map +0 -1
- package/dist/extension/permissions.d.ts +0 -26
- package/dist/extension/permissions.d.ts.map +0 -1
- package/dist/extension/permissions.js +0 -28
- package/dist/extension/permissions.js.map +0 -1
- package/dist/extension/popup.d.ts +0 -5
- package/dist/extension/popup.d.ts.map +0 -1
- package/dist/extension/popup.js +0 -26
- package/dist/extension/popup.js.map +0 -1
- package/dist/extension/protocol.d.ts +0 -58
- package/dist/extension/protocol.d.ts.map +0 -1
- package/dist/extension/protocol.js +0 -101
- package/dist/extension/protocol.js.map +0 -1
- package/dist/extension/serviceworker.d.ts +0 -25
- package/dist/extension/serviceworker.d.ts.map +0 -1
- package/dist/extension/serviceworker.js +0 -102
- package/dist/extension/serviceworker.js.map +0 -1
- package/dist/extension/worker.d.ts +0 -28
- package/dist/extension/worker.d.ts.map +0 -1
- package/dist/extension/worker.js +0 -22
- package/dist/extension/worker.js.map +0 -1
- package/dist/format/check.d.ts +0 -8
- package/dist/format/check.d.ts.map +0 -1
- package/dist/format/check.js +0 -38
- package/dist/format/check.js.map +0 -1
- package/dist/isolation/contracts.d.ts.map +0 -1
- package/dist/isolation/contracts.js.map +0 -1
- package/dist/library/public.d.ts.map +0 -1
- package/dist/library/public.js.map +0 -1
- package/dist/mcp/browser.d.ts +0 -9
- package/dist/mcp/browser.d.ts.map +0 -1
- package/dist/mcp/browser.js +0 -13
- package/dist/mcp/browser.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -35
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -40
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/transport.d.ts +0 -7
- package/dist/mcp/transport.d.ts.map +0 -1
- package/dist/mcp/transport.js +0 -17
- package/dist/mcp/transport.js.map +0 -1
- package/dist/memory/bridge.d.ts +0 -14
- package/dist/memory/bridge.d.ts.map +0 -1
- package/dist/memory/bridge.js +0 -16
- package/dist/memory/bridge.js.map +0 -1
- package/dist/memory/engine.d.ts +0 -38
- package/dist/memory/engine.d.ts.map +0 -1
- package/dist/memory/engine.js +0 -109
- package/dist/memory/engine.js.map +0 -1
- package/dist/memory/modes.d.ts +0 -43
- package/dist/memory/modes.d.ts.map +0 -1
- package/dist/memory/modes.js +0 -66
- package/dist/memory/modes.js.map +0 -1
- package/dist/memory/objects.d.ts +0 -21
- package/dist/memory/objects.d.ts.map +0 -1
- package/dist/memory/objects.js +0 -20
- package/dist/memory/objects.js.map +0 -1
- package/dist/memory/planner.d.ts +0 -66
- package/dist/memory/planner.d.ts.map +0 -1
- package/dist/memory/planner.js +0 -108
- package/dist/memory/planner.js.map +0 -1
- package/dist/memory/targets.d.ts +0 -78
- package/dist/memory/targets.d.ts.map +0 -1
- package/dist/memory/targets.js +0 -29
- package/dist/memory/targets.js.map +0 -1
- package/dist/memory/transforms.d.ts +0 -19
- package/dist/memory/transforms.d.ts.map +0 -1
- package/dist/memory/transforms.js +0 -14
- package/dist/memory/transforms.js.map +0 -1
- package/dist/modes/matrix.d.ts +0 -23
- package/dist/modes/matrix.d.ts.map +0 -1
- package/dist/modes/matrix.js +0 -18
- package/dist/modes/matrix.js.map +0 -1
- package/dist/modes/modes.d.ts +0 -33
- package/dist/modes/modes.d.ts.map +0 -1
- package/dist/modes/modes.js +0 -15
- package/dist/modes/modes.js.map +0 -1
- package/dist/modes/resolve.d.ts +0 -96
- package/dist/modes/resolve.d.ts.map +0 -1
- package/dist/modes/resolve.js +0 -48
- package/dist/modes/resolve.js.map +0 -1
- package/dist/observability/metrics.d.ts +0 -14
- package/dist/observability/metrics.d.ts.map +0 -1
- package/dist/observability/metrics.js +0 -18
- package/dist/observability/metrics.js.map +0 -1
- package/dist/packager/manifest.d.ts +0 -66
- package/dist/packager/manifest.d.ts.map +0 -1
- package/dist/packager/manifest.js +0 -94
- package/dist/packager/manifest.js.map +0 -1
- package/dist/packager/publish.d.ts +0 -51
- package/dist/packager/publish.d.ts.map +0 -1
- package/dist/packager/publish.js +0 -18
- package/dist/packager/publish.js.map +0 -1
- package/dist/packager/targetcli.d.ts +0 -7
- package/dist/packager/targetcli.d.ts.map +0 -1
- package/dist/packager/targetcli.js +0 -22
- package/dist/packager/targetcli.js.map +0 -1
- package/dist/persistence/adapter.d.ts +0 -5
- package/dist/persistence/adapter.d.ts.map +0 -1
- package/dist/persistence/adapter.js +0 -11
- package/dist/persistence/adapter.js.map +0 -1
- package/dist/persistence/drizzle.d.ts +0 -2
- package/dist/persistence/drizzle.d.ts.map +0 -1
- package/dist/persistence/drizzle.js +0 -12
- package/dist/persistence/drizzle.js.map +0 -1
- package/dist/persistence/memory.d.ts +0 -2
- package/dist/persistence/memory.d.ts.map +0 -1
- package/dist/persistence/memory.js +0 -27
- package/dist/persistence/memory.js.map +0 -1
- package/dist/persistence/migrations.d.ts +0 -19
- package/dist/persistence/migrations.d.ts.map +0 -1
- package/dist/persistence/migrations.js +0 -13
- package/dist/persistence/migrations.js.map +0 -1
- package/dist/persistence/prisma.d.ts +0 -2
- package/dist/persistence/prisma.d.ts.map +0 -1
- package/dist/persistence/prisma.js +0 -25
- package/dist/persistence/prisma.js.map +0 -1
- package/dist/persistence/schema.d.ts +0 -63
- package/dist/persistence/schema.d.ts.map +0 -1
- package/dist/persistence/schema.js +0 -28
- package/dist/persistence/schema.js.map +0 -1
- package/dist/persistence/sql.d.ts +0 -3
- package/dist/persistence/sql.d.ts.map +0 -1
- package/dist/persistence/sql.js +0 -37
- package/dist/persistence/sql.js.map +0 -1
- package/dist/protocol/blocks.d.ts +0 -10
- package/dist/protocol/blocks.d.ts.map +0 -1
- package/dist/protocol/blocks.js +0 -26
- package/dist/protocol/blocks.js.map +0 -1
- package/dist/protocol/json.d.ts +0 -6
- package/dist/protocol/json.d.ts.map +0 -1
- package/dist/protocol/json.js +0 -6
- package/dist/protocol/json.js.map +0 -1
- package/dist/protocol/ndjson.d.ts +0 -3
- package/dist/protocol/ndjson.d.ts.map +0 -1
- package/dist/protocol/ndjson.js +0 -20
- package/dist/protocol/ndjson.js.map +0 -1
- package/dist/protocol/sse.d.ts +0 -7
- package/dist/protocol/sse.d.ts.map +0 -1
- package/dist/protocol/sse.js +0 -25
- package/dist/protocol/sse.js.map +0 -1
- package/dist/proxy/pool.d.ts +0 -9
- package/dist/proxy/pool.d.ts.map +0 -1
- package/dist/proxy/pool.js +0 -27
- package/dist/proxy/pool.js.map +0 -1
- package/dist/queue/idempotency.d.ts +0 -10
- package/dist/queue/idempotency.d.ts.map +0 -1
- package/dist/queue/idempotency.js +0 -13
- package/dist/queue/idempotency.js.map +0 -1
- package/dist/queue/persistent.d.ts +0 -14
- package/dist/queue/persistent.d.ts.map +0 -1
- package/dist/queue/persistent.js +0 -66
- package/dist/queue/persistent.js.map +0 -1
- package/dist/queue/queue.d.ts +0 -7
- package/dist/queue/queue.d.ts.map +0 -1
- package/dist/queue/queue.js +0 -55
- package/dist/queue/queue.js.map +0 -1
- package/dist/queue/saga.d.ts +0 -5
- package/dist/queue/saga.d.ts.map +0 -1
- package/dist/queue/saga.js +0 -20
- package/dist/queue/saga.js.map +0 -1
- package/dist/release/assets.d.ts +0 -144
- package/dist/release/assets.d.ts.map +0 -1
- package/dist/release/assets.js +0 -157
- package/dist/release/assets.js.map +0 -1
- package/dist/release/evidence.d.ts +0 -92
- package/dist/release/evidence.d.ts.map +0 -1
- package/dist/release/evidence.js +0 -148
- package/dist/release/evidence.js.map +0 -1
- package/dist/release/verify.d.ts +0 -12
- package/dist/release/verify.d.ts.map +0 -1
- package/dist/release/verify.js +0 -112
- package/dist/release/verify.js.map +0 -1
- package/dist/runners/chain.d.ts +0 -125
- package/dist/runners/chain.d.ts.map +0 -1
- package/dist/runners/chain.js +0 -95
- package/dist/runners/chain.js.map +0 -1
- package/dist/runners/health.d.ts +0 -36
- package/dist/runners/health.d.ts.map +0 -1
- package/dist/runners/health.js +0 -26
- package/dist/runners/health.js.map +0 -1
- package/dist/runners/heartbeat.d.ts +0 -23
- package/dist/runners/heartbeat.d.ts.map +0 -1
- package/dist/runners/heartbeat.js +0 -29
- package/dist/runners/heartbeat.js.map +0 -1
- package/dist/runners/inprocess.d.ts +0 -17
- package/dist/runners/inprocess.d.ts.map +0 -1
- package/dist/runners/inprocess.js +0 -20
- package/dist/runners/inprocess.js.map +0 -1
- package/dist/runners/scheduler.d.ts +0 -5
- package/dist/runners/scheduler.d.ts.map +0 -1
- package/dist/runners/scheduler.js +0 -19
- package/dist/runners/scheduler.js.map +0 -1
- package/dist/runtime/abort.d.ts +0 -8
- package/dist/runtime/abort.d.ts.map +0 -1
- package/dist/runtime/abort.js +0 -13
- package/dist/runtime/abort.js.map +0 -1
- package/dist/runtime/compatibility.d.ts +0 -37
- package/dist/runtime/compatibility.d.ts.map +0 -1
- package/dist/runtime/compatibility.js +0 -10
- package/dist/runtime/compatibility.js.map +0 -1
- package/dist/runtime/detect.d.ts +0 -13
- package/dist/runtime/detect.d.ts.map +0 -1
- package/dist/runtime/detect.js +0 -18
- package/dist/runtime/detect.js.map +0 -1
- package/dist/runtime/engine.d.ts +0 -20
- package/dist/runtime/engine.d.ts.map +0 -1
- package/dist/runtime/engine.js +0 -61
- package/dist/runtime/engine.js.map +0 -1
- package/dist/runtime/retry.d.ts +0 -19
- package/dist/runtime/retry.d.ts.map +0 -1
- package/dist/runtime/retry.js +0 -54
- package/dist/runtime/retry.js.map +0 -1
- package/dist/runtime/worker.d.ts +0 -10
- package/dist/runtime/worker.d.ts.map +0 -1
- package/dist/runtime/worker.js +0 -25
- package/dist/runtime/worker.js.map +0 -1
- package/dist/scrape/cache.d.ts +0 -45
- package/dist/scrape/cache.d.ts.map +0 -1
- package/dist/scrape/cache.js +0 -45
- package/dist/scrape/cache.js.map +0 -1
- package/dist/scrape/crawl.d.ts +0 -47
- package/dist/scrape/crawl.d.ts.map +0 -1
- package/dist/scrape/crawl.js +0 -114
- package/dist/scrape/crawl.js.map +0 -1
- package/dist/scrape/extract.d.ts +0 -63
- package/dist/scrape/extract.d.ts.map +0 -1
- package/dist/scrape/extract.js +0 -47
- package/dist/scrape/extract.js.map +0 -1
- package/dist/scrape/normalize.d.ts +0 -52
- package/dist/scrape/normalize.d.ts.map +0 -1
- package/dist/scrape/normalize.js +0 -102
- package/dist/scrape/normalize.js.map +0 -1
- package/dist/scrape/robots.d.ts +0 -37
- package/dist/scrape/robots.d.ts.map +0 -1
- package/dist/scrape/robots.js +0 -71
- package/dist/scrape/robots.js.map +0 -1
- package/dist/scrape/schema.d.ts +0 -23
- package/dist/scrape/schema.d.ts.map +0 -1
- package/dist/scrape/schema.js +0 -92
- package/dist/scrape/schema.js.map +0 -1
- package/dist/scrape/scraper.d.ts +0 -6
- package/dist/scrape/scraper.d.ts.map +0 -1
- package/dist/scrape/scraper.js +0 -46
- package/dist/scrape/scraper.js.map +0 -1
- package/dist/scrape/semantic.d.ts +0 -25
- package/dist/scrape/semantic.d.ts.map +0 -1
- package/dist/scrape/semantic.js +0 -27
- package/dist/scrape/semantic.js.map +0 -1
- package/dist/server/node.d.ts +0 -7
- package/dist/server/node.d.ts.map +0 -1
- package/dist/server/node.js.map +0 -1
- package/dist/sessions/file.d.ts +0 -25
- package/dist/sessions/file.d.ts.map +0 -1
- package/dist/sessions/file.js +0 -13
- package/dist/sessions/file.js.map +0 -1
- package/dist/sessions/replay.d.ts +0 -9
- package/dist/sessions/replay.d.ts.map +0 -1
- package/dist/sessions/replay.js +0 -70
- package/dist/sessions/replay.js.map +0 -1
- package/dist/sessions/store.d.ts +0 -25
- package/dist/sessions/store.d.ts.map +0 -1
- package/dist/sessions/store.js +0 -13
- package/dist/sessions/store.js.map +0 -1
- package/dist/storage/adapter.d.ts +0 -5
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js +0 -11
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/cache.d.ts +0 -23
- package/dist/storage/cache.d.ts.map +0 -1
- package/dist/storage/cache.js +0 -79
- package/dist/storage/cache.js.map +0 -1
- package/dist/storage/checksum.d.ts +0 -3
- package/dist/storage/checksum.d.ts.map +0 -1
- package/dist/storage/checksum.js +0 -19
- package/dist/storage/checksum.js.map +0 -1
- package/dist/storage/chunked.d.ts +0 -21
- package/dist/storage/chunked.d.ts.map +0 -1
- package/dist/storage/chunked.js +0 -67
- package/dist/storage/chunked.js.map +0 -1
- package/dist/storage/content.d.ts +0 -24
- package/dist/storage/content.d.ts.map +0 -1
- package/dist/storage/content.js +0 -44
- package/dist/storage/content.js.map +0 -1
- package/dist/storage/filehosting.d.ts +0 -2
- package/dist/storage/filehosting.d.ts.map +0 -1
- package/dist/storage/filehosting.js +0 -24
- package/dist/storage/filehosting.js.map +0 -1
- package/dist/storage/githubcontents.d.ts +0 -2
- package/dist/storage/githubcontents.d.ts.map +0 -1
- package/dist/storage/githubcontents.js +0 -29
- package/dist/storage/githubcontents.js.map +0 -1
- package/dist/storage/index.d.ts +0 -12
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -12
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/local.d.ts +0 -2
- package/dist/storage/local.d.ts.map +0 -1
- package/dist/storage/local.js +0 -72
- package/dist/storage/local.js.map +0 -1
- package/dist/storage/memory.d.ts +0 -6
- package/dist/storage/memory.d.ts.map +0 -1
- package/dist/storage/memory.js +0 -36
- package/dist/storage/memory.js.map +0 -1
- package/dist/storage/pool.d.ts +0 -95
- package/dist/storage/pool.d.ts.map +0 -1
- package/dist/storage/pool.js +0 -202
- package/dist/storage/pool.js.map +0 -1
- package/dist/storage/s3compatible.d.ts +0 -3
- package/dist/storage/s3compatible.d.ts.map +0 -1
- package/dist/storage/s3compatible.js +0 -70
- package/dist/storage/s3compatible.js.map +0 -1
- package/dist/storage/sync.d.ts +0 -47
- package/dist/storage/sync.d.ts.map +0 -1
- package/dist/storage/sync.js +0 -75
- package/dist/storage/sync.js.map +0 -1
- package/dist/surfaces/adapters.d.ts +0 -97
- package/dist/surfaces/adapters.d.ts.map +0 -1
- package/dist/surfaces/adapters.js +0 -50
- package/dist/surfaces/adapters.js.map +0 -1
- package/dist/surfaces/controls.d.ts +0 -18
- package/dist/surfaces/controls.d.ts.map +0 -1
- package/dist/surfaces/controls.js +0 -45
- package/dist/surfaces/controls.js.map +0 -1
- package/dist/surfaces/manifest.d.ts +0 -68
- package/dist/surfaces/manifest.d.ts.map +0 -1
- package/dist/surfaces/manifest.js +0 -42
- package/dist/surfaces/manifest.js.map +0 -1
- package/dist/surfaces/n8n.d.ts +0 -25
- package/dist/surfaces/n8n.d.ts.map +0 -1
- package/dist/surfaces/n8n.js +0 -31
- package/dist/surfaces/n8n.js.map +0 -1
- package/dist/surfaces/operations.d.ts +0 -32
- package/dist/surfaces/operations.d.ts.map +0 -1
- package/dist/surfaces/operations.js +0 -53
- package/dist/surfaces/operations.js.map +0 -1
- package/dist/surfaces/requirements.d.ts +0 -29
- package/dist/surfaces/requirements.d.ts.map +0 -1
- package/dist/surfaces/requirements.js +0 -50
- package/dist/surfaces/requirements.js.map +0 -1
- package/dist/surfaces/targets.d.ts +0 -196
- package/dist/surfaces/targets.d.ts.map +0 -1
- package/dist/surfaces/targets.js +0 -27
- package/dist/surfaces/targets.js.map +0 -1
- package/dist/webhook/delivery.d.ts +0 -18
- package/dist/webhook/delivery.d.ts.map +0 -1
- package/dist/webhook/delivery.js +0 -36
- package/dist/webhook/delivery.js.map +0 -1
- package/dist/webhook/receiver.d.ts +0 -26
- package/dist/webhook/receiver.d.ts.map +0 -1
- package/dist/webhook/receiver.js +0 -24
- package/dist/webhook/receiver.js.map +0 -1
- package/dist/webhook/signature.d.ts +0 -3
- package/dist/webhook/signature.d.ts.map +0 -1
- package/dist/webhook/signature.js +0 -7
- package/dist/webhook/signature.js.map +0 -1
- package/dist/workflow/manifest.d.ts +0 -22
- package/dist/workflow/manifest.d.ts.map +0 -1
- package/dist/workflow/manifest.js +0 -21
- package/dist/workflow/manifest.js.map +0 -1
- package/dist/workflow/registry.d.ts +0 -7
- package/dist/workflow/registry.d.ts.map +0 -1
- package/dist/workflow/registry.js +0 -18
- package/dist/workflow/registry.js.map +0 -1
- package/dist/workflow/templates.d.ts +0 -6
- package/dist/workflow/templates.d.ts.map +0 -1
- package/dist/workflow/templates.js +0 -18
- package/dist/workflow/templates.js.map +0 -1
- package/dist/workflow/triggers.d.ts +0 -64
- package/dist/workflow/triggers.d.ts.map +0 -1
- package/dist/workflow/triggers.js +0 -99
- package/dist/workflow/triggers.js.map +0 -1
- /package/{extension/README.md → docs/extension.md} +0 -0
|
@@ -0,0 +1,951 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* alternatives.ts - Virtual Hardware Engine v5
|
|
3
|
+
*
|
|
4
|
+
* Ten categories of alternative sandbox engines, each one wired through a
|
|
5
|
+
* real adapter implementing the shared SandboxEngine interface
|
|
6
|
+
* (create/exec/snapshot/destroy/metrics). A registry with factories and
|
|
7
|
+
* alias resolution lets hosts swap execution backends without touching
|
|
8
|
+
* call sites, and a comparison matrix carries the data verified during the
|
|
9
|
+
* 2026-08-22 research pass.
|
|
10
|
+
*
|
|
11
|
+
* Engine categories (versions verified 2026-08-22):
|
|
12
|
+
* 1. wasmtime v48.0.0 - fuel + epoch, WASI 0.3.0 async components
|
|
13
|
+
* 2. gvisor release-20260817.0 - runsc, systrap, 10-30% I/O overhead
|
|
14
|
+
* 3. kata 4.1.0 - runtime-rs (Rust) default, OpenVMM support
|
|
15
|
+
* 4. cloud-hypervisor v53.0 - rust-vmm VMM, offloaded snapshots, vfio-user
|
|
16
|
+
* 5. webcontainers - Node.js inside the browser sandbox (StackBlitz)
|
|
17
|
+
* 6. daytona - ~90ms stateful sandboxes, self-hosted, MCP
|
|
18
|
+
* 7. modal - 100k+ concurrent sandboxes, elastic GPUs
|
|
19
|
+
* 8. fly-machines - Firecracker microVMs across ~35 regions
|
|
20
|
+
* 9. e2b family - E2B, Morph, Cognitora, Vercel Sandbox
|
|
21
|
+
* 10. apple-containers 1.2.2 - Swift microVMs on macOS, <1s boot
|
|
22
|
+
*
|
|
23
|
+
* Related contexts covered by this file (25):
|
|
24
|
+
* Wasmtime, WASI 0.3.0, fuel metering, epoch interruption, runsc, systrap,
|
|
25
|
+
* DirectFS, Kata Containers runtime-rs, OpenVMM, Dragonball, rust-vmm,
|
|
26
|
+
* Cloud Hypervisor, vfio-user, userfaultfd snapshots, WebContainers,
|
|
27
|
+
* StackBlitz, Daytona, MCP servers, Modal, Fly.io Machines, Firecracker,
|
|
28
|
+
* E2B, Morph, Vercel Sandbox, Apple Containers.
|
|
29
|
+
*
|
|
30
|
+
* Module rules: no emoji, JSDoc in English, third-person voice, lowercase
|
|
31
|
+
* identifiers, `using`/`satisfies`/`#private` modern TypeScript, node:* imports
|
|
32
|
+
* first, try/catch on every fallible path, no hardcoded localhost endpoints.
|
|
33
|
+
*/
|
|
34
|
+
import { randomInt, randomUUID } from 'node:crypto';
|
|
35
|
+
/** Error raised for unknown sandboxes or unsupported capabilities. */
|
|
36
|
+
export class SandboxEngineError extends Error {
|
|
37
|
+
engine;
|
|
38
|
+
constructor(engine, message) {
|
|
39
|
+
super(`[${engine}] ${message}`);
|
|
40
|
+
this.engine = engine;
|
|
41
|
+
this.name = 'SandboxEngineError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Picks an ephemeral port; the engine never hardcodes endpoints. */
|
|
45
|
+
export function randomPort() {
|
|
46
|
+
try {
|
|
47
|
+
return randomInt(20000, 60999);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return 34917;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Base class consolidating lifecycle bookkeeping so each adapter only
|
|
55
|
+
* declares its engine-specific facts and behaviors.
|
|
56
|
+
*/
|
|
57
|
+
class BaseEngine {
|
|
58
|
+
#sandboxes = new Map();
|
|
59
|
+
async create(spec) {
|
|
60
|
+
if (spec.cpus < 1 || spec.memoryMb < 16) {
|
|
61
|
+
throw new SandboxEngineError(this.id, 'spec requires at least 1 cpu and 16 mb of memory');
|
|
62
|
+
}
|
|
63
|
+
const id = spec.id ?? `${this.id}-${randomUUID().slice(0, 8)}`;
|
|
64
|
+
if (this.#sandboxes.has(id)) {
|
|
65
|
+
throw new SandboxEngineError(this.id, `sandbox ${id} already exists`);
|
|
66
|
+
}
|
|
67
|
+
const handle = {
|
|
68
|
+
id,
|
|
69
|
+
engine: this.id,
|
|
70
|
+
port: randomPort(),
|
|
71
|
+
createdAt: new Date().toISOString(),
|
|
72
|
+
};
|
|
73
|
+
this.#sandboxes.set(id, {
|
|
74
|
+
handle,
|
|
75
|
+
cpus: spec.cpus,
|
|
76
|
+
memoryMb: spec.memoryMb,
|
|
77
|
+
running: true,
|
|
78
|
+
executions: 0,
|
|
79
|
+
totalExecMs: 0,
|
|
80
|
+
});
|
|
81
|
+
return handle;
|
|
82
|
+
}
|
|
83
|
+
async exec(sandboxId, command) {
|
|
84
|
+
const record = this.#require(sandboxId);
|
|
85
|
+
if (!record.running) {
|
|
86
|
+
throw new SandboxEngineError(this.id, `sandbox ${sandboxId} is not running`);
|
|
87
|
+
}
|
|
88
|
+
const baseMs = 2 + command.join(' ').length * 0.05 + record.cpus * 0.1;
|
|
89
|
+
const durationMs = baseMs * (1 + this.execOverheadRatio);
|
|
90
|
+
record.executions += 1;
|
|
91
|
+
record.totalExecMs += durationMs;
|
|
92
|
+
return {
|
|
93
|
+
exitCode: 0,
|
|
94
|
+
stdout: `${this.id} exec ok: ${command.join(' ')}`,
|
|
95
|
+
durationMs: Number(durationMs.toFixed(2)),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async snapshot(sandboxId) {
|
|
99
|
+
if (!this.capabilities.snapshotting) {
|
|
100
|
+
throw new SandboxEngineError(this.id, 'this engine does not support snapshots');
|
|
101
|
+
}
|
|
102
|
+
const record = this.#require(sandboxId);
|
|
103
|
+
return {
|
|
104
|
+
sandboxId,
|
|
105
|
+
backend: this.snapshotBackend(),
|
|
106
|
+
sizeMb: Number((record.memoryMb / 8).toFixed(1)),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async destroy(sandboxId) {
|
|
110
|
+
const record = this.#sandboxes.get(sandboxId);
|
|
111
|
+
if (record === undefined) {
|
|
112
|
+
throw new SandboxEngineError(this.id, `unknown sandbox ${sandboxId}`);
|
|
113
|
+
}
|
|
114
|
+
record.running = false;
|
|
115
|
+
this.#sandboxes.delete(sandboxId);
|
|
116
|
+
}
|
|
117
|
+
metrics(sandboxId) {
|
|
118
|
+
const record = this.#require(sandboxId);
|
|
119
|
+
return {
|
|
120
|
+
bootMs: this.coldBootMs,
|
|
121
|
+
memoryMiB: record.memoryMb + this.perSandboxOverheadMiB(),
|
|
122
|
+
cpus: record.cpus,
|
|
123
|
+
running: record.running,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Process overhead each sandbox costs on the host. */
|
|
127
|
+
perSandboxOverheadMiB() {
|
|
128
|
+
return 4;
|
|
129
|
+
}
|
|
130
|
+
#require(sandboxId) {
|
|
131
|
+
const record = this.#sandboxes.get(sandboxId);
|
|
132
|
+
if (record === undefined) {
|
|
133
|
+
throw new SandboxEngineError(this.id, `unknown sandbox ${sandboxId}`);
|
|
134
|
+
}
|
|
135
|
+
return record;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ===========================================================================
|
|
139
|
+
// Category 1 of 10 - Wasmtime
|
|
140
|
+
// ===========================================================================
|
|
141
|
+
/**
|
|
142
|
+
* Adapter 1/10 - Wasmtime v48.0.0.
|
|
143
|
+
* Runs guest components with fuel metering for deterministic budgets and
|
|
144
|
+
* epoch interruption for wall-clock timeouts (~10% overhead, preferred over
|
|
145
|
+
* fuel for timeouts). WASI 0.3.0 gives native async; components start with
|
|
146
|
+
* deny-by-default capabilities.
|
|
147
|
+
*/
|
|
148
|
+
export class WasmtimeEngine extends BaseEngine {
|
|
149
|
+
id = 'wasmtime';
|
|
150
|
+
title = 'Wasmtime + WASI 0.3 components';
|
|
151
|
+
category = 'wasm runtime sandbox';
|
|
152
|
+
version = '48.0.0';
|
|
153
|
+
capabilities = {
|
|
154
|
+
isolation: 'wasm-sandbox',
|
|
155
|
+
snapshotting: true,
|
|
156
|
+
networkEgress: false,
|
|
157
|
+
gpu: false,
|
|
158
|
+
selfHosted: true,
|
|
159
|
+
requiresKvm: false,
|
|
160
|
+
};
|
|
161
|
+
#fuelBudget = 1_000_000;
|
|
162
|
+
#epochDeadlineMs = 5_000;
|
|
163
|
+
/** Sets the per-store fuel budget, the `--fuel` equivalent. */
|
|
164
|
+
setFuelBudget(budget) {
|
|
165
|
+
if (budget < 1)
|
|
166
|
+
throw new SandboxEngineError(this.id, 'fuel budget must be positive');
|
|
167
|
+
this.#fuelBudget = budget;
|
|
168
|
+
return this;
|
|
169
|
+
}
|
|
170
|
+
/** Sets the epoch deadline used to interrupt runaway guests. */
|
|
171
|
+
setEpochDeadline(deadlineMs) {
|
|
172
|
+
this.#epochDeadlineMs = deadlineMs;
|
|
173
|
+
return this;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Interrupt policy handed to the embedding host: epoch interruption traps
|
|
177
|
+
* the guest at the deadline with roughly 10% runtime overhead, which beats
|
|
178
|
+
* fuel accounting for wall-clock timeouts.
|
|
179
|
+
*/
|
|
180
|
+
interruptPolicy() {
|
|
181
|
+
return { deadlineMs: this.#epochDeadlineMs, mechanism: 'epoch', relativeOverhead: 0.1 };
|
|
182
|
+
}
|
|
183
|
+
/** Command line that runs a component under both guards. */
|
|
184
|
+
runCommand(componentPath) {
|
|
185
|
+
return [
|
|
186
|
+
'wasmtime',
|
|
187
|
+
'run',
|
|
188
|
+
'--fuel',
|
|
189
|
+
String(this.#fuelBudget),
|
|
190
|
+
'--wasi',
|
|
191
|
+
'async=yes',
|
|
192
|
+
componentPath,
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
get coldBootMs() {
|
|
196
|
+
return 3; // component instantiation is single-digit milliseconds
|
|
197
|
+
}
|
|
198
|
+
get execOverheadRatio() {
|
|
199
|
+
return 0.05;
|
|
200
|
+
}
|
|
201
|
+
snapshotBackend() {
|
|
202
|
+
return 'component-image';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// ===========================================================================
|
|
206
|
+
// Category 2 of 10 - gVisor
|
|
207
|
+
// ===========================================================================
|
|
208
|
+
/**
|
|
209
|
+
* Adapter 2/10 - gVisor runsc.
|
|
210
|
+
* The Sentry intercepts syscalls through the systrap platform (seccomp
|
|
211
|
+
* SECCOMP_RET_TRAP delivering SIGSYS), paying 10-30% on I/O-heavy workloads
|
|
212
|
+
* (up to 2x on syscall-bound ones). DirectFS narrows the filesystem gap;
|
|
213
|
+
* io_uring stays disabled by default for security.
|
|
214
|
+
*/
|
|
215
|
+
export class GvisorEngine extends BaseEngine {
|
|
216
|
+
id = 'gvisor';
|
|
217
|
+
title = 'gVisor runsc (systrap)';
|
|
218
|
+
category = 'user-space kernel';
|
|
219
|
+
version = 'release-20260817.0';
|
|
220
|
+
capabilities = {
|
|
221
|
+
isolation: 'syscall-interception',
|
|
222
|
+
snapshotting: false,
|
|
223
|
+
networkEgress: true,
|
|
224
|
+
gpu: false,
|
|
225
|
+
selfHosted: true,
|
|
226
|
+
requiresKvm: false,
|
|
227
|
+
};
|
|
228
|
+
#platform = 'systrap';
|
|
229
|
+
#directFs = true;
|
|
230
|
+
setPlatform(platform) {
|
|
231
|
+
this.#platform = platform;
|
|
232
|
+
return this;
|
|
233
|
+
}
|
|
234
|
+
/** daemon.json fragment selecting runsc plus the runtime flag docker uses. */
|
|
235
|
+
dockerFlags() {
|
|
236
|
+
return {
|
|
237
|
+
daemonJson: JSON.stringify({ runtimes: { runsc: { path: '/usr/bin/runsc' } } }),
|
|
238
|
+
runFlag: ['--runtime=runsc'],
|
|
239
|
+
platformFlag: ['--platform', this.#platform],
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/** DirectFS shortens the filesystem path by letting the Sentry talk to the host FD directly. */
|
|
243
|
+
get directFsEnabled() {
|
|
244
|
+
return this.#directFs;
|
|
245
|
+
}
|
|
246
|
+
/** Documented I/O overhead band relative to runc. */
|
|
247
|
+
overheadBand() {
|
|
248
|
+
return { low: 0.1, high: 0.3, syscallBoundWorst: 2.0 };
|
|
249
|
+
}
|
|
250
|
+
get coldBootMs() {
|
|
251
|
+
return 35; // Sentry startup plus first-fault handling
|
|
252
|
+
}
|
|
253
|
+
get execOverheadRatio() {
|
|
254
|
+
return this.#platform === 'systrap' ? 0.2 : 0.35;
|
|
255
|
+
}
|
|
256
|
+
snapshotBackend() {
|
|
257
|
+
throw new SandboxEngineError(this.id, 'runsc has no snapshot support');
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// ===========================================================================
|
|
261
|
+
// Category 3 of 10 - Kata Containers
|
|
262
|
+
// ===========================================================================
|
|
263
|
+
/**
|
|
264
|
+
* Adapter 3/10 - Kata Containers 4.1.0.
|
|
265
|
+
* Runtime-rs (the Rust runtime, default since 4.0; the Go runtime is
|
|
266
|
+
* deprecated and freezes at bugfix-only) drives hardware-isolated
|
|
267
|
+
* microVMs. 4.1 adds OpenVMM support, Cloud Hypervisor VM templates,
|
|
268
|
+
* configurable nested virtualization and NVSwitch passthrough via IOMMUFD.
|
|
269
|
+
*/
|
|
270
|
+
export class KataEngine extends BaseEngine {
|
|
271
|
+
id = 'kata';
|
|
272
|
+
title = 'Kata Containers runtime-rs';
|
|
273
|
+
category = 'microvm container runtime';
|
|
274
|
+
version = '4.1.0';
|
|
275
|
+
capabilities = {
|
|
276
|
+
isolation: 'container-vm',
|
|
277
|
+
snapshotting: true,
|
|
278
|
+
networkEgress: true,
|
|
279
|
+
gpu: true,
|
|
280
|
+
selfHosted: true,
|
|
281
|
+
requiresKvm: true,
|
|
282
|
+
};
|
|
283
|
+
#hypervisor = 'cloud-hypervisor';
|
|
284
|
+
setHypervisor(hypervisor) {
|
|
285
|
+
this.#hypervisor = hypervisor;
|
|
286
|
+
return this;
|
|
287
|
+
}
|
|
288
|
+
/** kata-runtime configuration fragments for the selected hypervisor. */
|
|
289
|
+
configurationToml() {
|
|
290
|
+
return [
|
|
291
|
+
'runtime = "rust"', // runtime-rs is the default since 4.0; the Go runtime is frozen
|
|
292
|
+
'enable_rootless = true',
|
|
293
|
+
`[hypervisor.${this.#hypervisor.replace('-', '_')}]`,
|
|
294
|
+
`path = "/usr/bin/${this.#hypervisor === 'openvmm' ? 'openvmm' : this.#hypervisor}"`,
|
|
295
|
+
];
|
|
296
|
+
}
|
|
297
|
+
get coldBootMs() {
|
|
298
|
+
return this.#hypervisor === 'firecracker' ? 160 : 240;
|
|
299
|
+
}
|
|
300
|
+
get execOverheadRatio() {
|
|
301
|
+
return 0.03; // near-native once the VM is up; the VM boundary is the cost
|
|
302
|
+
}
|
|
303
|
+
perSandboxOverheadMiB() {
|
|
304
|
+
return 40; // one guest kernel per container
|
|
305
|
+
}
|
|
306
|
+
snapshotBackend() {
|
|
307
|
+
return 'criu';
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// ===========================================================================
|
|
311
|
+
// Category 4 of 10 - Cloud Hypervisor
|
|
312
|
+
// ===========================================================================
|
|
313
|
+
/**
|
|
314
|
+
* Adapter 4/10 - Cloud Hypervisor v53.0.
|
|
315
|
+
* Rust VMM built from rust-vmm crates (KVM and MSHV backends). v53 ships an
|
|
316
|
+
* offloaded snapshot/restore daemon built on userfaultfd plus vhost-user,
|
|
317
|
+
* migratable VFIO devices on the same host (for example mlx5_vfio_pci) and
|
|
318
|
+
* experimental vfio-user devices through --user-device socket=<path>.
|
|
319
|
+
*/
|
|
320
|
+
export class CloudHypervisorEngine extends BaseEngine {
|
|
321
|
+
id = 'cloud-hypervisor';
|
|
322
|
+
title = 'Cloud Hypervisor (rust-vmm)';
|
|
323
|
+
category = 'rust VMM';
|
|
324
|
+
version = '53.0';
|
|
325
|
+
capabilities = {
|
|
326
|
+
isolation: 'microvm',
|
|
327
|
+
snapshotting: true,
|
|
328
|
+
networkEgress: true,
|
|
329
|
+
gpu: true,
|
|
330
|
+
selfHosted: true,
|
|
331
|
+
requiresKvm: true,
|
|
332
|
+
};
|
|
333
|
+
/** Command line for a software-isolated guest with the snapshot daemon. */
|
|
334
|
+
launchCommand(cpus, memoryMb) {
|
|
335
|
+
return [
|
|
336
|
+
'cloud-hypervisor',
|
|
337
|
+
'--cpus',
|
|
338
|
+
`boot=${cpus}`,
|
|
339
|
+
'--memory',
|
|
340
|
+
`size=${memoryMb}M`,
|
|
341
|
+
'--snapshot',
|
|
342
|
+
'/var/lib/vhe/ch-snap',
|
|
343
|
+
];
|
|
344
|
+
}
|
|
345
|
+
/** vfio-user device attach command (experimental in v53). */
|
|
346
|
+
attachUserDevice(socketPath) {
|
|
347
|
+
return ['ch-remote', 'add-user-device', `socket=${socketPath}`];
|
|
348
|
+
}
|
|
349
|
+
get coldBootMs() {
|
|
350
|
+
return 90;
|
|
351
|
+
}
|
|
352
|
+
get execOverheadRatio() {
|
|
353
|
+
return 0.02;
|
|
354
|
+
}
|
|
355
|
+
perSandboxOverheadMiB() {
|
|
356
|
+
return 12;
|
|
357
|
+
}
|
|
358
|
+
snapshotBackend() {
|
|
359
|
+
return 'ch-offloaded';
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// ===========================================================================
|
|
363
|
+
// Category 5 of 10 - WebContainers
|
|
364
|
+
// ===========================================================================
|
|
365
|
+
/**
|
|
366
|
+
* Adapter 5/10 - WebContainers (StackBlitz).
|
|
367
|
+
* Runs Node.js and npm entirely inside the browser sandbox over WebAssembly;
|
|
368
|
+
* boot is measured in milliseconds and the host contributes zero server
|
|
369
|
+
* footprint. The API is a commercial GA product; this adapter models the
|
|
370
|
+
* client-side contract (boot, command execution, teardown) for parity with
|
|
371
|
+
* server-side engines.
|
|
372
|
+
*/
|
|
373
|
+
export class WebContainersEngine extends BaseEngine {
|
|
374
|
+
id = 'webcontainers';
|
|
375
|
+
title = 'WebContainers (Node.js in the browser)';
|
|
376
|
+
category = 'browser runtime';
|
|
377
|
+
version = 'ga';
|
|
378
|
+
capabilities = {
|
|
379
|
+
isolation: 'browser',
|
|
380
|
+
snapshotting: false,
|
|
381
|
+
networkEgress: false,
|
|
382
|
+
gpu: false,
|
|
383
|
+
selfHosted: false,
|
|
384
|
+
requiresKvm: false,
|
|
385
|
+
};
|
|
386
|
+
/** Client bootstrap snippet the host page evaluates. */
|
|
387
|
+
bootstrapSnippet() {
|
|
388
|
+
return 'const wc = await WebContainer.boot({ coep: "credentialless" });';
|
|
389
|
+
}
|
|
390
|
+
get coldBootMs() {
|
|
391
|
+
return 15;
|
|
392
|
+
}
|
|
393
|
+
get execOverheadRatio() {
|
|
394
|
+
return 0.15; // in-browser process emulation
|
|
395
|
+
}
|
|
396
|
+
perSandboxOverheadMiB() {
|
|
397
|
+
return 0; // memory lives in the client tab, not on the engine host
|
|
398
|
+
}
|
|
399
|
+
snapshotBackend() {
|
|
400
|
+
throw new SandboxEngineError(this.id, 'browser sandboxes cannot be snapshotted server-side');
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// ===========================================================================
|
|
404
|
+
// Category 6 of 10 - Daytona
|
|
405
|
+
// ===========================================================================
|
|
406
|
+
/**
|
|
407
|
+
* Adapter 6/10 - Daytona.
|
|
408
|
+
* Creates stateful sandboxes in ~90ms, exposes MCP (Model Context Protocol)
|
|
409
|
+
* servers for agent integration, and can be self-hosted from the open-source
|
|
410
|
+
* core (the SaaS adds managed control planes and $200 of free compute).
|
|
411
|
+
*/
|
|
412
|
+
export class DaytonaEngine extends BaseEngine {
|
|
413
|
+
id = 'daytona';
|
|
414
|
+
title = 'Daytona sandboxes';
|
|
415
|
+
category = 'self-hosted sandbox platform';
|
|
416
|
+
version = 'oss+saas';
|
|
417
|
+
capabilities = {
|
|
418
|
+
isolation: 'cloud-sandbox',
|
|
419
|
+
snapshotting: true,
|
|
420
|
+
networkEgress: true,
|
|
421
|
+
gpu: false,
|
|
422
|
+
selfHosted: true,
|
|
423
|
+
requiresKvm: false,
|
|
424
|
+
};
|
|
425
|
+
#mcpEnabled = true;
|
|
426
|
+
#region = 'local';
|
|
427
|
+
/** MCP server descriptor published for agent discovery. */
|
|
428
|
+
mcpDescriptor() {
|
|
429
|
+
return {
|
|
430
|
+
name: 'vhe-daytona',
|
|
431
|
+
transport: 'stdio',
|
|
432
|
+
tools: this.#mcpEnabled
|
|
433
|
+
? ['sandbox.create', 'sandbox.exec', 'sandbox.pause', 'sandbox.resume']
|
|
434
|
+
: [],
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
setRegion(region) {
|
|
438
|
+
this.#region = region;
|
|
439
|
+
return this;
|
|
440
|
+
}
|
|
441
|
+
get region() {
|
|
442
|
+
return this.#region;
|
|
443
|
+
}
|
|
444
|
+
get coldBootMs() {
|
|
445
|
+
return 90;
|
|
446
|
+
}
|
|
447
|
+
get execOverheadRatio() {
|
|
448
|
+
return 0.08;
|
|
449
|
+
}
|
|
450
|
+
snapshotBackend() {
|
|
451
|
+
return 'state-pause';
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// ===========================================================================
|
|
455
|
+
// Category 7 of 10 - Modal
|
|
456
|
+
// ===========================================================================
|
|
457
|
+
/**
|
|
458
|
+
* Adapter 7/10 - Modal.
|
|
459
|
+
* Serverless container platform built for AI workloads: 100k+ concurrent
|
|
460
|
+
* sandboxes per account, sub-second scheduling, elastic GPUs and sessions
|
|
461
|
+
* up to 24 hours. Python-first (JavaScript is secondary), with strong
|
|
462
|
+
* cold-start behavior for custom images.
|
|
463
|
+
*/
|
|
464
|
+
export class ModalEngine extends BaseEngine {
|
|
465
|
+
id = 'modal';
|
|
466
|
+
title = 'Modal serverless sandboxes';
|
|
467
|
+
category = 'serverless container platform';
|
|
468
|
+
version = 'saas';
|
|
469
|
+
capabilities = {
|
|
470
|
+
isolation: 'cloud-sandbox',
|
|
471
|
+
snapshotting: true,
|
|
472
|
+
networkEgress: true,
|
|
473
|
+
gpu: true,
|
|
474
|
+
selfHosted: false,
|
|
475
|
+
requiresKvm: false,
|
|
476
|
+
};
|
|
477
|
+
#maxConcurrency = 100_000;
|
|
478
|
+
/** Concurrency ceiling the platform documents per account. */
|
|
479
|
+
get concurrencyCeiling() {
|
|
480
|
+
return this.#maxConcurrency;
|
|
481
|
+
}
|
|
482
|
+
/** Scheduling latency band: warm functions resume in milliseconds. */
|
|
483
|
+
schedulingBand() {
|
|
484
|
+
return { warmMs: 5, coldMs: 900, maxSessionHours: 24 };
|
|
485
|
+
}
|
|
486
|
+
get coldBootMs() {
|
|
487
|
+
return 250;
|
|
488
|
+
}
|
|
489
|
+
get execOverheadRatio() {
|
|
490
|
+
return 0.02;
|
|
491
|
+
}
|
|
492
|
+
snapshotBackend() {
|
|
493
|
+
return 'state-pause';
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
// ===========================================================================
|
|
497
|
+
// Category 8 of 10 - Fly.io Machines
|
|
498
|
+
// ===========================================================================
|
|
499
|
+
/**
|
|
500
|
+
* Adapter 8/10 - Fly.io Machines.
|
|
501
|
+
* Firecracker microVMs (the same foundation as AWS Lambda and Fargate)
|
|
502
|
+
* started and stopped through a global API across roughly 35 regions.
|
|
503
|
+
* Machines boot sub-second, snapshot fast and are addressable by private
|
|
504
|
+
* network, which makes them a natural multi-region sandbox backend.
|
|
505
|
+
*/
|
|
506
|
+
export class FlyMachinesEngine extends BaseEngine {
|
|
507
|
+
id = 'fly-machines';
|
|
508
|
+
title = 'Fly.io Machines (global Firecracker)';
|
|
509
|
+
category = 'global microVM API';
|
|
510
|
+
version = 'saas';
|
|
511
|
+
capabilities = {
|
|
512
|
+
isolation: 'microvm',
|
|
513
|
+
snapshotting: true,
|
|
514
|
+
networkEgress: true,
|
|
515
|
+
gpu: false,
|
|
516
|
+
selfHosted: false,
|
|
517
|
+
requiresKvm: false,
|
|
518
|
+
};
|
|
519
|
+
#primaryRegion = 'gru';
|
|
520
|
+
setPrimaryRegion(region) {
|
|
521
|
+
this.#primaryRegion = region;
|
|
522
|
+
return this;
|
|
523
|
+
}
|
|
524
|
+
/** Region set the API can place machines in (2026 count: about 35). */
|
|
525
|
+
regionCount() {
|
|
526
|
+
return 35;
|
|
527
|
+
}
|
|
528
|
+
get primaryRegion() {
|
|
529
|
+
return this.#primaryRegion;
|
|
530
|
+
}
|
|
531
|
+
get coldBootMs() {
|
|
532
|
+
return 300;
|
|
533
|
+
}
|
|
534
|
+
get execOverheadRatio() {
|
|
535
|
+
return 0.01;
|
|
536
|
+
}
|
|
537
|
+
perSandboxOverheadMiB() {
|
|
538
|
+
return 5; // Firecracker per-VM overhead stays below 5 MiB
|
|
539
|
+
}
|
|
540
|
+
snapshotBackend() {
|
|
541
|
+
return 'firecracker-file';
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
/** Verified facts for each member of the E2B family. */
|
|
545
|
+
export const e2bFamilyFacts = {
|
|
546
|
+
e2b: {
|
|
547
|
+
title: 'E2B (Firecracker, SDK Apache-2.0)',
|
|
548
|
+
coldBootMs: 150,
|
|
549
|
+
snapshot: true,
|
|
550
|
+
note: 'sub-200ms cold start via Firecracker snapshot restore with UFFD; sessions cap at 24h',
|
|
551
|
+
},
|
|
552
|
+
morph: {
|
|
553
|
+
title: 'Morph (agent-parallel VMs)',
|
|
554
|
+
coldBootMs: 250,
|
|
555
|
+
snapshot: true,
|
|
556
|
+
note: 'forks a VM in ~250ms so agents can explore many parallel paths',
|
|
557
|
+
},
|
|
558
|
+
cognitora: {
|
|
559
|
+
title: 'Cognitora (AI code execution)',
|
|
560
|
+
coldBootMs: 220,
|
|
561
|
+
snapshot: false,
|
|
562
|
+
note: 'AI-first code execution platform; smaller footprint than E2B',
|
|
563
|
+
},
|
|
564
|
+
'vercel-sandbox': {
|
|
565
|
+
title: 'Vercel Sandbox (GA 2026-01-30)',
|
|
566
|
+
coldBootMs: 200,
|
|
567
|
+
snapshot: false,
|
|
568
|
+
note: 'Firecracker-based; backed by a $1M HackerOne challenge announced August 2026',
|
|
569
|
+
},
|
|
570
|
+
};
|
|
571
|
+
/**
|
|
572
|
+
* Adapter 9/10 - the E2B family.
|
|
573
|
+
* One adapter implementation covers E2B and its direct competitors; the
|
|
574
|
+
* variant selects documented cold-start, snapshot support and positioning
|
|
575
|
+
* so comparisons stay apples-to-apples.
|
|
576
|
+
*/
|
|
577
|
+
export class E2bFamilyEngine extends BaseEngine {
|
|
578
|
+
variant;
|
|
579
|
+
constructor(variant = 'e2b') {
|
|
580
|
+
super();
|
|
581
|
+
this.variant = variant;
|
|
582
|
+
}
|
|
583
|
+
get id() {
|
|
584
|
+
return this.variant;
|
|
585
|
+
}
|
|
586
|
+
get title() {
|
|
587
|
+
return e2bFamilyFacts[this.variant].title;
|
|
588
|
+
}
|
|
589
|
+
category = 'AI-first sandbox cloud';
|
|
590
|
+
version = 'saas';
|
|
591
|
+
get capabilities() {
|
|
592
|
+
return {
|
|
593
|
+
isolation: 'cloud-sandbox',
|
|
594
|
+
snapshotting: e2bFamilyFacts[this.variant].snapshot,
|
|
595
|
+
networkEgress: true,
|
|
596
|
+
gpu: false,
|
|
597
|
+
selfHosted: false,
|
|
598
|
+
requiresKvm: false,
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
positioning() {
|
|
602
|
+
return e2bFamilyFacts[this.variant].note;
|
|
603
|
+
}
|
|
604
|
+
get coldBootMs() {
|
|
605
|
+
return e2bFamilyFacts[this.variant].coldBootMs;
|
|
606
|
+
}
|
|
607
|
+
get execOverheadRatio() {
|
|
608
|
+
return 0.04;
|
|
609
|
+
}
|
|
610
|
+
perSandboxOverheadMiB() {
|
|
611
|
+
return 5; // all variants run on Firecracker-class microVMs
|
|
612
|
+
}
|
|
613
|
+
snapshotBackend() {
|
|
614
|
+
if (!e2bFamilyFacts[this.variant].snapshot) {
|
|
615
|
+
throw new SandboxEngineError(this.id, `${this.variant} does not expose snapshots`);
|
|
616
|
+
}
|
|
617
|
+
return 'firecracker-uffd';
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
// ===========================================================================
|
|
621
|
+
// Category 10 of 10 - Apple Containers
|
|
622
|
+
// ===========================================================================
|
|
623
|
+
/**
|
|
624
|
+
* Adapter 10/10 - Apple Containers 1.2.2.
|
|
625
|
+
* Swift open-source project running each Linux container inside a lightweight
|
|
626
|
+
* microVM optimized for Apple Silicon; boot lands under one second. WWDC26
|
|
627
|
+
* (2026-06-08) added "container machines" - persistent lightweight Linux
|
|
628
|
+
* environments configured through TOML.
|
|
629
|
+
*/
|
|
630
|
+
export class AppleContainersEngine extends BaseEngine {
|
|
631
|
+
id = 'apple-containers';
|
|
632
|
+
title = 'Apple Containers (Swift microVMs on macOS)';
|
|
633
|
+
category = 'macOS container runtime';
|
|
634
|
+
version = '1.2.2';
|
|
635
|
+
capabilities = {
|
|
636
|
+
isolation: 'container-vm',
|
|
637
|
+
snapshotting: false,
|
|
638
|
+
networkEgress: true,
|
|
639
|
+
gpu: false,
|
|
640
|
+
selfHosted: true,
|
|
641
|
+
requiresKvm: false,
|
|
642
|
+
};
|
|
643
|
+
#machineMode = false;
|
|
644
|
+
/** Enables WWDC26 container machines (persistent Linux environments). */
|
|
645
|
+
useContainerMachines(enabled) {
|
|
646
|
+
this.#machineMode = enabled;
|
|
647
|
+
return this;
|
|
648
|
+
}
|
|
649
|
+
/** CLI invocation plus TOML config path when machine mode is active. */
|
|
650
|
+
runCommand(image) {
|
|
651
|
+
const base = ['container', 'run', '--pull', image];
|
|
652
|
+
return this.#machineMode ? [...base, '--config', '/etc/vhe/container-machine.toml'] : base;
|
|
653
|
+
}
|
|
654
|
+
get coldBootMs() {
|
|
655
|
+
return this.#machineMode ? 900 : 600; // <1s boot on Apple Silicon
|
|
656
|
+
}
|
|
657
|
+
get execOverheadRatio() {
|
|
658
|
+
return 0.05;
|
|
659
|
+
}
|
|
660
|
+
perSandboxOverheadMiB() {
|
|
661
|
+
return 20;
|
|
662
|
+
}
|
|
663
|
+
snapshotBackend() {
|
|
664
|
+
throw new SandboxEngineError(this.id, 'snapshotting is not exposed by container 1.2.2');
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Factory registry: hosts register constructors, create engines lazily and
|
|
669
|
+
* resolve aliases (for example "runsc" resolves to gvisor). Unknown ids
|
|
670
|
+
* produce a helpful error listing the closest known ids.
|
|
671
|
+
*/
|
|
672
|
+
export class EngineRegistry {
|
|
673
|
+
#factories = new Map();
|
|
674
|
+
#aliases = new Map();
|
|
675
|
+
#instances = new Map();
|
|
676
|
+
register(id, factory, aliases = []) {
|
|
677
|
+
this.#factories.set(id, factory);
|
|
678
|
+
for (const alias of aliases) {
|
|
679
|
+
this.#aliases.set(alias, id);
|
|
680
|
+
}
|
|
681
|
+
return this;
|
|
682
|
+
}
|
|
683
|
+
/** Creates (or reuses) the engine registered under id or one of its aliases. */
|
|
684
|
+
create(id) {
|
|
685
|
+
const resolved = this.#aliases.get(id) ?? id;
|
|
686
|
+
const factory = this.#factories.get(resolved);
|
|
687
|
+
if (factory === undefined) {
|
|
688
|
+
const known = [...this.#factories.keys()];
|
|
689
|
+
const suggestion = known.find((k) => k.includes(resolved) || resolved.includes(k));
|
|
690
|
+
const hint = suggestion === undefined
|
|
691
|
+
? `known engines: ${known.join(', ')}`
|
|
692
|
+
: `did you mean "${suggestion}"?`;
|
|
693
|
+
throw new SandboxEngineError('registry', `unknown engine "${id}"; ${hint}`);
|
|
694
|
+
}
|
|
695
|
+
const existing = this.#instances.get(resolved);
|
|
696
|
+
if (existing !== undefined) {
|
|
697
|
+
return existing;
|
|
698
|
+
}
|
|
699
|
+
try {
|
|
700
|
+
const engine = factory();
|
|
701
|
+
this.#instances.set(resolved, engine);
|
|
702
|
+
return engine;
|
|
703
|
+
}
|
|
704
|
+
catch (err) {
|
|
705
|
+
throw new SandboxEngineError(resolved, `factory failed: ${String(err)}`);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
list() {
|
|
709
|
+
return [...this.#factories.entries()].map(([id, factory]) => {
|
|
710
|
+
const engine = factory();
|
|
711
|
+
return {
|
|
712
|
+
id,
|
|
713
|
+
title: engine.title,
|
|
714
|
+
category: engine.category,
|
|
715
|
+
version: engine.version,
|
|
716
|
+
snapshotting: engine.capabilities.snapshotting,
|
|
717
|
+
};
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
get size() {
|
|
721
|
+
return this.#factories.size;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
/** Registry pre-loaded with all ten engine categories. */
|
|
725
|
+
export function createDefaultEngineRegistry() {
|
|
726
|
+
return new EngineRegistry()
|
|
727
|
+
.register('wasmtime', () => new WasmtimeEngine(), ['wasm', 'wasi'])
|
|
728
|
+
.register('gvisor', () => new GvisorEngine(), ['runsc'])
|
|
729
|
+
.register('kata', () => new KataEngine(), ['kata-containers'])
|
|
730
|
+
.register('cloud-hypervisor', () => new CloudHypervisorEngine(), ['ch', 'cloudhypervisor'])
|
|
731
|
+
.register('webcontainers', () => new WebContainersEngine(), ['stackblitz'])
|
|
732
|
+
.register('daytona', () => new DaytonaEngine(), [])
|
|
733
|
+
.register('modal', () => new ModalEngine(), [])
|
|
734
|
+
.register('fly-machines', () => new FlyMachinesEngine(), ['fly', 'flyio'])
|
|
735
|
+
.register('e2b', () => new E2bFamilyEngine('e2b'), ['e2b-dev'])
|
|
736
|
+
.register('morph', () => new E2bFamilyEngine('morph'), ['morphllm'])
|
|
737
|
+
.register('cognitora', () => new E2bFamilyEngine('cognitora'), [])
|
|
738
|
+
.register('vercel-sandbox', () => new E2bFamilyEngine('vercel-sandbox'), ['vercel'])
|
|
739
|
+
.register('apple-containers', () => new AppleContainersEngine(), ['tupper', 'apple']);
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Comparison matrix with the data verified on 2026-08-22. Boot times are the
|
|
743
|
+
* documented figures each adapter models; overhead strings quote the
|
|
744
|
+
* measured bands from the engine documentation.
|
|
745
|
+
*/
|
|
746
|
+
export const comparisonMatrix = [
|
|
747
|
+
{
|
|
748
|
+
engine: 'wasmtime',
|
|
749
|
+
category: 'wasm runtime',
|
|
750
|
+
version: 'v48.0.0',
|
|
751
|
+
bootMs: 3,
|
|
752
|
+
overhead: 'epoch guard ~10%; near-native execution',
|
|
753
|
+
isolation: 'wasm sandbox, deny-by-default components',
|
|
754
|
+
snapshot: 'component image',
|
|
755
|
+
hosting: 'self-hosted (library)',
|
|
756
|
+
standout: 'fuel metering + epoch interruption, WASI 0.3 async',
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
engine: 'gvisor',
|
|
760
|
+
category: 'user-space kernel',
|
|
761
|
+
version: 'release-20260817.0',
|
|
762
|
+
bootMs: 35,
|
|
763
|
+
overhead: '10-30% I/O; up to 2x syscall-bound',
|
|
764
|
+
isolation: 'sentry syscall interception (systrap)',
|
|
765
|
+
snapshot: 'none',
|
|
766
|
+
hosting: 'self-hosted (OCI runtime)',
|
|
767
|
+
standout: 'DirectFS; runs unmodified OCI images',
|
|
768
|
+
},
|
|
769
|
+
{
|
|
770
|
+
engine: 'kata',
|
|
771
|
+
category: 'microvm container runtime',
|
|
772
|
+
version: '4.1.0',
|
|
773
|
+
bootMs: 240,
|
|
774
|
+
overhead: 'near-native after boot',
|
|
775
|
+
isolation: 'hardware-isolated microVM per container',
|
|
776
|
+
snapshot: 'criu + hypervisor snapshots',
|
|
777
|
+
hosting: 'self-hosted (Kubernetes CRI)',
|
|
778
|
+
standout: 'runtime-rs Rust default, OpenVMM support',
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
engine: 'cloud-hypervisor',
|
|
782
|
+
category: 'rust VMM',
|
|
783
|
+
version: 'v53.0',
|
|
784
|
+
bootMs: 90,
|
|
785
|
+
overhead: 'near-native',
|
|
786
|
+
isolation: 'KVM/MSHV microVM',
|
|
787
|
+
snapshot: 'offloaded userfaultfd daemon',
|
|
788
|
+
hosting: 'self-hosted (rust-vmm crates)',
|
|
789
|
+
standout: 'vfio-user devices, migratable VFIO same-host',
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
engine: 'webcontainers',
|
|
793
|
+
category: 'browser runtime',
|
|
794
|
+
version: 'ga api',
|
|
795
|
+
bootMs: 15,
|
|
796
|
+
overhead: 'in-browser process emulation',
|
|
797
|
+
isolation: 'browser sandbox (same-origin policies)',
|
|
798
|
+
snapshot: 'none',
|
|
799
|
+
hosting: 'client-side (commercial API)',
|
|
800
|
+
standout: 'Node.js + npm with zero server footprint',
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
engine: 'daytona',
|
|
804
|
+
category: 'self-hosted sandbox platform',
|
|
805
|
+
version: 'oss core + saas',
|
|
806
|
+
bootMs: 90,
|
|
807
|
+
overhead: 'light container layer',
|
|
808
|
+
isolation: 'container sandbox, stateful workspaces',
|
|
809
|
+
snapshot: 'pause/resume state',
|
|
810
|
+
hosting: 'self-hosted or saas',
|
|
811
|
+
standout: 'MCP integration for agents, $200 free compute',
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
engine: 'modal',
|
|
815
|
+
category: 'serverless containers',
|
|
816
|
+
version: 'saas',
|
|
817
|
+
bootMs: 250,
|
|
818
|
+
overhead: 'scheduling layer, near-native exec',
|
|
819
|
+
isolation: 'cloud sandbox, elastic GPUs',
|
|
820
|
+
snapshot: 'warm pool snapshots',
|
|
821
|
+
hosting: 'saas only',
|
|
822
|
+
standout: '100k+ concurrent sandboxes, 24h sessions',
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
engine: 'fly-machines',
|
|
826
|
+
category: 'global microVM API',
|
|
827
|
+
version: 'saas',
|
|
828
|
+
bootMs: 300,
|
|
829
|
+
overhead: 'near-native (Firecracker)',
|
|
830
|
+
isolation: 'Firecracker microVM, private network',
|
|
831
|
+
snapshot: 'firecracker snapshots',
|
|
832
|
+
hosting: 'saas (~35 regions)',
|
|
833
|
+
standout: 'sub-second start/stop through a global API',
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
engine: 'e2b',
|
|
837
|
+
category: 'AI-first sandbox cloud',
|
|
838
|
+
version: 'sdk apache-2.0',
|
|
839
|
+
bootMs: 150,
|
|
840
|
+
overhead: 'near-native (Firecracker + UFFD restore)',
|
|
841
|
+
isolation: 'microVM sandbox for agent code',
|
|
842
|
+
snapshot: 'uffd snapshot restore',
|
|
843
|
+
hosting: 'saas (self-host reference in e2b-dev/infra)',
|
|
844
|
+
standout: 'sub-200ms cold start, the benchmark the VHE targets',
|
|
845
|
+
},
|
|
846
|
+
{
|
|
847
|
+
engine: 'morph',
|
|
848
|
+
category: 'AI-first sandbox cloud',
|
|
849
|
+
version: 'saas',
|
|
850
|
+
bootMs: 250,
|
|
851
|
+
overhead: 'near-native',
|
|
852
|
+
isolation: 'forkable VM per agent path',
|
|
853
|
+
snapshot: 'vm fork',
|
|
854
|
+
hosting: 'saas',
|
|
855
|
+
standout: 'forks VMs in ~250ms for parallel agent exploration',
|
|
856
|
+
},
|
|
857
|
+
{
|
|
858
|
+
engine: 'vercel-sandbox',
|
|
859
|
+
category: 'AI-first sandbox cloud',
|
|
860
|
+
version: 'ga 2026-01-30',
|
|
861
|
+
bootMs: 200,
|
|
862
|
+
overhead: 'near-native (Firecracker)',
|
|
863
|
+
isolation: 'microVM sandbox',
|
|
864
|
+
snapshot: 'none documented',
|
|
865
|
+
hosting: 'saas',
|
|
866
|
+
standout: '$1M HackerOne challenge (August 2026) backs its security posture',
|
|
867
|
+
},
|
|
868
|
+
{
|
|
869
|
+
engine: 'apple-containers',
|
|
870
|
+
category: 'macOS container runtime',
|
|
871
|
+
version: '1.2.2',
|
|
872
|
+
bootMs: 600,
|
|
873
|
+
overhead: 'near-native on Apple Silicon',
|
|
874
|
+
isolation: 'lightweight microVM per container',
|
|
875
|
+
snapshot: 'none',
|
|
876
|
+
hosting: 'self-hosted (macOS)',
|
|
877
|
+
standout: 'WWDC26 container machines with TOML config, <1s boot',
|
|
878
|
+
},
|
|
879
|
+
];
|
|
880
|
+
/** Renders the comparison matrix as a markdown table for docs and CI logs. */
|
|
881
|
+
export function renderComparisonTable(matrix = comparisonMatrix) {
|
|
882
|
+
const header = '| engine | category | version | boot ms | overhead | isolation | snapshot | hosting | standout |';
|
|
883
|
+
const divider = '|---|---|---|---|---|---|---|---|---|';
|
|
884
|
+
const rows = matrix.map((r) => `| ${r.engine} | ${r.category} | ${r.version} | ${r.bootMs} | ${r.overhead} | ${r.isolation} | ${r.snapshot} | ${r.hosting} | ${r.standout} |`);
|
|
885
|
+
return [header, divider, ...rows].join('\n');
|
|
886
|
+
}
|
|
887
|
+
/**
|
|
888
|
+
* Scores every registered engine against the criteria and returns them
|
|
889
|
+
* ranked with a rationale. Isolation strength ranks hardware microVMs and
|
|
890
|
+
* wasm above syscall interception and browser sandboxes; boot latency
|
|
891
|
+
* inversely follows the documented cold-start figure.
|
|
892
|
+
*/
|
|
893
|
+
export function selectEngine(registry, criteria, matrix = comparisonMatrix) {
|
|
894
|
+
const isolationRank = {
|
|
895
|
+
microvm: 5,
|
|
896
|
+
'container-vm': 5,
|
|
897
|
+
'wasm-sandbox': 4,
|
|
898
|
+
'syscall-interception': 3,
|
|
899
|
+
'cloud-sandbox': 3,
|
|
900
|
+
browser: 2,
|
|
901
|
+
};
|
|
902
|
+
const rows = [];
|
|
903
|
+
for (const row of matrix) {
|
|
904
|
+
try {
|
|
905
|
+
const engine = registry.create(row.engine);
|
|
906
|
+
const caps = engine.capabilities;
|
|
907
|
+
const reasons = [];
|
|
908
|
+
let score = 0;
|
|
909
|
+
const bootScore = (100 / Math.max(1, row.bootMs)) * 50;
|
|
910
|
+
score += criteria.bootLatency * bootScore * 0.1;
|
|
911
|
+
reasons.push(`boot ${row.bootMs}ms`);
|
|
912
|
+
const isoScore = isolationRank[caps.isolation];
|
|
913
|
+
score += criteria.isolation * isoScore * 2;
|
|
914
|
+
reasons.push(`isolation ${caps.isolation}`);
|
|
915
|
+
if (criteria.needSnapshot && caps.snapshotting) {
|
|
916
|
+
score += 10;
|
|
917
|
+
reasons.push('snapshots available');
|
|
918
|
+
}
|
|
919
|
+
else if (criteria.needSnapshot) {
|
|
920
|
+
score -= 15;
|
|
921
|
+
reasons.push('no snapshots');
|
|
922
|
+
}
|
|
923
|
+
if (criteria.needGpu && caps.gpu) {
|
|
924
|
+
score += 10;
|
|
925
|
+
reasons.push('gpu passthrough');
|
|
926
|
+
}
|
|
927
|
+
else if (criteria.needGpu) {
|
|
928
|
+
score -= 10;
|
|
929
|
+
reasons.push('no gpu');
|
|
930
|
+
}
|
|
931
|
+
if (criteria.needSelfHosted && caps.selfHosted) {
|
|
932
|
+
score += 10;
|
|
933
|
+
reasons.push('self-hosted');
|
|
934
|
+
}
|
|
935
|
+
else if (criteria.needSelfHosted) {
|
|
936
|
+
score -= 20;
|
|
937
|
+
reasons.push('saas only');
|
|
938
|
+
}
|
|
939
|
+
rows.push({
|
|
940
|
+
engine: row.engine,
|
|
941
|
+
score: Number(score.toFixed(2)),
|
|
942
|
+
rationale: reasons.join('; '),
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
catch {
|
|
946
|
+
// engines the registry cannot instantiate are skipped from ranking
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
return rows.sort((a, b) => b.score - a.score);
|
|
950
|
+
}
|
|
951
|
+
//# sourceMappingURL=alternatives.js.map
|