@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 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
@@ -12,6 +12,7 @@ export interface TaskConfig {
12
12
  timeout?: string;
13
13
  maxRetries?: number;
14
14
  allowedFiles?: string[];
15
+ envVariables?: string[];
15
16
  }
16
17
  /**
17
18
  * Register a task function by name with its configuration.
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;AAgBH,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"}
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
@@ -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
@@ -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
@@ -16,5 +16,6 @@
16
16
  export { task } from "./task.js";
17
17
  export { TaskRunner, exports } 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.js.map
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
- export declare function task<TArgs extends any[], TReturn>(options: TaskOptions, fn: (...args: TArgs) => TReturn): (...args: TArgs) => TReturn;
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
@@ -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;AAoDD,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,OAAO,CAqC7B"}
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
- return fn(...args);
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;AA0BpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;KACnC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,GAAG,IAAW,EAAW,EAAE;QAC1C,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,MAAM,GAAe,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,MAAiB,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;gBAC7B,OAAO,UAAgC,CAAC;YAC1C,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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capsule-run/sdk",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Capsule JavaScript SDK - run AI agent tasks in secure WASM sandboxes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/app.ts CHANGED
@@ -14,6 +14,7 @@ export interface TaskConfig {
14
14
  timeout?: string;
15
15
  maxRetries?: number;
16
16
  allowedFiles?: string[];
17
+ envVariables?: string[];
17
18
  }
18
19
 
19
20
  const TASKS: Map<string, TaskInfo<any>> = new Map();
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
@@ -17,5 +17,6 @@
17
17
  export { task, type TaskOptions } from "./task.js";
18
18
  export { TaskRunner, exports, type TaskConfig } from "./app.js";
19
19
  export * as files from "./files.js";
20
+ export * as env from "./env.js";
20
21
  export { isWasmMode } from "./hostApi.js";
21
22
 
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
- result?: any;
32
- error?: string;
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
- return fn(...args);
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
- if (result.error) {
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
  }