@wenathlan/saddle 2.0.154 → 2.0.159
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 +167 -1334
- package/README.md +59 -60
- package/biome.jsonc +3 -3
- package/browser.ts +482 -0
- package/cli.ts +274 -0
- package/distribution.ts +731 -0
- package/docker.config +29 -8
- package/docs/{architecture.1.8.19.mmd → architecture1819.md} +6 -0
- package/docs/artifactavailability.md +2 -2
- package/docs/browser.md +18 -1
- package/docs/{containerplatforms.2.1.0.md → containerplatforms210.md} +1 -1
- package/docs/{documentmap.1.8.12.md → documentmap1812.md} +1 -1
- package/docs/extension.md +13 -2
- package/docs/features.md +5 -0
- package/docs/libraryapi.md +1 -1
- package/docs/{ninety.modalities.md → ninetymodalities.md} +87 -4
- package/docs/{planning.ninety.md → planningninety.md} +6 -6
- package/docs/{releasenotes.1.8.13.md → releasenotes1813.md} +2 -2
- package/docs/{releasenotes.1.8.14.md → releasenotes1814.md} +1 -1
- package/docs/{repo.synthesis.1.8.16.md → reposynthesis1816.md} +1 -1
- package/docs/todo.md +2 -2
- package/docs/{todo.1.8.15.md → todo1815.md} +1 -1
- package/docs/{todo.1.8.16.md → todo1816.md} +5 -5
- package/execution.ts +677 -0
- package/foundation.ts +314 -0
- package/index.ts +36 -34
- package/isolation.ts +84 -0
- package/modalityregistry.ts +189 -145
- package/modes.ts +170 -0
- package/mttg.config +1 -1
- package/orchestrator.ts +49 -15
- package/package.json +105 -89
- package/qemu.config +2 -2
- package/sandbox.ts +3279 -0
- package/scheduler.ts +1 -1
- package/server.ts +52 -0
- package/tsconfig.json +12 -13
- package/virtual.ts +7528 -0
- package/workloadlaw.ts +293 -0
- package/dist/App.d.ts +0 -5
- package/dist/App.js +0 -52
- package/dist/Sol/Sol.d.ts +0 -3
- package/dist/Sol/Sol.js +0 -46
- package/dist/Sol/agentbrowser/agentbrowser.d.ts +0 -9
- package/dist/Sol/agentbrowser/agentbrowser.js +0 -121
- package/dist/Sol/architecture/architecture.d.ts +0 -9
- package/dist/Sol/architecture/architecture.js +0 -93
- package/dist/Sol/compute/compute.d.ts +0 -9
- package/dist/Sol/compute/compute.js +0 -22
- package/dist/Sol/console/console.d.ts +0 -15
- package/dist/Sol/console/console.js +0 -292
- package/dist/Sol/dashboard/dashboard.d.ts +0 -10
- package/dist/Sol/dashboard/dashboard.js +0 -181
- package/dist/Sol/docs/docs.d.ts +0 -9
- package/dist/Sol/docs/docs.js +0 -28
- package/dist/Sol/home/home.d.ts +0 -35
- package/dist/Sol/home/home.js +0 -239
- package/dist/Sol/integrations/integrations.d.ts +0 -9
- package/dist/Sol/integrations/integrations.js +0 -83
- package/dist/Sol/intro/intro.d.ts +0 -7
- package/dist/Sol/intro/intro.js +0 -102
- package/dist/Sol/login/login.d.ts +0 -16
- package/dist/Sol/login/login.js +0 -49
- package/dist/Sol/notfound/notfound.d.ts +0 -9
- package/dist/Sol/notfound/notfound.js +0 -15
- package/dist/Sol/onboarding/onboarding.d.ts +0 -25
- package/dist/Sol/onboarding/onboarding.js +0 -60
- package/dist/Sol/playground/playground.d.ts +0 -9
- package/dist/Sol/playground/playground.js +0 -127
- package/dist/Sol/register/register.d.ts +0 -16
- package/dist/Sol/register/register.js +0 -193
- package/dist/Sol/shell/Shell.d.ts +0 -124
- package/dist/Sol/shell/Shell.js +0 -335
- package/dist/Sol/wingets/ComputeBootladder.d.ts +0 -6
- package/dist/Sol/wingets/ComputeBootladder.js +0 -71
- package/dist/Sol/wingets/ComputeModalitycatalog.d.ts +0 -7
- package/dist/Sol/wingets/ComputeModalitycatalog.js +0 -71
- package/dist/Sol/wingets/ConsoleApibadge.d.ts +0 -7
- package/dist/Sol/wingets/ConsoleApibadge.js +0 -5
- package/dist/Sol/wingets/ConsoleEdgelaw.d.ts +0 -6
- package/dist/Sol/wingets/ConsoleEdgelaw.js +0 -36
- package/dist/Sol/wingets/ConsoleEventstimeline.d.ts +0 -19
- package/dist/Sol/wingets/ConsoleEventstimeline.js +0 -12
- package/dist/Sol/wingets/ConsoleSnapshotcontrols.d.ts +0 -8
- package/dist/Sol/wingets/ConsoleSnapshotcontrols.js +0 -8
- package/dist/Sol/wingets/ConsoleSpecpanel.d.ts +0 -21
- package/dist/Sol/wingets/ConsoleSpecpanel.js +0 -75
- package/dist/Sol/wingets/ConsoleTerminal.d.ts +0 -22
- package/dist/Sol/wingets/ConsoleTerminal.js +0 -77
- package/dist/Sol/wingets/DashboardAccountpanel.d.ts +0 -18
- package/dist/Sol/wingets/DashboardAccountpanel.js +0 -65
- package/dist/Sol/wingets/DashboardAdminpanel.d.ts +0 -6
- package/dist/Sol/wingets/DashboardAdminpanel.js +0 -90
- package/dist/Sol/wingets/DashboardAuditlog.d.ts +0 -8
- package/dist/Sol/wingets/DashboardAuditlog.js +0 -50
- package/dist/Sol/wingets/DashboardCreatesandboxform.d.ts +0 -10
- package/dist/Sol/wingets/DashboardCreatesandboxform.js +0 -71
- package/dist/Sol/wingets/DashboardEventstimeline.d.ts +0 -8
- package/dist/Sol/wingets/DashboardEventstimeline.js +0 -83
- package/dist/Sol/wingets/DashboardGlobalsandboxestable.d.ts +0 -8
- package/dist/Sol/wingets/DashboardGlobalsandboxestable.js +0 -57
- package/dist/Sol/wingets/DashboardMeshnodestable.d.ts +0 -8
- package/dist/Sol/wingets/DashboardMeshnodestable.js +0 -103
- package/dist/Sol/wingets/DashboardSandboxlist.d.ts +0 -10
- package/dist/Sol/wingets/DashboardSandboxlist.js +0 -163
- package/dist/Sol/wingets/DashboardUserstable.d.ts +0 -8
- package/dist/Sol/wingets/DashboardUserstable.js +0 -78
- package/dist/Sol/wingets/HomeEntrygate.d.ts +0 -23
- package/dist/Sol/wingets/HomeEntrygate.js +0 -73
- package/dist/Sol/wingets/HomeMetricstrip.d.ts +0 -9
- package/dist/Sol/wingets/HomeMetricstrip.js +0 -4
- package/dist/Sol/wingets/HomeRuntimediagram.d.ts +0 -1
- package/dist/Sol/wingets/HomeRuntimediagram.js +0 -22
- package/dist/Sol/wingets/LoginForm.d.ts +0 -19
- package/dist/Sol/wingets/LoginForm.js +0 -141
- package/dist/Sol/wingets/RegisterPasswordconfirm.d.ts +0 -13
- package/dist/Sol/wingets/RegisterPasswordconfirm.js +0 -16
- package/dist/Sol/wingets/RegisterPasswordmeter.d.ts +0 -19
- package/dist/Sol/wingets/RegisterPasswordmeter.js +0 -65
- package/dist/Sol/wingets/RegisterUsernamerules.d.ts +0 -11
- package/dist/Sol/wingets/RegisterUsernamerules.js +0 -16
- package/dist/Sol/wingets/index.d.ts +0 -39
- package/dist/Sol/wingets/index.js +0 -39
- package/dist/alternatives.d.ts +0 -508
- package/dist/alternatives.js +0 -950
- package/dist/api.d.ts +0 -154
- package/dist/api.js +0 -174
- package/dist/auth.d.ts +0 -268
- package/dist/auth.js +0 -476
- package/dist/automation.d.ts +0 -425
- package/dist/automation.js +0 -566
- package/dist/browser.d.ts +0 -561
- package/dist/browser.js +0 -1058
- package/dist/capacitor.config.d.ts +0 -45
- package/dist/capacitor.config.js +0 -48
- package/dist/catalog.d.ts +0 -43
- package/dist/catalog.js +0 -44
- package/dist/cli.d.ts +0 -16
- package/dist/cli.js +0 -168
- package/dist/communication.d.ts +0 -181
- package/dist/communication.js +0 -376
- package/dist/compute.d.ts +0 -1160
- package/dist/compute.js +0 -2272
- package/dist/dashboardlib.d.ts +0 -58
- package/dist/dashboardlib.js +0 -161
- package/dist/db.d.ts +0 -569
- package/dist/db.js +0 -1080
- package/dist/distribution.d.ts +0 -528
- package/dist/distribution.js +0 -810
- package/dist/drizzle.config.d.ts +0 -20
- package/dist/drizzle.config.js +0 -18
- package/dist/edgelandes.d.ts +0 -70
- package/dist/edgelandes.host.d.ts +0 -26
- package/dist/edgelandes.host.js +0 -1089
- package/dist/edgelandes.inproc.d.ts +0 -27
- package/dist/edgelandes.inproc.js +0 -952
- package/dist/edgelandes.js +0 -1133
- package/dist/edgelandes.ninety.d.ts +0 -31
- package/dist/edgelandes.ninety.js +0 -174
- package/dist/edgelandes.virtual.d.ts +0 -25
- package/dist/edgelandes.virtual.js +0 -629
- package/dist/edgeplane.d.ts +0 -121
- package/dist/edgeplane.js +0 -341
- package/dist/examplelocaljob.d.ts +0 -1
- package/dist/examplelocaljob.js +0 -14
- package/dist/execution.d.ts +0 -529
- package/dist/execution.js +0 -760
- package/dist/family.d.ts +0 -16
- package/dist/family.js +0 -42
- package/dist/familyurl.d.ts +0 -21
- package/dist/familyurl.js +0 -24
- package/dist/format.d.ts +0 -18
- package/dist/format.js +0 -59
- package/dist/foundation.d.ts +0 -172
- package/dist/foundation.js +0 -312
- package/dist/index.d.ts +0 -735
- package/dist/index.js +0 -1020
- package/dist/integration.d.ts +0 -235
- package/dist/integration.js +0 -228
- package/dist/intelligence.d.ts +0 -93
- package/dist/intelligence.js +0 -144
- package/dist/isolation.d.ts +0 -128
- package/dist/isolation.js +0 -95
- package/dist/labels.d.ts +0 -665
- package/dist/labels.js +0 -707
- package/dist/localauth.d.ts +0 -127
- package/dist/localauth.js +0 -413
- package/dist/media.d.ts +0 -343
- package/dist/media.js +0 -985
- package/dist/mesh.d.ts +0 -177
- package/dist/mesh.js +0 -468
- package/dist/modalityregistry.d.ts +0 -109
- package/dist/modalityregistry.js +0 -1386
- package/dist/modes.d.ts +0 -358
- package/dist/modes.js +0 -133
- package/dist/onboardingstate.d.ts +0 -79
- package/dist/onboardingstate.js +0 -282
- package/dist/orchestrator.d.ts +0 -1338
- package/dist/orchestrator.js +0 -4310
- package/dist/packager/targetcli.js +0 -4
- package/dist/paths.d.ts +0 -2
- package/dist/paths.js +0 -14
- package/dist/performance.d.ts +0 -415
- package/dist/performance.js +0 -826
- package/dist/quantum.d.ts +0 -809
- package/dist/quantum.js +0 -2072
- package/dist/render.d.ts +0 -380
- package/dist/render.js +0 -1072
- package/dist/runall.d.ts +0 -2
- package/dist/runall.js +0 -39
- package/dist/runtimeprobe.d.ts +0 -4
- package/dist/runtimeprobe.js +0 -8
- package/dist/sandbox.d.ts +0 -355
- package/dist/sandbox.js +0 -1721
- package/dist/sandboxenvprofile.d.ts +0 -29
- package/dist/sandboxenvprofile.js +0 -89
- package/dist/sandboxprofile.d.ts +0 -137
- package/dist/sandboxprofile.js +0 -241
- package/dist/sandboxqueue.d.ts +0 -108
- package/dist/sandboxqueue.js +0 -201
- package/dist/sandboxquota.d.ts +0 -121
- package/dist/sandboxquota.js +0 -236
- package/dist/scheduler.d.ts +0 -595
- package/dist/scheduler.js +0 -1258
- package/dist/scriptlanes.d.ts +0 -182
- package/dist/scriptlanes.js +0 -660
- package/dist/scripts.buildengine.d.ts +0 -1
- package/dist/scripts.buildengine.js +0 -39
- package/dist/scripts.securitygate.d.ts +0 -1
- package/dist/scripts.securitygate.js +0 -68
- package/dist/scripts.validateflatnative.d.ts +0 -1
- package/dist/scripts.validateflatnative.js +0 -72
- package/dist/security.d.ts +0 -500
- package/dist/security.js +0 -1169
- package/dist/seedcatalog.d.ts +0 -13
- package/dist/seedcatalog.js +0 -46
- package/dist/server.d.ts +0 -20
- package/dist/server.js +0 -53
- package/dist/speccatalog.d.ts +0 -31
- package/dist/speccatalog.js +0 -163
- package/dist/tiers.d.ts +0 -1001
- package/dist/tiers.js +0 -2169
- package/dist/utils.d.ts +0 -2
- package/dist/utils.js +0 -5
- package/dist/vaulthandoff.d.ts +0 -141
- package/dist/vaulthandoff.js +0 -444
- package/dist/virtual.d.ts +0 -640
- package/dist/virtual.js +0 -1284
- package/dist/virtualcpu.d.ts +0 -315
- package/dist/virtualcpu.js +0 -1180
- package/dist/virtualgpu.d.ts +0 -344
- package/dist/virtualgpu.js +0 -1000
- package/dist/virtualization.d.ts +0 -606
- package/dist/virtualization.js +0 -1186
- package/dist/virtualmemory.d.ts +0 -817
- package/dist/virtualmemory.js +0 -1795
- package/dist/vite.config.d.ts +0 -3
- package/dist/vite.config.js +0 -48
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -25
- package/dist/webserver.d.ts +0 -166
- package/dist/webserver.js +0 -2226
- package/dist/workloadlaw.d.ts +0 -133
- package/dist/workloadlaw.js +0 -193
- package/docs/.gitkeep +0 -0
- package/docs/architecture.1.8.19.md +0 -76
- package/docs/logs/examplesession.json +0 -54
- package/docs/repo.analysis.1.8.21.json +0 -2617
- package/docs/repo.candidates.1.8.21.jsonl +0 -666
- package/docs/repo.selected.1.8.21.json +0 -786
- package/manifest.json +0 -20
- package/media.ts +0 -1337
- package/virtualcpu.ts +0 -1274
- package/virtualgpu.ts +0 -1182
- package/virtualization.ts +0 -1628
- package/virtualmemory.ts +0 -2303
- /package/docs/{artifactresearch.1.8.9.md → artifactresearch189.md} +0 -0
- /package/docs/{batches.1816.to.1820.md → batches1816to1820.md} +0 -0
- /package/docs/{brancharchive.2026.08.18.md → brancharchive20260818.md} +0 -0
- /package/docs/{containerplatforms.1.8.17.md → containerplatforms1817.md} +0 -0
- /package/docs/{e2ugh.engine.md → e2ughengine.md} +0 -0
- /package/docs/{flatbuildresearch.1.8.11.md → flatbuildresearch1811.md} +0 -0
- /package/docs/{licenseaudit.1.8.12.md → licenseaudit1812.md} +0 -0
- /package/docs/{mobileconversionresearch.1.8.10.md → mobileconversionresearch1810.md} +0 -0
- /package/docs/{nativeidentityresearch.1.8.11.md → nativeidentityresearch1811.md} +0 -0
- /package/docs/{native.wrappers.md → nativewrappers.md} +0 -0
- /package/docs/{planning.1.8.18.md → planning1818.md} +0 -0
- /package/docs/{planning.1.8.19.md → planning1819.md} +0 -0
- /package/docs/{planning.engine.md → planningengine.md} +0 -0
- /package/docs/{releasenotes.1.8.12.md → releasenotes1812.md} +0 -0
- /package/docs/{releasenotes.1.8.15.md → releasenotes1815.md} +0 -0
- /package/docs/{releasenotes.1.8.16.md → releasenotes1816.md} +0 -0
- /package/docs/{releasenotes.1.8.17.md → releasenotes1817.md} +0 -0
- /package/docs/{releasenotes.1.8.18.md → releasenotes1818.md} +0 -0
- /package/docs/{releasenotes.1.8.19.md → releasenotes1819.md} +0 -0
- /package/docs/{reorganization.1.8.8.md → reorganization188.md} +0 -0
- /package/docs/{reorganization.1.8.9.md → reorganization189.md} +0 -0
- /package/docs/{repo.research.1.8.16.md → reporesearch1816.md} +0 -0
- /package/docs/{repo.research.1.8.21.md → reporesearch1821.md} +0 -0
- /package/docs/{repo.synthesis.1.8.21.md → reposynthesis1821.md} +0 -0
- /package/docs/{research.1.8.18.isolation.md → research1818isolation.md} +0 -0
- /package/docs/{research.1.8.19.virtual.browser.md → research1819virtualbrowser.md} +0 -0
- /package/docs/{scanningresearch.1.8.11.md → scanningresearch1811.md} +0 -0
- /package/docs/{securityaudit.1.8.7.md → securityaudit187.md} +0 -0
- /package/docs/{securityreferences.1.8.11.md → securityreferences1811.md} +0 -0
- /package/docs/{securityresearch.1.8.11.md → securityresearch1811.md} +0 -0
- /package/docs/{signingresearch.1.8.12.md → signingresearch1812.md} +0 -0
- /package/docs/{tauri.glib.risk.1.8.11.md → tauriglibrisk1811.md} +0 -0
- /package/docs/{todo.1.8.18.md → todo1818.md} +0 -0
- /package/docs/{todo.1.8.19.md → todo1819.md} +0 -0
- /package/docs/{toolchainresearch.1.8.9.md → toolchainresearch189.md} +0 -0
- /package/docs/{web.duplicatecleanup.md → webduplicatecleanup.md} +0 -0
- /package/docs/{web.ideas.md → webideas.md} +0 -0
- /package/docs/{workflowimprovements.2026.08.19.md → workflowimprovements20260819.md} +0 -0
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* sandboxenvprofile.ts — the configuration adapter of the sandbox spec
|
|
3
|
-
* plane.
|
|
4
|
-
*
|
|
5
|
-
* the declarative spec (sandboxprofile.ts) never holds capacities: the
|
|
6
|
-
* limits table is a parameter. this module is the adapter that turns
|
|
7
|
-
* configuration into that parameter: it reads the SADDLE_SPEC_LIMITS
|
|
8
|
-
* json environment variable ({ "bases": { ... } }), merges it over a
|
|
9
|
-
* documented development bootstrap table (so a partial override stays
|
|
10
|
-
* safe) and returns the effective limits table. production deployments
|
|
11
|
-
* can equally hand the database sourced table straight to
|
|
12
|
-
* resolvesandboxspec and skip this adapter entirely.
|
|
13
|
-
*
|
|
14
|
-
* the module is browser-pure: zero dom, zero node builtins; it imports
|
|
15
|
-
* only the vocabulary and types of sandboxprofile.ts. the bootstrap table
|
|
16
|
-
* is a documented convenience, never a product rule — every field it
|
|
17
|
-
* carries is overridable.
|
|
18
|
-
*/
|
|
19
|
-
import type { sandboxspeclimits } from './sandboxprofile.ts';
|
|
20
|
-
/**
|
|
21
|
-
* reads the limits table from the SADDLE_SPEC_LIMITS environment json;
|
|
22
|
-
* the bootstrap table fills every base the json does not define, so a
|
|
23
|
-
* partial override stays safe. broken json falls back to the bootstrap
|
|
24
|
-
* table (the spec plane never becomes unavailable over config drift).
|
|
25
|
-
*
|
|
26
|
-
* @param env the environment record (process.env shaped).
|
|
27
|
-
* @returns the effective limits table.
|
|
28
|
-
*/
|
|
29
|
-
export declare function specenvlimits(env: Record<string, string | undefined>): sandboxspeclimits;
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* sandboxenvprofile.ts — the configuration adapter of the sandbox spec
|
|
3
|
-
* plane.
|
|
4
|
-
*
|
|
5
|
-
* the declarative spec (sandboxprofile.ts) never holds capacities: the
|
|
6
|
-
* limits table is a parameter. this module is the adapter that turns
|
|
7
|
-
* configuration into that parameter: it reads the SADDLE_SPEC_LIMITS
|
|
8
|
-
* json environment variable ({ "bases": { ... } }), merges it over a
|
|
9
|
-
* documented development bootstrap table (so a partial override stays
|
|
10
|
-
* safe) and returns the effective limits table. production deployments
|
|
11
|
-
* can equally hand the database sourced table straight to
|
|
12
|
-
* resolvesandboxspec and skip this adapter entirely.
|
|
13
|
-
*
|
|
14
|
-
* the module is browser-pure: zero dom, zero node builtins; it imports
|
|
15
|
-
* only the vocabulary and types of sandboxprofile.ts. the bootstrap table
|
|
16
|
-
* is a documented convenience, never a product rule — every field it
|
|
17
|
-
* carries is overridable.
|
|
18
|
-
*/
|
|
19
|
-
import { SANDBOXBASES } from './sandboxprofile.ts';
|
|
20
|
-
/** documented development bootstrap table; production overrides it with
|
|
21
|
-
* the SADDLE_SPEC_LIMITS json (or the database table). fields: maxvcpus/
|
|
22
|
-
* maxramgb/maxvgpus/maxdiskgb/maxtimeoutseconds/defaultvcpus/
|
|
23
|
-
* defaultramgb. */
|
|
24
|
-
const bootstraplimits = {
|
|
25
|
-
bases: {
|
|
26
|
-
lite: {
|
|
27
|
-
maxvcpus: 4,
|
|
28
|
-
maxramgb: 8,
|
|
29
|
-
maxvgpus: 0,
|
|
30
|
-
maxdiskgb: 32,
|
|
31
|
-
maxtimeoutseconds: 900,
|
|
32
|
-
defaultvcpus: 2,
|
|
33
|
-
defaultramgb: 4,
|
|
34
|
-
},
|
|
35
|
-
balanced: {
|
|
36
|
-
maxvcpus: 16,
|
|
37
|
-
maxramgb: 32,
|
|
38
|
-
maxvgpus: 1,
|
|
39
|
-
maxdiskgb: 128,
|
|
40
|
-
maxtimeoutseconds: 3600,
|
|
41
|
-
defaultvcpus: 8,
|
|
42
|
-
defaultramgb: 16,
|
|
43
|
-
},
|
|
44
|
-
max: {
|
|
45
|
-
maxvcpus: 64,
|
|
46
|
-
maxramgb: 256,
|
|
47
|
-
maxvgpus: 2,
|
|
48
|
-
maxdiskgb: 512,
|
|
49
|
-
maxtimeoutseconds: 14400,
|
|
50
|
-
defaultvcpus: 32,
|
|
51
|
-
defaultramgb: 64,
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
defaulttimeoutseconds: 900,
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* reads the limits table from the SADDLE_SPEC_LIMITS environment json;
|
|
58
|
-
* the bootstrap table fills every base the json does not define, so a
|
|
59
|
-
* partial override stays safe. broken json falls back to the bootstrap
|
|
60
|
-
* table (the spec plane never becomes unavailable over config drift).
|
|
61
|
-
*
|
|
62
|
-
* @param env the environment record (process.env shaped).
|
|
63
|
-
* @returns the effective limits table.
|
|
64
|
-
*/
|
|
65
|
-
export function specenvlimits(env) {
|
|
66
|
-
const raw = env.SADDLE_SPEC_LIMITS;
|
|
67
|
-
if (raw === undefined || raw.trim() === '') {
|
|
68
|
-
return bootstraplimits;
|
|
69
|
-
}
|
|
70
|
-
try {
|
|
71
|
-
const parsed = JSON.parse(raw);
|
|
72
|
-
const bases = { ...bootstraplimits.bases };
|
|
73
|
-
if (typeof parsed?.bases === 'object' && parsed.bases !== null) {
|
|
74
|
-
for (const key of SANDBOXBASES) {
|
|
75
|
-
const override = parsed.bases[key];
|
|
76
|
-
if (typeof override === 'object' && override !== null) {
|
|
77
|
-
bases[key] = {
|
|
78
|
-
...bootstraplimits.bases[key],
|
|
79
|
-
...override,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return { ...bootstraplimits, bases };
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
return bootstraplimits;
|
|
88
|
-
}
|
|
89
|
-
}
|
package/dist/sandboxprofile.d.ts
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* sandboxprofile.ts — the declarative sandbox specification of saddle.
|
|
3
|
-
*
|
|
4
|
-
* a saddle sandbox is declared, never assembled: one request names the
|
|
5
|
-
* base (max, balanced or lite), the guest operating system (android,
|
|
6
|
-
* grapheneos, linux, omarchy, windows), the cpu architecture (arm64 or
|
|
7
|
-
* amd64), the runtime form (runtime-node, full-docker, published) and
|
|
8
|
-
* the optional resource wishes (vcpus, ramgb, vgpu, diskgb, timeout,
|
|
9
|
-
* networking). this module owns that vocabulary: it validates one
|
|
10
|
-
* declared spec against a caller supplied limits table and resolves it
|
|
11
|
-
* into concrete values the engine surface consumes.
|
|
12
|
-
*
|
|
13
|
-
* nothing about capacities lives in code: the limits table is a plain
|
|
14
|
-
* parameter (config, environment or database). the environment adapter
|
|
15
|
-
* lives in sandboxenvprofile.ts (SADDLE_SPEC_LIMITS json over a
|
|
16
|
-
* documented bootstrap table).
|
|
17
|
-
*
|
|
18
|
-
* the module is browser-pure like sandbox.ts: zero imports, zero dom,
|
|
19
|
-
* zero node builtins, deterministic verdicts. errors are typed and
|
|
20
|
-
* traceable — every sandboxspecerror carries a machine readable code,
|
|
21
|
-
* the offending field, the received value and the expectation missed.
|
|
22
|
-
*
|
|
23
|
-
* competitor sources shaping the contract: opensandbox-group/
|
|
24
|
-
* opensandbox (declared timeoutSeconds bounded by the server side
|
|
25
|
-
* max_sandbox_timeout_seconds; declared resources on the create
|
|
26
|
-
* request) and daytonaio/daytona (per-sandbox cpu/memory/disk quota
|
|
27
|
-
* fields with min=1 validation; gpu admission before create).
|
|
28
|
-
*
|
|
29
|
-
* wire points (kept honest): webserver.ts createsandbox validates the
|
|
30
|
-
* optional base/os/arch/form fields here before building the engine
|
|
31
|
-
* spec; sandbox.ts createSandboxState stays the hardware identity
|
|
32
|
-
* layer and receives the resolved vcpus/ramgb untouched.
|
|
33
|
-
*/
|
|
34
|
-
/** the three runtime bases of the saddle fleet. */
|
|
35
|
-
export type sandboxbaseid = 'max' | 'balanced' | 'lite';
|
|
36
|
-
/** the guest operating systems a sandbox can boot. */
|
|
37
|
-
export type sandboxosid = 'android' | 'grapheneos' | 'linux' | 'omarchy' | 'windows';
|
|
38
|
-
/** the guest cpu architectures (amd64 == the x86_64 of the engine bank). */
|
|
39
|
-
export type sandboxarchid = 'arm64' | 'amd64';
|
|
40
|
-
/** the runtime forms of a published sandbox. */
|
|
41
|
-
export type sandboxformid = 'runtime-node' | 'full-docker' | 'published';
|
|
42
|
-
/** the networking modes of a sandbox. */
|
|
43
|
-
export type sandboxnetworkid = 'nat' | 'bridged' | 'isolated';
|
|
44
|
-
/** the os family a guest belongs to (android builds on the linux kernel). */
|
|
45
|
-
export type sandboxosfamily = 'android' | 'linux' | 'windows';
|
|
46
|
-
/** fixed product vocabulary; only the capacities are configuration. */
|
|
47
|
-
export declare const SANDBOXBASES: readonly sandboxbaseid[];
|
|
48
|
-
export declare const SANDBOXOSES: readonly sandboxosid[];
|
|
49
|
-
export declare const SANDBOXARCHES: readonly sandboxarchid[];
|
|
50
|
-
export declare const SANDBOXFORMS: readonly sandboxformid[];
|
|
51
|
-
export declare const SANDBOXNETWORKS: readonly sandboxnetworkid[];
|
|
52
|
-
/** one base row of the limits table: ceilings and defaults per base. */
|
|
53
|
-
export type sandboxbaselimit = {
|
|
54
|
-
readonly maxvcpus: number;
|
|
55
|
-
readonly maxramgb: number;
|
|
56
|
-
readonly maxvgpus: number;
|
|
57
|
-
readonly maxdiskgb: number;
|
|
58
|
-
readonly maxtimeoutseconds: number;
|
|
59
|
-
readonly defaultvcpus: number;
|
|
60
|
-
readonly defaultramgb: number;
|
|
61
|
-
};
|
|
62
|
-
/** the full limits table handed to the resolver by the caller. */
|
|
63
|
-
export type sandboxspeclimits = {
|
|
64
|
-
readonly bases: Readonly<Record<sandboxbaseid, sandboxbaselimit>>;
|
|
65
|
-
readonly defaulttimeoutseconds?: number;
|
|
66
|
-
};
|
|
67
|
-
/** the declared request shape (every field is optional or unknown). */
|
|
68
|
-
export type sandboxspecinput = Record<string, unknown>;
|
|
69
|
-
/** the resolved spec: concrete values validated against the limits. */
|
|
70
|
-
export type resolvedsandboxspec = {
|
|
71
|
-
readonly base: sandboxbaseid;
|
|
72
|
-
readonly os: sandboxosid;
|
|
73
|
-
readonly arch: sandboxarchid;
|
|
74
|
-
readonly form: sandboxformid;
|
|
75
|
-
readonly networking: sandboxnetworkid;
|
|
76
|
-
readonly family: sandboxosfamily;
|
|
77
|
-
readonly vcpus: number;
|
|
78
|
-
readonly ramgb: number;
|
|
79
|
-
readonly vgpu: boolean;
|
|
80
|
-
readonly diskgb: number | null;
|
|
81
|
-
readonly timeoutseconds: number;
|
|
82
|
-
};
|
|
83
|
-
/** every failure code the resolver can produce. */
|
|
84
|
-
export type sandboxspecerrorcode = 'invalid-spec' | 'missing-base' | 'invalid-base' | 'invalid-os' | 'invalid-arch' | 'invalid-form' | 'invalid-networking' | 'invalid-vcpus' | 'invalid-ramgb' | 'invalid-vgpu' | 'invalid-diskgb' | 'invalid-timeout' | 'timeout-above-limit' | 'vgpu-not-available' | 'unknown-base-limits';
|
|
85
|
-
/** the typed spec failure: code, field, received value and expectation. */
|
|
86
|
-
export declare class sandboxspecerror extends Error {
|
|
87
|
-
/** machine readable failure code. */
|
|
88
|
-
readonly code: sandboxspecerrorcode;
|
|
89
|
-
/** the declared field that failed (or 'spec' for envelope failures). */
|
|
90
|
-
readonly field: string;
|
|
91
|
-
/** the received value, json-safe. */
|
|
92
|
-
readonly value: unknown;
|
|
93
|
-
/** the expectation the value missed. */
|
|
94
|
-
readonly expected: string;
|
|
95
|
-
constructor(code: sandboxspecerrorcode, field: string, value: unknown, expected: string, message?: string);
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* validates one declared spec against the limits table and resolves it
|
|
99
|
-
* into concrete values. the verdict is a discriminated result so
|
|
100
|
-
* callers surface the typed error without try/catch.
|
|
101
|
-
*
|
|
102
|
-
* @param input the declared spec (unknown json is tolerated).
|
|
103
|
-
* @param limits the limits table (config, env or database sourced).
|
|
104
|
-
* @returns the resolved spec or the typed, traceable error.
|
|
105
|
-
*/
|
|
106
|
-
export declare function resolvesandboxspec(input: unknown, limits: sandboxspeclimits): {
|
|
107
|
-
ok: true;
|
|
108
|
-
value: resolvedsandboxspec;
|
|
109
|
-
} | {
|
|
110
|
-
ok: false;
|
|
111
|
-
error: sandboxspecerror;
|
|
112
|
-
};
|
|
113
|
-
/** maps a guest os onto its kernel family (grapheneos builds on aosp). */
|
|
114
|
-
export declare function osfamily(os: sandboxosid): sandboxosfamily;
|
|
115
|
-
/** the structural shape consumed by sandbox.ts createSandboxState. */
|
|
116
|
-
export type sandboxenginespec = {
|
|
117
|
-
readonly model: string;
|
|
118
|
-
readonly vcpus: number;
|
|
119
|
-
readonly ramgb: number;
|
|
120
|
-
readonly gpu: string;
|
|
121
|
-
readonly mig: string;
|
|
122
|
-
};
|
|
123
|
-
/**
|
|
124
|
-
* bridges a resolved spec onto the engine surface: vcpus and ramgb come
|
|
125
|
-
* from the resolved spec, the cpu model and gpu identity stay caller
|
|
126
|
-
* choices (the reviewed catalog of sandbox.ts remains the only source
|
|
127
|
-
* of processor and gpu identity).
|
|
128
|
-
*
|
|
129
|
-
* @param resolved the resolved spec produced by resolvesandboxspec.
|
|
130
|
-
* @param options the caller picked engine identities (model, gpu, mig).
|
|
131
|
-
* @returns the engine spec object.
|
|
132
|
-
*/
|
|
133
|
-
export declare function enginespecfor(resolved: resolvedsandboxspec, options?: {
|
|
134
|
-
model?: string;
|
|
135
|
-
gpu?: string;
|
|
136
|
-
mig?: string;
|
|
137
|
-
}): sandboxenginespec;
|
package/dist/sandboxprofile.js
DELETED
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* sandboxprofile.ts — the declarative sandbox specification of saddle.
|
|
3
|
-
*
|
|
4
|
-
* a saddle sandbox is declared, never assembled: one request names the
|
|
5
|
-
* base (max, balanced or lite), the guest operating system (android,
|
|
6
|
-
* grapheneos, linux, omarchy, windows), the cpu architecture (arm64 or
|
|
7
|
-
* amd64), the runtime form (runtime-node, full-docker, published) and
|
|
8
|
-
* the optional resource wishes (vcpus, ramgb, vgpu, diskgb, timeout,
|
|
9
|
-
* networking). this module owns that vocabulary: it validates one
|
|
10
|
-
* declared spec against a caller supplied limits table and resolves it
|
|
11
|
-
* into concrete values the engine surface consumes.
|
|
12
|
-
*
|
|
13
|
-
* nothing about capacities lives in code: the limits table is a plain
|
|
14
|
-
* parameter (config, environment or database). the environment adapter
|
|
15
|
-
* lives in sandboxenvprofile.ts (SADDLE_SPEC_LIMITS json over a
|
|
16
|
-
* documented bootstrap table).
|
|
17
|
-
*
|
|
18
|
-
* the module is browser-pure like sandbox.ts: zero imports, zero dom,
|
|
19
|
-
* zero node builtins, deterministic verdicts. errors are typed and
|
|
20
|
-
* traceable — every sandboxspecerror carries a machine readable code,
|
|
21
|
-
* the offending field, the received value and the expectation missed.
|
|
22
|
-
*
|
|
23
|
-
* competitor sources shaping the contract: opensandbox-group/
|
|
24
|
-
* opensandbox (declared timeoutSeconds bounded by the server side
|
|
25
|
-
* max_sandbox_timeout_seconds; declared resources on the create
|
|
26
|
-
* request) and daytonaio/daytona (per-sandbox cpu/memory/disk quota
|
|
27
|
-
* fields with min=1 validation; gpu admission before create).
|
|
28
|
-
*
|
|
29
|
-
* wire points (kept honest): webserver.ts createsandbox validates the
|
|
30
|
-
* optional base/os/arch/form fields here before building the engine
|
|
31
|
-
* spec; sandbox.ts createSandboxState stays the hardware identity
|
|
32
|
-
* layer and receives the resolved vcpus/ramgb untouched.
|
|
33
|
-
*/
|
|
34
|
-
/** fixed product vocabulary; only the capacities are configuration. */
|
|
35
|
-
export const SANDBOXBASES = ['max', 'balanced', 'lite'];
|
|
36
|
-
export const SANDBOXOSES = [
|
|
37
|
-
'android',
|
|
38
|
-
'grapheneos',
|
|
39
|
-
'linux',
|
|
40
|
-
'omarchy',
|
|
41
|
-
'windows',
|
|
42
|
-
];
|
|
43
|
-
export const SANDBOXARCHES = ['arm64', 'amd64'];
|
|
44
|
-
export const SANDBOXFORMS = ['runtime-node', 'full-docker', 'published'];
|
|
45
|
-
export const SANDBOXNETWORKS = ['nat', 'bridged', 'isolated'];
|
|
46
|
-
/** the typed spec failure: code, field, received value and expectation. */
|
|
47
|
-
export class sandboxspecerror extends Error {
|
|
48
|
-
/** machine readable failure code. */
|
|
49
|
-
code;
|
|
50
|
-
/** the declared field that failed (or 'spec' for envelope failures). */
|
|
51
|
-
field;
|
|
52
|
-
/** the received value, json-safe. */
|
|
53
|
-
value;
|
|
54
|
-
/** the expectation the value missed. */
|
|
55
|
-
expected;
|
|
56
|
-
constructor(code, field, value, expected, message) {
|
|
57
|
-
super(message ?? `sandbox spec field "${field}" ${expected} (received ${show(value)})`);
|
|
58
|
-
this.name = 'sandboxspecerror';
|
|
59
|
-
this.code = code;
|
|
60
|
-
this.field = field;
|
|
61
|
-
this.value = value;
|
|
62
|
-
this.expected = expected;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/** renders a json-safe preview of any received value for error messages. */
|
|
66
|
-
function show(value) {
|
|
67
|
-
if (typeof value === 'string') {
|
|
68
|
-
return JSON.stringify(value);
|
|
69
|
-
}
|
|
70
|
-
if (typeof value === 'number' || typeof value === 'boolean' || value === null) {
|
|
71
|
-
return String(value);
|
|
72
|
-
}
|
|
73
|
-
if (value === undefined) {
|
|
74
|
-
return 'undefined';
|
|
75
|
-
}
|
|
76
|
-
return Array.isArray(value) ? 'an array' : typeof value;
|
|
77
|
-
}
|
|
78
|
-
/** picks the matching member of a fixed vocabulary; undefined otherwise. */
|
|
79
|
-
function memberof(vocabulary, value) {
|
|
80
|
-
return typeof value === 'string'
|
|
81
|
-
? vocabulary.find((item) => item === value)
|
|
82
|
-
: undefined;
|
|
83
|
-
}
|
|
84
|
-
/** validates a positive integer wish; null when the shape is wrong. */
|
|
85
|
-
function positiveinteger(value) {
|
|
86
|
-
return typeof value === 'number' && Number.isInteger(value) && value >= 1 ? value : null;
|
|
87
|
-
}
|
|
88
|
-
/* ------------------------------------------------------------------ */
|
|
89
|
-
/* the resolver */
|
|
90
|
-
/* ------------------------------------------------------------------ */
|
|
91
|
-
/**
|
|
92
|
-
* validates one declared spec against the limits table and resolves it
|
|
93
|
-
* into concrete values. the verdict is a discriminated result so
|
|
94
|
-
* callers surface the typed error without try/catch.
|
|
95
|
-
*
|
|
96
|
-
* @param input the declared spec (unknown json is tolerated).
|
|
97
|
-
* @param limits the limits table (config, env or database sourced).
|
|
98
|
-
* @returns the resolved spec or the typed, traceable error.
|
|
99
|
-
*/
|
|
100
|
-
export function resolvesandboxspec(input, limits) {
|
|
101
|
-
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
102
|
-
return {
|
|
103
|
-
ok: false,
|
|
104
|
-
error: new sandboxspecerror('invalid-spec', 'spec', input, 'a plain object'),
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
const declared = input;
|
|
108
|
-
const base = memberof(SANDBOXBASES, declared.base);
|
|
109
|
-
if (base === undefined) {
|
|
110
|
-
return {
|
|
111
|
-
ok: false,
|
|
112
|
-
error: declared.base === undefined
|
|
113
|
-
? new sandboxspecerror('missing-base', 'base', undefined, `one of ${SANDBOXBASES.join(', ')}`)
|
|
114
|
-
: new sandboxspecerror('invalid-base', 'base', declared.base, `one of ${SANDBOXBASES.join(', ')}`),
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
const row = limits.bases[base];
|
|
118
|
-
if (row === undefined) {
|
|
119
|
-
return {
|
|
120
|
-
ok: false,
|
|
121
|
-
error: new sandboxspecerror('unknown-base-limits', 'base', base, 'a base present in the limits table'),
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
// fixed vocabularies: a present but unknown member is a typed error.
|
|
125
|
-
const words = [
|
|
126
|
-
['os', SANDBOXOSES, 'invalid-os'],
|
|
127
|
-
['arch', SANDBOXARCHES, 'invalid-arch'],
|
|
128
|
-
['form', SANDBOXFORMS, 'invalid-form'],
|
|
129
|
-
['networking', SANDBOXNETWORKS, 'invalid-networking'],
|
|
130
|
-
];
|
|
131
|
-
for (const [field, vocabulary, code] of words) {
|
|
132
|
-
if (declared[field] !== undefined && !memberof(vocabulary, declared[field])) {
|
|
133
|
-
return {
|
|
134
|
-
ok: false,
|
|
135
|
-
error: new sandboxspecerror(code, field, declared[field], `one of ${vocabulary.join(', ')}`),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
// resource wishes: positive integers bounded by the base ceiling.
|
|
140
|
-
const ceilings = [
|
|
141
|
-
['vcpus', 'invalid-vcpus', row.maxvcpus],
|
|
142
|
-
['ramgb', 'invalid-ramgb', row.maxramgb],
|
|
143
|
-
['diskgb', 'invalid-diskgb', row.maxdiskgb],
|
|
144
|
-
];
|
|
145
|
-
for (const [field, code, ceiling] of ceilings) {
|
|
146
|
-
if (declared[field] === undefined) {
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
const wish = positiveinteger(declared[field]);
|
|
150
|
-
if (wish === null) {
|
|
151
|
-
return {
|
|
152
|
-
ok: false,
|
|
153
|
-
error: new sandboxspecerror(code, field, declared[field], 'a positive integer'),
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
if (wish > ceiling) {
|
|
157
|
-
return {
|
|
158
|
-
ok: false,
|
|
159
|
-
error: new sandboxspecerror(code, field, declared[field], `an integer between 1 and ${ceiling} on the ${base} base`),
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
let vgpu = false;
|
|
164
|
-
if (declared.vgpu !== undefined && typeof declared.vgpu !== 'boolean') {
|
|
165
|
-
return {
|
|
166
|
-
ok: false,
|
|
167
|
-
error: new sandboxspecerror('invalid-vgpu', 'vgpu', declared.vgpu, 'a boolean'),
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
vgpu = declared.vgpu === true;
|
|
171
|
-
if (vgpu && row.maxvgpus < 1) {
|
|
172
|
-
return {
|
|
173
|
-
ok: false,
|
|
174
|
-
error: new sandboxspecerror('vgpu-not-available', 'vgpu', true, `a base with vgpu slices (the ${base} base exposes none)`),
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
const defaulttimeout = limits.defaulttimeoutseconds ?? 900;
|
|
178
|
-
let timeoutseconds = defaulttimeout;
|
|
179
|
-
if (declared.timeoutseconds !== undefined) {
|
|
180
|
-
const wish = positiveinteger(declared.timeoutseconds);
|
|
181
|
-
if (wish === null) {
|
|
182
|
-
return {
|
|
183
|
-
ok: false,
|
|
184
|
-
error: new sandboxspecerror('invalid-timeout', 'timeoutseconds', declared.timeoutseconds, 'a positive integer of seconds'),
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
if (wish > row.maxtimeoutseconds) {
|
|
188
|
-
return {
|
|
189
|
-
ok: false,
|
|
190
|
-
error: new sandboxspecerror('timeout-above-limit', 'timeoutseconds', declared.timeoutseconds, `at most ${row.maxtimeoutseconds} seconds on the ${base} base`),
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
timeoutseconds = wish;
|
|
194
|
-
}
|
|
195
|
-
const os = (memberof(SANDBOXOSES, declared.os) ?? 'linux');
|
|
196
|
-
return {
|
|
197
|
-
ok: true,
|
|
198
|
-
value: {
|
|
199
|
-
base,
|
|
200
|
-
os,
|
|
201
|
-
arch: (memberof(SANDBOXARCHES, declared.arch) ?? 'amd64'),
|
|
202
|
-
form: (memberof(SANDBOXFORMS, declared.form) ?? 'runtime-node'),
|
|
203
|
-
networking: (memberof(SANDBOXNETWORKS, declared.networking) ?? 'nat'),
|
|
204
|
-
family: osfamily(os),
|
|
205
|
-
vcpus: declared.vcpus ?? row.defaultvcpus,
|
|
206
|
-
ramgb: declared.ramgb ?? row.defaultramgb,
|
|
207
|
-
vgpu,
|
|
208
|
-
diskgb: declared.diskgb ?? null,
|
|
209
|
-
timeoutseconds,
|
|
210
|
-
},
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
/* ------------------------------------------------------------------ */
|
|
214
|
-
/* helpers and bridges */
|
|
215
|
-
/* ------------------------------------------------------------------ */
|
|
216
|
-
/** maps a guest os onto its kernel family (grapheneos builds on aosp). */
|
|
217
|
-
export function osfamily(os) {
|
|
218
|
-
if (os === 'android' || os === 'grapheneos') {
|
|
219
|
-
return 'android';
|
|
220
|
-
}
|
|
221
|
-
return os === 'windows' ? 'windows' : 'linux';
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* bridges a resolved spec onto the engine surface: vcpus and ramgb come
|
|
225
|
-
* from the resolved spec, the cpu model and gpu identity stay caller
|
|
226
|
-
* choices (the reviewed catalog of sandbox.ts remains the only source
|
|
227
|
-
* of processor and gpu identity).
|
|
228
|
-
*
|
|
229
|
-
* @param resolved the resolved spec produced by resolvesandboxspec.
|
|
230
|
-
* @param options the caller picked engine identities (model, gpu, mig).
|
|
231
|
-
* @returns the engine spec object.
|
|
232
|
-
*/
|
|
233
|
-
export function enginespecfor(resolved, options) {
|
|
234
|
-
return {
|
|
235
|
-
model: options?.model ?? '',
|
|
236
|
-
vcpus: resolved.vcpus,
|
|
237
|
-
ramgb: resolved.ramgb,
|
|
238
|
-
gpu: resolved.vgpu ? (options?.gpu ?? '') : '',
|
|
239
|
-
mig: options?.mig ?? 'off',
|
|
240
|
-
};
|
|
241
|
-
}
|
package/dist/sandboxqueue.d.ts
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* sandboxqueue.ts — the sandbox lifecycle queue of saddle.
|
|
3
|
-
*
|
|
4
|
-
* one sandbox walks a single linear machine: creating -> starting ->
|
|
5
|
-
* running -> stopping -> stopped, with the supervision states cancelled,
|
|
6
|
-
* failed and timedout closing the paths out. every intermediate state
|
|
7
|
-
* carries a per-state time budget; the health-check tick reaps entries
|
|
8
|
-
* whose budget expired (the ttl reaper pattern of webserver.ts and the
|
|
9
|
-
* pool reaper of opensandbox). transitions are validated by a pure
|
|
10
|
-
* transition table so both callers and tests exercise the same guard.
|
|
11
|
-
*
|
|
12
|
-
* the module is deliberately pure: no timers of its own, no dom, no node
|
|
13
|
-
* builtins, an injectable clock. hosts drive it — webserver.ts ramps
|
|
14
|
-
* the api lifecycle with a timeout, the ttl reaper sweeps every minute,
|
|
15
|
-
* and orchestrator.ts owns the fifteen state vm plane machine; this
|
|
16
|
-
* module is the queue-level complement those surfaces can delegate to
|
|
17
|
-
* (wire point documented in the webserver statemachine context: the
|
|
18
|
-
* api states map as created->creating, expired->timedout,
|
|
19
|
-
* destroyed->stopped).
|
|
20
|
-
*
|
|
21
|
-
* studied competitors shaping the contract: daytonaio/daytona (sandbox
|
|
22
|
-
* states creating/starting/started/stopping/stopped/error with the
|
|
23
|
-
* -ing intermediates) and opensandbox-group/opensandbox (Creating ->
|
|
24
|
-
* Running -> Deleting -> Deleted with 409 on state conflicting
|
|
25
|
-
* operations and a pool acquisition that fails fast with Retry-After).
|
|
26
|
-
*/
|
|
27
|
-
/** every phase of the sandbox lifecycle queue. */
|
|
28
|
-
export type sandboxphase = 'creating' | 'starting' | 'running' | 'stopping' | 'stopped' | 'cancelled' | 'failed' | 'timedout';
|
|
29
|
-
/** phases that end the queue entry (no further transition is legal). */
|
|
30
|
-
export declare const SANDBOXTERMINALPHASES: readonly sandboxphase[];
|
|
31
|
-
/** per-state time budgets in milliseconds; a state without a budget
|
|
32
|
-
* never times out (running typically relies on the host ttl instead). */
|
|
33
|
-
export type sandboxphasebudgets = {
|
|
34
|
-
readonly creating?: number;
|
|
35
|
-
readonly starting?: number;
|
|
36
|
-
readonly running?: number;
|
|
37
|
-
readonly stopping?: number;
|
|
38
|
-
};
|
|
39
|
-
/** one queue entry: identity, phase, bookkeeping. */
|
|
40
|
-
export type sandboxqueueentry = {
|
|
41
|
-
readonly id: string;
|
|
42
|
-
state: sandboxphase;
|
|
43
|
-
/** epoch ms of the last phase change. */
|
|
44
|
-
enteredat: number;
|
|
45
|
-
/** epoch ms the current phase budget expires; null when unbounded. */
|
|
46
|
-
deadline: number | null;
|
|
47
|
-
};
|
|
48
|
-
/** one recorded lifecycle event (bounded ring, newest last). */
|
|
49
|
-
export type sandboxqueueevent = {
|
|
50
|
-
readonly id: string;
|
|
51
|
-
readonly from: sandboxphase;
|
|
52
|
-
readonly to: sandboxphase;
|
|
53
|
-
readonly at: number;
|
|
54
|
-
readonly reason: 'requested' | 'timeout' | 'cancel';
|
|
55
|
-
};
|
|
56
|
-
/** failure codes carried by sandboxqueueerror. */
|
|
57
|
-
export type sandboxqueueerrorcode = 'unknown-sandbox' | 'duplicate-sandbox' | 'invalid-transition' | 'terminal-phase';
|
|
58
|
-
/** the typed queue failure, traceable to the entry and both phases. */
|
|
59
|
-
export declare class sandboxqueueerror extends Error {
|
|
60
|
-
/** machine readable failure code. */
|
|
61
|
-
readonly code: sandboxqueueerrorcode;
|
|
62
|
-
/** the entry the failure belongs to. */
|
|
63
|
-
readonly id: string;
|
|
64
|
-
/** the phase the entry was in (or from), when known. */
|
|
65
|
-
readonly from: sandboxphase | null;
|
|
66
|
-
/** the requested target phase, when known. */
|
|
67
|
-
readonly to: sandboxphase | null;
|
|
68
|
-
constructor(code: sandboxqueueerrorcode, id: string, from: sandboxphase | null, to: sandboxphase | null, message?: string);
|
|
69
|
-
}
|
|
70
|
-
/** checks whether a phase change is legal on the single machine. */
|
|
71
|
-
export declare function cansandboxstep(from: sandboxphase, to: sandboxphase): boolean;
|
|
72
|
-
/** reports whether a phase is terminal. */
|
|
73
|
-
export declare function issandboxterminal(phase: sandboxphase): boolean;
|
|
74
|
-
/** options of createsandboxqueue (all optional, sane defaults). */
|
|
75
|
-
export type sandboxqueueoptions = {
|
|
76
|
-
/** per-state budgets; the defaults mirror the 125 ms api ramp. */
|
|
77
|
-
readonly budgets?: sandboxphasebudgets;
|
|
78
|
-
/** event ring capacity (default 100). */
|
|
79
|
-
readonly eventcap?: number;
|
|
80
|
-
};
|
|
81
|
-
/** a read-only status view answered by status(). */
|
|
82
|
-
export type sandboxqueuestatus = {
|
|
83
|
-
readonly id: string;
|
|
84
|
-
readonly state: sandboxphase;
|
|
85
|
-
readonly enteredat: number;
|
|
86
|
-
readonly deadline: number | null;
|
|
87
|
-
readonly age: number;
|
|
88
|
-
readonly terminal: boolean;
|
|
89
|
-
};
|
|
90
|
-
/**
|
|
91
|
-
* creates the lifecycle queue. the queue validates every transition,
|
|
92
|
-
* stamps deadlines from the budgets and reaps expired entries on the
|
|
93
|
-
* health-check tick; the host decides when to tick.
|
|
94
|
-
*
|
|
95
|
-
* @param options the budgets and event ring capacity.
|
|
96
|
-
* @returns the queue facade (add, step, cancel, healthcheck, status,
|
|
97
|
-
* list, events, size).
|
|
98
|
-
*/
|
|
99
|
-
export declare function createsandboxqueue(options?: sandboxqueueoptions): {
|
|
100
|
-
add: (id: string, now?: number) => sandboxqueueentry;
|
|
101
|
-
step: (id: string, to: sandboxphase, now?: number) => sandboxqueueentry;
|
|
102
|
-
cancel: (id: string, now?: number) => sandboxqueueentry;
|
|
103
|
-
healthcheck: (now?: number) => string[];
|
|
104
|
-
status: (id: string, now?: number) => sandboxqueuestatus;
|
|
105
|
-
list: (now?: number) => sandboxqueuestatus[];
|
|
106
|
-
events: () => sandboxqueueevent[];
|
|
107
|
-
size: () => number;
|
|
108
|
-
};
|