@capsule-run/sdk 0.4.0 → 0.4.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/README.md +22 -2
- package/dist/app.d.ts +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js.map +1 -1
- package/dist/env.d.ts +22 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +61 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/task.d.ts +17 -1
- package/dist/task.d.ts.map +1 -1
- package/dist/task.js +26 -4
- package/dist/task.js.map +1 -1
- package/package.json +1 -1
- package/src/app.ts +1 -0
- package/src/env.ts +67 -0
- package/src/index.ts +1 -0
- package/src/task.ts +53 -12
package/README.md
CHANGED
|
@@ -42,7 +42,6 @@ Run it:
|
|
|
42
42
|
capsule run hello.ts
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
> [!TIP]
|
|
46
45
|
> Use `--verbose` to display real-time task execution details.
|
|
47
46
|
|
|
48
47
|
## How It Works
|
|
@@ -71,7 +70,6 @@ export const main = task({
|
|
|
71
70
|
});
|
|
72
71
|
```
|
|
73
72
|
|
|
74
|
-
> [!NOTE]
|
|
75
73
|
> The runtime requires a task named `"main"` as the entry point.
|
|
76
74
|
|
|
77
75
|
When you run `capsule run main.ts`, your code is compiled into a WebAssembly module and executed in a dedicated sandbox.
|
|
@@ -115,6 +113,7 @@ Every task returns a structured JSON envelope containing both the result and exe
|
|
|
115
113
|
| `timeout` | Maximum execution time | `string` or `number` | unlimited | `"30s"`, `"5m"` |
|
|
116
114
|
| `maxRetries` | Retry attempts on failure | `number` | `0` | `3` |
|
|
117
115
|
| `allowedFiles` | Folders accessible in the sandbox | `string[]` | `[]` | `["./data", "./output"]` |
|
|
116
|
+
| `envVariables` | Environment variables accessible in the sandbox | `string[]` | `[]` | `["API_KEY"]` |
|
|
118
117
|
|
|
119
118
|
### Compute Levels
|
|
120
119
|
|
|
@@ -171,6 +170,27 @@ Available methods:
|
|
|
171
170
|
- `files.list(path)` — List directory contents
|
|
172
171
|
- `files.exists(path)` — Check if file exists
|
|
173
172
|
|
|
173
|
+
### Environment Variables
|
|
174
|
+
|
|
175
|
+
Tasks can access environment variables to read configuration, API keys, or other runtime settings. Use the `env` API provided by the SDK:
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
import { task, env } from "@capsule-run/sdk";
|
|
179
|
+
|
|
180
|
+
export const main = task({
|
|
181
|
+
name: "main",
|
|
182
|
+
envVariables: ["API_KEY"]
|
|
183
|
+
}, () => {
|
|
184
|
+
const apiKey = env.get("API_KEY");
|
|
185
|
+
return { apiKeySet: apiKey !== undefined };
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Available methods:
|
|
190
|
+
- `env.get(key)` — Get a specific environment variable (returns `undefined` if not found)
|
|
191
|
+
- `env.has(key)` — Check if an environment variable exists
|
|
192
|
+
- `env.getAll()` — Get all environment variables as an object
|
|
193
|
+
|
|
174
194
|
## Compatibility
|
|
175
195
|
|
|
176
196
|
✅ **Supported:**
|
package/dist/app.d.ts
CHANGED
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG;IACzD,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC5D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,UAAU,GACjB,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAE3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAQD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuC7C;AAED,eAAO,MAAM,OAAO,YAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG;IACzD,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAID;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC5D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,UAAU,GACjB,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAE3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAQD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuC7C;AAED,eAAO,MAAM,OAAO,YAAmB,CAAC"}
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,MAAM,KAAK,GAA+B,IAAI,GAAG,EAAE,CAAC;AAEpD;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,IAAO,EACP,MAAkB;IAElB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AAQD;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACrB;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,QAAgB;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAa,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;YAEjC,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAEjC,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACrC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAChD,IAAI,aAAa,EAAE,CAAC;oBAClB,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,uDAAuD,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3F,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;YAEzC,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC;gBACjC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,CAAC,YAAY,KAAK;gBACjC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE;gBAClC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC"}
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capsule Environment API for WASM environment variables access.
|
|
3
|
+
* Based on wasi:cli/environment@0.2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Returns all environment variables as an object.
|
|
7
|
+
* * @returns An object where keys are variable names and values are their values.
|
|
8
|
+
* @example { "PORT": "8080" }
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAll(): Record<string, string>;
|
|
11
|
+
/**
|
|
12
|
+
* Get the value of a specific environment variable.
|
|
13
|
+
* * @param key - The name of the environment variable.
|
|
14
|
+
* @returns The value of the variable, or undefined if not found.
|
|
15
|
+
*/
|
|
16
|
+
export declare function get(key: string): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Check if an environment variable exists.
|
|
19
|
+
* * @param key - The name of the environment variable.
|
|
20
|
+
*/
|
|
21
|
+
export declare function has(key: string): boolean;
|
|
22
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW/C;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWnD;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExC"}
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capsule Environment API for WASM environment variables access.
|
|
3
|
+
* Based on wasi:cli/environment@0.2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Internal helper to safely get the WASI environment bindings.
|
|
7
|
+
*/
|
|
8
|
+
function getEnvBindings() {
|
|
9
|
+
try {
|
|
10
|
+
const env = globalThis['wasi:cli/environment'];
|
|
11
|
+
if (env && typeof env.getEnvironment === 'function') {
|
|
12
|
+
return env;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch { }
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Returns all environment variables as an object.
|
|
20
|
+
* * @returns An object where keys are variable names and values are their values.
|
|
21
|
+
* @example { "PORT": "8080" }
|
|
22
|
+
*/
|
|
23
|
+
export function getAll() {
|
|
24
|
+
const bindings = getEnvBindings();
|
|
25
|
+
if (!bindings)
|
|
26
|
+
return {};
|
|
27
|
+
try {
|
|
28
|
+
const envList = bindings.getEnvironment();
|
|
29
|
+
return Object.fromEntries(envList);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
console.error("Failed to fetch environment variables:", e);
|
|
33
|
+
return {};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the value of a specific environment variable.
|
|
38
|
+
* * @param key - The name of the environment variable.
|
|
39
|
+
* @returns The value of the variable, or undefined if not found.
|
|
40
|
+
*/
|
|
41
|
+
export function get(key) {
|
|
42
|
+
const bindings = getEnvBindings();
|
|
43
|
+
if (!bindings)
|
|
44
|
+
return undefined;
|
|
45
|
+
try {
|
|
46
|
+
const envList = bindings.getEnvironment();
|
|
47
|
+
const entry = envList.find(([k]) => k === key);
|
|
48
|
+
return entry ? entry[1] : undefined;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if an environment variable exists.
|
|
56
|
+
* * @param key - The name of the environment variable.
|
|
57
|
+
*/
|
|
58
|
+
export function has(key) {
|
|
59
|
+
return get(key) !== undefined;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACpD,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM;IACpB,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;AAChC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,5 +16,6 @@
|
|
|
16
16
|
export { task, type TaskOptions } from "./task.js";
|
|
17
17
|
export { TaskRunner, exports, type TaskConfig } from "./app.js";
|
|
18
18
|
export * as files from "./files.js";
|
|
19
|
+
export * as env from "./env.js";
|
|
19
20
|
export { isWasmMode } from "./hostApi.js";
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAoB,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAoB,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AAChE,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/task.d.ts
CHANGED
|
@@ -21,6 +21,22 @@ export interface TaskOptions {
|
|
|
21
21
|
maxRetries?: number;
|
|
22
22
|
/** Files/folders accessible in the sandbox, e.g., ["./data"] */
|
|
23
23
|
allowedFiles?: string[];
|
|
24
|
+
/** Environment variables available from your .env file for the task */
|
|
25
|
+
envVariables?: string[];
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
interface TaskResult<T> {
|
|
28
|
+
success: boolean;
|
|
29
|
+
result: T;
|
|
30
|
+
error: string | null;
|
|
31
|
+
execution: TaskExecution;
|
|
32
|
+
}
|
|
33
|
+
interface TaskExecution {
|
|
34
|
+
task_name: string;
|
|
35
|
+
duration_ms: number;
|
|
36
|
+
retries: number;
|
|
37
|
+
fuel_consumed: number;
|
|
38
|
+
}
|
|
39
|
+
type TaskReturnType<T> = T extends Promise<infer U> ? Promise<TaskResult<U>> : TaskResult<T>;
|
|
40
|
+
export declare function task<TArgs extends any[], TReturn>(options: TaskOptions, fn: (...args: TArgs) => TReturn): (...args: TArgs) => TaskReturnType<TReturn>;
|
|
41
|
+
export {};
|
|
26
42
|
//# sourceMappingURL=task.d.ts.map
|
package/dist/task.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7C,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,UAAU,UAAU,CAAC,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,CAAC,CAAC;IACV,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,UAAU,aAAa;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACzB;AAID,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAC/C,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GACtB,UAAU,CAAC,CAAC,CAAC,CAAC;AA+ClB,wBAAgB,IAAI,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,EAC/C,OAAO,EAAE,WAAW,EACpB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,GAC9B,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,cAAc,CAAC,OAAO,CAAC,CA6D7C"}
|
package/dist/task.js
CHANGED
|
@@ -60,17 +60,39 @@ export function task(options, fn) {
|
|
|
60
60
|
timeout: normalizeTimeout(options.timeout),
|
|
61
61
|
maxRetries: options.maxRetries,
|
|
62
62
|
allowedFiles: options.allowedFiles,
|
|
63
|
+
envVariables: options.envVariables,
|
|
63
64
|
};
|
|
64
65
|
const wrapper = (...args) => {
|
|
65
66
|
if (!isWasmMode()) {
|
|
66
|
-
|
|
67
|
+
const result = fn(...args);
|
|
68
|
+
if (result instanceof Promise) {
|
|
69
|
+
return result.then((value) => ({
|
|
70
|
+
success: true,
|
|
71
|
+
result: value,
|
|
72
|
+
error: null,
|
|
73
|
+
execution: {
|
|
74
|
+
task_name: taskName,
|
|
75
|
+
duration_ms: 0,
|
|
76
|
+
retries: 0,
|
|
77
|
+
fuel_consumed: 0,
|
|
78
|
+
},
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
result,
|
|
84
|
+
error: null,
|
|
85
|
+
execution: {
|
|
86
|
+
task_name: taskName,
|
|
87
|
+
duration_ms: 0,
|
|
88
|
+
retries: 0,
|
|
89
|
+
fuel_consumed: 0,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
67
92
|
}
|
|
68
93
|
const resultJson = callHost(taskName, args, taskConfig);
|
|
69
94
|
try {
|
|
70
95
|
const result = JSON.parse(resultJson);
|
|
71
|
-
if (result.error) {
|
|
72
|
-
throw new Error(`Task ${taskName} failed: ${result.error}`);
|
|
73
|
-
}
|
|
74
96
|
return result;
|
|
75
97
|
}
|
|
76
98
|
catch (e) {
|
package/dist/task.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AA2CpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,OAAyB;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,GAAG,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,OAAoB,EACpB,EAA+B;IAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9B,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC;IAEpE,MAAM,UAAU,GAAe;QAC7B,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;QAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,GAAG,IAAW,EAA2B,EAAE;QAC1D,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAE3B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC7B,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,IAAI;oBACX,SAAS,EAAE;wBACT,SAAS,EAAE,QAAQ;wBACnB,WAAW,EAAE,CAAC;wBACd,OAAO,EAAE,CAAC;wBACV,aAAa,EAAE,CAAC;qBACjB;iBACF,CAAC,CAA4B,CAAC;YACjC,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM;gBACN,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE;oBACT,SAAS,EAAE,QAAQ;oBACnB,WAAW,EAAE,CAAC;oBACd,OAAO,EAAE,CAAC;oBACV,aAAa,EAAE,CAAC;iBACjB;aACyB,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,MAAM,GAAiC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpE,OAAO,MAAiC,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;gBAC7B,OAAO,UAAgD,CAAC;YAC1D,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAC;IAEF,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IAEvC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
package/src/app.ts
CHANGED
package/src/env.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capsule Environment API for WASM environment variables access.
|
|
3
|
+
* Based on wasi:cli/environment@0.2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
declare const globalThis: {
|
|
7
|
+
'wasi:cli/environment': {
|
|
8
|
+
getEnvironment(): [string, string][];
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Internal helper to safely get the WASI environment bindings.
|
|
14
|
+
*/
|
|
15
|
+
function getEnvBindings() {
|
|
16
|
+
try {
|
|
17
|
+
const env = globalThis['wasi:cli/environment'];
|
|
18
|
+
if (env && typeof env.getEnvironment === 'function') {
|
|
19
|
+
return env;
|
|
20
|
+
}
|
|
21
|
+
} catch {}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns all environment variables as an object.
|
|
27
|
+
* * @returns An object where keys are variable names and values are their values.
|
|
28
|
+
* @example { "PORT": "8080" }
|
|
29
|
+
*/
|
|
30
|
+
export function getAll(): Record<string, string> {
|
|
31
|
+
const bindings = getEnvBindings();
|
|
32
|
+
if (!bindings) return {};
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
const envList = bindings.getEnvironment();
|
|
36
|
+
return Object.fromEntries(envList);
|
|
37
|
+
} catch (e) {
|
|
38
|
+
console.error("Failed to fetch environment variables:", e);
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get the value of a specific environment variable.
|
|
45
|
+
* * @param key - The name of the environment variable.
|
|
46
|
+
* @returns The value of the variable, or undefined if not found.
|
|
47
|
+
*/
|
|
48
|
+
export function get(key: string): string | undefined {
|
|
49
|
+
const bindings = getEnvBindings();
|
|
50
|
+
if (!bindings) return undefined;
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const envList = bindings.getEnvironment();
|
|
54
|
+
const entry = envList.find(([k]) => k === key);
|
|
55
|
+
return entry ? entry[1] : undefined;
|
|
56
|
+
} catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Check if an environment variable exists.
|
|
63
|
+
* * @param key - The name of the environment variable.
|
|
64
|
+
*/
|
|
65
|
+
export function has(key: string): boolean {
|
|
66
|
+
return get(key) !== undefined;
|
|
67
|
+
}
|
package/src/index.ts
CHANGED
package/src/task.ts
CHANGED
|
@@ -25,13 +25,30 @@ export interface TaskOptions {
|
|
|
25
25
|
maxRetries?: number;
|
|
26
26
|
/** Files/folders accessible in the sandbox, e.g., ["./data"] */
|
|
27
27
|
allowedFiles?: string[];
|
|
28
|
+
/** Environment variables available from your .env file for the task */
|
|
29
|
+
envVariables?: string[];
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
interface TaskResult {
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
interface TaskResult<T> {
|
|
33
|
+
success: boolean;
|
|
34
|
+
result: T;
|
|
35
|
+
error: string | null;
|
|
36
|
+
execution: TaskExecution;
|
|
33
37
|
}
|
|
34
38
|
|
|
39
|
+
interface TaskExecution {
|
|
40
|
+
task_name: string;
|
|
41
|
+
duration_ms: number;
|
|
42
|
+
retries: number;
|
|
43
|
+
fuel_consumed: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type Awaited<T> = T extends Promise<infer U> ? U : T;
|
|
47
|
+
|
|
48
|
+
type TaskReturnType<T> = T extends Promise<infer U>
|
|
49
|
+
? Promise<TaskResult<U>>
|
|
50
|
+
: TaskResult<T>;
|
|
51
|
+
|
|
35
52
|
/**
|
|
36
53
|
* Define a Capsule task with configuration.
|
|
37
54
|
*
|
|
@@ -80,7 +97,7 @@ function normalizeTimeout(timeout?: string | number): string | undefined {
|
|
|
80
97
|
export function task<TArgs extends any[], TReturn>(
|
|
81
98
|
options: TaskOptions,
|
|
82
99
|
fn: (...args: TArgs) => TReturn
|
|
83
|
-
): (...args: TArgs) => TReturn {
|
|
100
|
+
): (...args: TArgs) => TaskReturnType<TReturn> {
|
|
84
101
|
const taskName = options.name;
|
|
85
102
|
let compute = options.compute?.toString().toUpperCase() ?? "MEDIUM";
|
|
86
103
|
|
|
@@ -91,24 +108,48 @@ export function task<TArgs extends any[], TReturn>(
|
|
|
91
108
|
timeout: normalizeTimeout(options.timeout),
|
|
92
109
|
maxRetries: options.maxRetries,
|
|
93
110
|
allowedFiles: options.allowedFiles,
|
|
111
|
+
envVariables: options.envVariables,
|
|
94
112
|
};
|
|
95
113
|
|
|
96
|
-
const wrapper = (...args: TArgs): TReturn => {
|
|
114
|
+
const wrapper = (...args: TArgs): TaskReturnType<TReturn> => {
|
|
97
115
|
if (!isWasmMode()) {
|
|
98
|
-
|
|
116
|
+
const result = fn(...args);
|
|
117
|
+
|
|
118
|
+
if (result instanceof Promise) {
|
|
119
|
+
return result.then((value) => ({
|
|
120
|
+
success: true,
|
|
121
|
+
result: value,
|
|
122
|
+
error: null,
|
|
123
|
+
execution: {
|
|
124
|
+
task_name: taskName,
|
|
125
|
+
duration_ms: 0,
|
|
126
|
+
retries: 0,
|
|
127
|
+
fuel_consumed: 0,
|
|
128
|
+
},
|
|
129
|
+
})) as TaskReturnType<TReturn>;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
success: true,
|
|
134
|
+
result,
|
|
135
|
+
error: null,
|
|
136
|
+
execution: {
|
|
137
|
+
task_name: taskName,
|
|
138
|
+
duration_ms: 0,
|
|
139
|
+
retries: 0,
|
|
140
|
+
fuel_consumed: 0,
|
|
141
|
+
},
|
|
142
|
+
} as TaskReturnType<TReturn>;
|
|
99
143
|
}
|
|
100
144
|
|
|
101
145
|
const resultJson = callHost(taskName, args, taskConfig);
|
|
102
146
|
|
|
103
147
|
try {
|
|
104
|
-
const result: TaskResult = JSON.parse(resultJson);
|
|
105
|
-
|
|
106
|
-
throw new Error(`Task ${taskName} failed: ${result.error}`);
|
|
107
|
-
}
|
|
108
|
-
return result as TReturn;
|
|
148
|
+
const result: TaskResult<Awaited<TReturn>> = JSON.parse(resultJson);
|
|
149
|
+
return result as TaskReturnType<TReturn>;
|
|
109
150
|
} catch (e) {
|
|
110
151
|
if (e instanceof SyntaxError) {
|
|
111
|
-
return resultJson as unknown as TReturn
|
|
152
|
+
return resultJson as unknown as TaskReturnType<TReturn>;
|
|
112
153
|
}
|
|
113
154
|
throw e;
|
|
114
155
|
}
|