@ebowwa/sandbox 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compilers/index.d.ts +24 -0
- package/dist/compilers/index.d.ts.map +1 -0
- package/dist/compilers/index.js +42 -0
- package/dist/compilers/index.js.map +1 -0
- package/dist/compilers/javascript.d.ts +117 -0
- package/dist/compilers/javascript.d.ts.map +1 -0
- package/dist/compilers/javascript.js +462 -0
- package/dist/compilers/javascript.js.map +1 -0
- package/dist/compilers/python.d.ts +140 -0
- package/dist/compilers/python.d.ts.map +1 -0
- package/dist/compilers/python.js +650 -0
- package/dist/compilers/python.js.map +1 -0
- package/dist/compilers/typescript.d.ts +99 -0
- package/dist/compilers/typescript.d.ts.map +1 -0
- package/dist/compilers/typescript.js +323 -0
- package/dist/compilers/typescript.js.map +1 -0
- package/dist/core/cell.d.ts +160 -0
- package/dist/core/cell.d.ts.map +1 -0
- package/dist/core/cell.js +319 -0
- package/dist/core/cell.js.map +1 -0
- package/dist/core/compiler.d.ts +126 -0
- package/dist/core/compiler.d.ts.map +1 -0
- package/dist/core/compiler.js +123 -0
- package/dist/core/compiler.js.map +1 -0
- package/dist/core/index.d.ts +19 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/limits.d.ts +173 -0
- package/dist/core/limits.d.ts.map +1 -0
- package/dist/core/limits.js +440 -0
- package/dist/core/limits.js.map +1 -0
- package/dist/core/permissions.d.ts +103 -0
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/core/permissions.js +341 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/runtime.d.ts +127 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +325 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/types.d.ts +380 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +67 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +145 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +279 -0
- package/dist/index.js.map +1 -0
- package/dist/multi/index.d.ts +9 -0
- package/dist/multi/index.d.ts.map +1 -0
- package/dist/multi/index.js +7 -0
- package/dist/multi/index.js.map +1 -0
- package/dist/multi/polyglot.d.ts +179 -0
- package/dist/multi/polyglot.d.ts.map +1 -0
- package/dist/multi/polyglot.js +319 -0
- package/dist/multi/polyglot.js.map +1 -0
- package/dist/runtimes/docker.d.ts +97 -0
- package/dist/runtimes/docker.d.ts.map +1 -0
- package/dist/runtimes/docker.js +368 -0
- package/dist/runtimes/docker.js.map +1 -0
- package/dist/runtimes/index.d.ts +11 -0
- package/dist/runtimes/index.d.ts.map +1 -0
- package/dist/runtimes/index.js +9 -0
- package/dist/runtimes/index.js.map +1 -0
- package/dist/runtimes/process.d.ts +47 -0
- package/dist/runtimes/process.d.ts.map +1 -0
- package/dist/runtimes/process.js +230 -0
- package/dist/runtimes/process.js.map +1 -0
- package/dist/session/index.d.ts +12 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +9 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/kernel.d.ts +199 -0
- package/dist/session/kernel.d.ts.map +1 -0
- package/dist/session/kernel.js +400 -0
- package/dist/session/kernel.js.map +1 -0
- package/dist/session/notebook.d.ts +168 -0
- package/dist/session/notebook.d.ts.map +1 -0
- package/dist/session/notebook.js +499 -0
- package/dist/session/notebook.js.map +1 -0
- package/dist/session/repl.d.ts +159 -0
- package/dist/session/repl.d.ts.map +1 -0
- package/dist/session/repl.js +409 -0
- package/dist/session/repl.js.map +1 -0
- package/package.json +142 -0
- package/src/compilers/index.ts +80 -0
- package/src/compilers/javascript.ts +571 -0
- package/src/compilers/python.ts +785 -0
- package/src/compilers/typescript.ts +442 -0
- package/src/core/cell.ts +439 -0
- package/src/core/compiler.ts +250 -0
- package/src/core/index.ts +123 -0
- package/src/core/limits.ts +508 -0
- package/src/core/permissions.ts +409 -0
- package/src/core/runtime.ts +499 -0
- package/src/core/types.ts +528 -0
- package/src/global.d.ts +59 -0
- package/src/index.ts +515 -0
- package/src/multi/index.ts +22 -0
- package/src/multi/polyglot.ts +461 -0
- package/src/runtimes/docker.ts +501 -0
- package/src/runtimes/index.ts +21 -0
- package/src/runtimes/process.ts +316 -0
- package/src/session/index.ts +41 -0
- package/src/session/kernel.ts +553 -0
- package/src/session/notebook.ts +635 -0
- package/src/session/repl.ts +521 -0
- package/src/wasm2wasm.d.ts +35 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissions Primitive
|
|
3
|
+
*
|
|
4
|
+
* Composable permission enforcement for sandbox execution.
|
|
5
|
+
* Each permission can be independently granted or denied.
|
|
6
|
+
*/
|
|
7
|
+
import type { Permissions, PermissionLevel, FileSystemPermission, NetworkPermission, EnvironmentPermission, ProcessPermission } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Permission Checker
|
|
10
|
+
*
|
|
11
|
+
* Validates permissions against allowed operations.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PermissionChecker {
|
|
14
|
+
private permissions;
|
|
15
|
+
constructor(permissions: Permissions);
|
|
16
|
+
/**
|
|
17
|
+
* Check if filesystem read is allowed
|
|
18
|
+
*/
|
|
19
|
+
canReadFile(path?: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Check if filesystem write is allowed
|
|
22
|
+
*/
|
|
23
|
+
canWriteFile(path?: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Check if filesystem delete is allowed
|
|
26
|
+
*/
|
|
27
|
+
canDeleteFile(path?: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Check if network outbound is allowed
|
|
30
|
+
*/
|
|
31
|
+
canConnect(host?: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Check if network inbound is allowed
|
|
34
|
+
*/
|
|
35
|
+
canListen(port?: number): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Check if environment read is allowed
|
|
38
|
+
*/
|
|
39
|
+
canReadEnv(key?: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Check if environment write is allowed
|
|
42
|
+
*/
|
|
43
|
+
canWriteEnv(key?: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Check if process spawn is allowed
|
|
46
|
+
*/
|
|
47
|
+
canSpawnProcess(command?: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Get memory limit
|
|
50
|
+
*/
|
|
51
|
+
getMemoryLimit(): number | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Get CPU limits
|
|
54
|
+
*/
|
|
55
|
+
getCpuLimits(): {
|
|
56
|
+
maxPercent?: number;
|
|
57
|
+
maxTimeMs?: number;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Check if path is allowed
|
|
61
|
+
*/
|
|
62
|
+
private isPathAllowed;
|
|
63
|
+
/**
|
|
64
|
+
* Check if host is allowed
|
|
65
|
+
*/
|
|
66
|
+
private isHostAllowed;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Permission Builder
|
|
70
|
+
*
|
|
71
|
+
* Fluent API for building permission sets.
|
|
72
|
+
*/
|
|
73
|
+
export declare class PermissionBuilder {
|
|
74
|
+
private permissions;
|
|
75
|
+
filesystem(options: Partial<FileSystemPermission>): this;
|
|
76
|
+
network(options: Partial<NetworkPermission>): this;
|
|
77
|
+
environment(options: Partial<EnvironmentPermission>): this;
|
|
78
|
+
process(options: Partial<ProcessPermission>): this;
|
|
79
|
+
memory(maxBytes: number): this;
|
|
80
|
+
cpu(options: {
|
|
81
|
+
maxPercent?: number;
|
|
82
|
+
maxTimeMs?: number;
|
|
83
|
+
}): this;
|
|
84
|
+
build(): Permissions;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create permission set from level
|
|
88
|
+
*/
|
|
89
|
+
export declare function createPermissions(level: PermissionLevel): Permissions;
|
|
90
|
+
/**
|
|
91
|
+
* Merge permissions (intersection - most restrictive)
|
|
92
|
+
*/
|
|
93
|
+
export declare function mergePermissions(...perms: Permissions[]): Permissions;
|
|
94
|
+
/**
|
|
95
|
+
* Check if permission level implies another
|
|
96
|
+
*/
|
|
97
|
+
export declare function impliesPermission(level: PermissionLevel, required: PermissionLevel): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Upgrade permissions to higher level
|
|
100
|
+
*/
|
|
101
|
+
export declare function upgradePermissions(current: Permissions, newLevel: PermissionLevel): Permissions;
|
|
102
|
+
export { permissionsFromLevel } from "./types.js";
|
|
103
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/core/permissions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAE5C;;OAEG;IACH,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAUnC;;OAEG;IACH,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAUpC;;OAEG;IACH,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAUrC;;OAEG;IACH,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAUlC;;OAEG;IACH,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAQjC;;OAEG;IACH,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO;IAUjC;;OAEG;IACH,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO;IAUlC;;OAEG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAY1C;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC;;OAEG;IACH,YAAY,IAAI;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ3D;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAsBtB;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAmB;IAEtC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAQxD,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAQlD,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI;IAQ1D,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAQlD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK9B,GAAG,CAAC,OAAO,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAK/D,KAAK,IAAI,WAAW;CAGrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,WAAW,CAsCrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAwDrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAUT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,eAAe,GACxB,WAAW,CAGb;AAuBD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissions Primitive
|
|
3
|
+
*
|
|
4
|
+
* Composable permission enforcement for sandbox execution.
|
|
5
|
+
* Each permission can be independently granted or denied.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Permission Checker
|
|
9
|
+
*
|
|
10
|
+
* Validates permissions against allowed operations.
|
|
11
|
+
*/
|
|
12
|
+
export class PermissionChecker {
|
|
13
|
+
permissions;
|
|
14
|
+
constructor(permissions) {
|
|
15
|
+
this.permissions = permissions;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if filesystem read is allowed
|
|
19
|
+
*/
|
|
20
|
+
canReadFile(path) {
|
|
21
|
+
const fs = this.permissions.fs;
|
|
22
|
+
if (!fs?.read)
|
|
23
|
+
return false;
|
|
24
|
+
if (path) {
|
|
25
|
+
return this.isPathAllowed(path, fs);
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if filesystem write is allowed
|
|
31
|
+
*/
|
|
32
|
+
canWriteFile(path) {
|
|
33
|
+
const fs = this.permissions.fs;
|
|
34
|
+
if (!fs?.write)
|
|
35
|
+
return false;
|
|
36
|
+
if (path) {
|
|
37
|
+
return this.isPathAllowed(path, fs);
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if filesystem delete is allowed
|
|
43
|
+
*/
|
|
44
|
+
canDeleteFile(path) {
|
|
45
|
+
const fs = this.permissions.fs;
|
|
46
|
+
if (!fs?.delete)
|
|
47
|
+
return false;
|
|
48
|
+
if (path) {
|
|
49
|
+
return this.isPathAllowed(path, fs);
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if network outbound is allowed
|
|
55
|
+
*/
|
|
56
|
+
canConnect(host) {
|
|
57
|
+
const net = this.permissions.network;
|
|
58
|
+
if (!net?.outbound)
|
|
59
|
+
return false;
|
|
60
|
+
if (host) {
|
|
61
|
+
return this.isHostAllowed(host, net);
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if network inbound is allowed
|
|
67
|
+
*/
|
|
68
|
+
canListen(port) {
|
|
69
|
+
const net = this.permissions.network;
|
|
70
|
+
if (!net?.inbound)
|
|
71
|
+
return false;
|
|
72
|
+
// Could add port-based restrictions here
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if environment read is allowed
|
|
77
|
+
*/
|
|
78
|
+
canReadEnv(key) {
|
|
79
|
+
const env = this.permissions.env;
|
|
80
|
+
if (!env?.read)
|
|
81
|
+
return false;
|
|
82
|
+
if (key && env.allowedKeys) {
|
|
83
|
+
return env.allowedKeys.includes(key);
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if environment write is allowed
|
|
89
|
+
*/
|
|
90
|
+
canWriteEnv(key) {
|
|
91
|
+
const env = this.permissions.env;
|
|
92
|
+
if (!env?.write)
|
|
93
|
+
return false;
|
|
94
|
+
if (key && env.allowedKeys) {
|
|
95
|
+
return env.allowedKeys.includes(key);
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if process spawn is allowed
|
|
101
|
+
*/
|
|
102
|
+
canSpawnProcess(command) {
|
|
103
|
+
const proc = this.permissions.process;
|
|
104
|
+
if (!proc?.spawn)
|
|
105
|
+
return false;
|
|
106
|
+
if (command && proc.allowedCommands) {
|
|
107
|
+
return proc.allowedCommands.some(cmd => command.startsWith(cmd) || command === cmd);
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get memory limit
|
|
113
|
+
*/
|
|
114
|
+
getMemoryLimit() {
|
|
115
|
+
return this.permissions.memory?.maxBytes;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get CPU limits
|
|
119
|
+
*/
|
|
120
|
+
getCpuLimits() {
|
|
121
|
+
const cpu = this.permissions.cpu;
|
|
122
|
+
return {
|
|
123
|
+
maxPercent: cpu?.maxPercent,
|
|
124
|
+
maxTimeMs: cpu?.maxTimeMs,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if path is allowed
|
|
129
|
+
*/
|
|
130
|
+
isPathAllowed(path, fs) {
|
|
131
|
+
// Check denied paths first
|
|
132
|
+
if (fs.deniedPaths) {
|
|
133
|
+
for (const denied of fs.deniedPaths) {
|
|
134
|
+
if (path.startsWith(denied)) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Check allowed paths
|
|
140
|
+
if (fs.allowedPaths) {
|
|
141
|
+
for (const allowed of fs.allowedPaths) {
|
|
142
|
+
if (path.startsWith(allowed)) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if host is allowed
|
|
152
|
+
*/
|
|
153
|
+
isHostAllowed(host, net) {
|
|
154
|
+
// Check denied hosts first
|
|
155
|
+
if (net.deniedHosts) {
|
|
156
|
+
for (const denied of net.deniedHosts) {
|
|
157
|
+
if (host === denied || host.endsWith(`.${denied}`)) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Check allowed hosts
|
|
163
|
+
if (net.allowedHosts) {
|
|
164
|
+
for (const allowed of net.allowedHosts) {
|
|
165
|
+
if (host === allowed || host.endsWith(`.${allowed}`)) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Permission Builder
|
|
176
|
+
*
|
|
177
|
+
* Fluent API for building permission sets.
|
|
178
|
+
*/
|
|
179
|
+
export class PermissionBuilder {
|
|
180
|
+
permissions = {};
|
|
181
|
+
filesystem(options) {
|
|
182
|
+
this.permissions.fs = {
|
|
183
|
+
...this.permissions.fs,
|
|
184
|
+
...options,
|
|
185
|
+
};
|
|
186
|
+
return this;
|
|
187
|
+
}
|
|
188
|
+
network(options) {
|
|
189
|
+
this.permissions.network = {
|
|
190
|
+
...this.permissions.network,
|
|
191
|
+
...options,
|
|
192
|
+
};
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
environment(options) {
|
|
196
|
+
this.permissions.env = {
|
|
197
|
+
...this.permissions.env,
|
|
198
|
+
...options,
|
|
199
|
+
};
|
|
200
|
+
return this;
|
|
201
|
+
}
|
|
202
|
+
process(options) {
|
|
203
|
+
this.permissions.process = {
|
|
204
|
+
...this.permissions.process,
|
|
205
|
+
...options,
|
|
206
|
+
};
|
|
207
|
+
return this;
|
|
208
|
+
}
|
|
209
|
+
memory(maxBytes) {
|
|
210
|
+
this.permissions.memory = { maxBytes };
|
|
211
|
+
return this;
|
|
212
|
+
}
|
|
213
|
+
cpu(options) {
|
|
214
|
+
this.permissions.cpu = options;
|
|
215
|
+
return this;
|
|
216
|
+
}
|
|
217
|
+
build() {
|
|
218
|
+
return this.permissions;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Create permission set from level
|
|
223
|
+
*/
|
|
224
|
+
export function createPermissions(level) {
|
|
225
|
+
switch (level) {
|
|
226
|
+
case "isolated":
|
|
227
|
+
return {};
|
|
228
|
+
case "readonly":
|
|
229
|
+
return {
|
|
230
|
+
fs: { read: true },
|
|
231
|
+
};
|
|
232
|
+
case "network":
|
|
233
|
+
return {
|
|
234
|
+
fs: { read: true },
|
|
235
|
+
network: { outbound: true },
|
|
236
|
+
};
|
|
237
|
+
case "filesystem":
|
|
238
|
+
return {
|
|
239
|
+
fs: { read: true, write: true, delete: true },
|
|
240
|
+
network: { outbound: true, inbound: true },
|
|
241
|
+
};
|
|
242
|
+
case "admin":
|
|
243
|
+
return {
|
|
244
|
+
fs: { read: true, write: true, delete: true },
|
|
245
|
+
network: { outbound: true, inbound: true },
|
|
246
|
+
env: { read: true, write: true },
|
|
247
|
+
process: { spawn: true },
|
|
248
|
+
};
|
|
249
|
+
case "sudo":
|
|
250
|
+
return {
|
|
251
|
+
fs: { read: true, write: true, delete: true },
|
|
252
|
+
network: { outbound: true, inbound: true },
|
|
253
|
+
env: { read: true, write: true },
|
|
254
|
+
process: { spawn: true },
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Merge permissions (intersection - most restrictive)
|
|
260
|
+
*/
|
|
261
|
+
export function mergePermissions(...perms) {
|
|
262
|
+
const result = {};
|
|
263
|
+
// Filesystem
|
|
264
|
+
const fsPerms = perms.filter(p => p.fs);
|
|
265
|
+
if (fsPerms.length === perms.length) {
|
|
266
|
+
result.fs = {
|
|
267
|
+
read: fsPerms.every(p => p.fs?.read),
|
|
268
|
+
write: fsPerms.every(p => p.fs?.write),
|
|
269
|
+
delete: fsPerms.every(p => p.fs?.delete),
|
|
270
|
+
allowedPaths: intersectArrays(...fsPerms.map(p => p.fs?.allowedPaths).filter(Boolean)),
|
|
271
|
+
deniedPaths: unionArrays(...fsPerms.map(p => p.fs?.deniedPaths).filter(Boolean)),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
// Network
|
|
275
|
+
const netPerms = perms.filter(p => p.network);
|
|
276
|
+
if (netPerms.length === perms.length) {
|
|
277
|
+
result.network = {
|
|
278
|
+
outbound: netPerms.every(p => p.network?.outbound),
|
|
279
|
+
inbound: netPerms.every(p => p.network?.inbound),
|
|
280
|
+
allowedHosts: intersectArrays(...netPerms.map(p => p.network?.allowedHosts).filter(Boolean)),
|
|
281
|
+
deniedHosts: unionArrays(...netPerms.map(p => p.network?.deniedHosts).filter(Boolean)),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// Memory (take minimum)
|
|
285
|
+
const memoryLimits = perms
|
|
286
|
+
.map(p => p.memory?.maxBytes)
|
|
287
|
+
.filter(Boolean);
|
|
288
|
+
if (memoryLimits.length > 0) {
|
|
289
|
+
result.memory = { maxBytes: Math.min(...memoryLimits) };
|
|
290
|
+
}
|
|
291
|
+
// CPU (take minimums)
|
|
292
|
+
const cpuPerms = perms.filter(p => p.cpu);
|
|
293
|
+
if (cpuPerms.length > 0) {
|
|
294
|
+
result.cpu = {
|
|
295
|
+
maxPercent: Math.min(...cpuPerms.map(p => p.cpu?.maxPercent ?? 100)),
|
|
296
|
+
maxTimeMs: Math.min(...cpuPerms.map(p => p.cpu?.maxTimeMs ?? Infinity)),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Check if permission level implies another
|
|
303
|
+
*/
|
|
304
|
+
export function impliesPermission(level, required) {
|
|
305
|
+
const levels = [
|
|
306
|
+
"isolated",
|
|
307
|
+
"readonly",
|
|
308
|
+
"network",
|
|
309
|
+
"filesystem",
|
|
310
|
+
"admin",
|
|
311
|
+
"sudo",
|
|
312
|
+
];
|
|
313
|
+
return levels.indexOf(level) >= levels.indexOf(required);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Upgrade permissions to higher level
|
|
317
|
+
*/
|
|
318
|
+
export function upgradePermissions(current, newLevel) {
|
|
319
|
+
const newPerms = createPermissions(newLevel);
|
|
320
|
+
return mergePermissions(current, newPerms);
|
|
321
|
+
}
|
|
322
|
+
// Helper functions
|
|
323
|
+
function intersectArrays(...arrays) {
|
|
324
|
+
if (arrays.length === 0)
|
|
325
|
+
return [];
|
|
326
|
+
if (arrays.length === 1)
|
|
327
|
+
return arrays[0];
|
|
328
|
+
return arrays[0].filter(item => arrays.every(arr => arr.includes(item)));
|
|
329
|
+
}
|
|
330
|
+
function unionArrays(...arrays) {
|
|
331
|
+
const set = new Set();
|
|
332
|
+
for (const arr of arrays) {
|
|
333
|
+
for (const item of arr) {
|
|
334
|
+
set.add(item);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return Array.from(set);
|
|
338
|
+
}
|
|
339
|
+
// Re-export from types
|
|
340
|
+
export { permissionsFromLevel } from "./types.js";
|
|
341
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/core/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Primitive
|
|
3
|
+
*
|
|
4
|
+
* Executes compiled code (WASM) with resource limits and permissions.
|
|
5
|
+
* Composable: different runtimes for different isolation levels.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExecutionResult, Permissions, Limits } from "./types.js";
|
|
8
|
+
import type { CompileResult } from "./compiler.js";
|
|
9
|
+
/** Runtime options */
|
|
10
|
+
export interface RuntimeOptions {
|
|
11
|
+
permissions: Permissions;
|
|
12
|
+
limits: Limits;
|
|
13
|
+
/** Environment variables */
|
|
14
|
+
env?: Record<string, string>;
|
|
15
|
+
/** Working directory */
|
|
16
|
+
cwd?: string;
|
|
17
|
+
/** Abort signal */
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
}
|
|
20
|
+
/** Execution request */
|
|
21
|
+
export interface ExecutionRequest {
|
|
22
|
+
/** Compiled WASM */
|
|
23
|
+
wasm: CompileResult;
|
|
24
|
+
/** Entrypoint function */
|
|
25
|
+
entrypoint?: string;
|
|
26
|
+
/** Arguments to pass */
|
|
27
|
+
args?: unknown[];
|
|
28
|
+
/** Input data */
|
|
29
|
+
input?: unknown;
|
|
30
|
+
/** Previous state */
|
|
31
|
+
state?: Map<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
/** Base runtime interface */
|
|
34
|
+
export interface IRuntime {
|
|
35
|
+
/** Runtime name */
|
|
36
|
+
readonly name: string;
|
|
37
|
+
/** Runtime capabilities */
|
|
38
|
+
readonly capabilities: RuntimeCapabilities;
|
|
39
|
+
/** Initialize runtime */
|
|
40
|
+
init(): Promise<void>;
|
|
41
|
+
/** Check if runtime is available */
|
|
42
|
+
isAvailable(): Promise<boolean>;
|
|
43
|
+
/** Execute compiled code */
|
|
44
|
+
execute(request: ExecutionRequest, options: RuntimeOptions): Promise<ExecutionResult>;
|
|
45
|
+
/** Terminate runtime and cleanup resources */
|
|
46
|
+
terminate(): Promise<void>;
|
|
47
|
+
/** Check if currently executing */
|
|
48
|
+
isExecuting(): boolean;
|
|
49
|
+
}
|
|
50
|
+
/** Runtime capabilities */
|
|
51
|
+
export interface RuntimeCapabilities {
|
|
52
|
+
/** Isolation level */
|
|
53
|
+
isolation: "none" | "process" | "vm" | "wasm" | "container";
|
|
54
|
+
/** Supports state persistence */
|
|
55
|
+
stateful: boolean;
|
|
56
|
+
/** Supports async execution */
|
|
57
|
+
async: boolean;
|
|
58
|
+
/** Can access filesystem */
|
|
59
|
+
filesystem: boolean;
|
|
60
|
+
/** Can access network */
|
|
61
|
+
network: boolean;
|
|
62
|
+
/** Max memory (bytes) */
|
|
63
|
+
maxMemory: number;
|
|
64
|
+
/** Supports WASI */
|
|
65
|
+
wasi: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* WASM-in-WASM Runtime
|
|
69
|
+
*
|
|
70
|
+
* Uses @ebowwa/wasm2wasm for maximum isolation.
|
|
71
|
+
* Runs WASM bytecode inside a WASM interpreter.
|
|
72
|
+
*/
|
|
73
|
+
export declare class Wasm2WasmRuntime implements IRuntime {
|
|
74
|
+
readonly name = "wasm2wasm";
|
|
75
|
+
readonly capabilities: RuntimeCapabilities;
|
|
76
|
+
private executing;
|
|
77
|
+
init(): Promise<void>;
|
|
78
|
+
isAvailable(): Promise<boolean>;
|
|
79
|
+
execute(request: ExecutionRequest, options: RuntimeOptions): Promise<ExecutionResult>;
|
|
80
|
+
terminate(): Promise<void>;
|
|
81
|
+
isExecuting(): boolean;
|
|
82
|
+
private createErrorResult;
|
|
83
|
+
private parseMemory;
|
|
84
|
+
private parseTimeout;
|
|
85
|
+
private combineSignals;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Native WASM Runtime
|
|
89
|
+
*
|
|
90
|
+
* Uses browser/Node WebAssembly API directly.
|
|
91
|
+
* Less isolated but faster.
|
|
92
|
+
*/
|
|
93
|
+
export declare class NativeWasmRuntime implements IRuntime {
|
|
94
|
+
readonly name = "native-wasm";
|
|
95
|
+
readonly capabilities: RuntimeCapabilities;
|
|
96
|
+
private executing;
|
|
97
|
+
init(): Promise<void>;
|
|
98
|
+
isAvailable(): Promise<boolean>;
|
|
99
|
+
execute(request: ExecutionRequest, options: RuntimeOptions): Promise<ExecutionResult>;
|
|
100
|
+
terminate(): Promise<void>;
|
|
101
|
+
isExecuting(): boolean;
|
|
102
|
+
private buildImports;
|
|
103
|
+
private createErrorResult;
|
|
104
|
+
private parseTimeout;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Runtime Registry
|
|
108
|
+
*
|
|
109
|
+
* Manages available runtimes and selects appropriate one.
|
|
110
|
+
*/
|
|
111
|
+
export declare class RuntimeRegistry {
|
|
112
|
+
private runtimes;
|
|
113
|
+
register(runtime: IRuntime): void;
|
|
114
|
+
get(name: string): IRuntime | undefined;
|
|
115
|
+
has(name: string): boolean;
|
|
116
|
+
getAvailable(): Promise<string[]>;
|
|
117
|
+
/**
|
|
118
|
+
* Select best runtime for given requirements
|
|
119
|
+
*/
|
|
120
|
+
selectBest(requirements: {
|
|
121
|
+
isolation?: RuntimeCapabilities["isolation"];
|
|
122
|
+
filesystem?: boolean;
|
|
123
|
+
network?: boolean;
|
|
124
|
+
}): IRuntime | undefined;
|
|
125
|
+
}
|
|
126
|
+
export declare const defaultRuntimeRegistry: RuntimeRegistry;
|
|
127
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"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"}
|