spell-runtime 1.2.0 → 1.2.5

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.
Files changed (41) hide show
  1. package/README.md +171 -16
  2. package/README.txt +145 -16
  3. package/dist/api/server.js +128 -21
  4. package/dist/api/server.js.map +1 -1
  5. package/dist/bundle/install.d.ts +1 -1
  6. package/dist/bundle/install.js +120 -6
  7. package/dist/bundle/install.js.map +1 -1
  8. package/dist/cli/index.js +44 -6
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/license/entitlement.d.ts +28 -0
  11. package/dist/license/entitlement.js +174 -0
  12. package/dist/license/entitlement.js.map +1 -0
  13. package/dist/license/store.d.ts +16 -0
  14. package/dist/license/store.js +271 -0
  15. package/dist/license/store.js.map +1 -0
  16. package/dist/policy/index.d.ts +26 -0
  17. package/dist/policy/index.js +194 -0
  18. package/dist/policy/index.js.map +1 -0
  19. package/dist/runner/cast.js +37 -3
  20. package/dist/runner/cast.js.map +1 -1
  21. package/dist/runner/dockerRunner.d.ts +2 -1
  22. package/dist/runner/dockerRunner.js +148 -13
  23. package/dist/runner/dockerRunner.js.map +1 -1
  24. package/dist/runner/hostRunner.d.ts +1 -1
  25. package/dist/runner/hostRunner.js +30 -3
  26. package/dist/runner/hostRunner.js.map +1 -1
  27. package/dist/runner/runtimeLimits.d.ts +6 -0
  28. package/dist/runner/runtimeLimits.js +48 -0
  29. package/dist/runner/runtimeLimits.js.map +1 -0
  30. package/dist/runner/spell-runner.js +0 -0
  31. package/dist/steps/httpStep.d.ts +1 -1
  32. package/dist/steps/httpStep.js +20 -6
  33. package/dist/steps/httpStep.js.map +1 -1
  34. package/dist/steps/shellStep.d.ts +5 -1
  35. package/dist/steps/shellStep.js +33 -7
  36. package/dist/steps/shellStep.js.map +1 -1
  37. package/dist/types.d.ts +4 -0
  38. package/dist/util/paths.d.ts +1 -0
  39. package/dist/util/paths.js +5 -0
  40. package/dist/util/paths.js.map +1 -1
  41. package/package.json +9 -1
@@ -4,12 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.runDocker = runDocker;
7
+ exports.buildDockerArgs = buildDockerArgs;
7
8
  const promises_1 = require("node:fs/promises");
8
9
  const node_os_1 = require("node:os");
9
10
  const node_path_1 = __importDefault(require("node:path"));
10
11
  const node_child_process_1 = require("node:child_process");
11
12
  const errors_1 = require("../util/errors");
12
- async function runDocker(manifest, bundlePath, input) {
13
+ const runtimeLimits_1 = require("./runtimeLimits");
14
+ const DEFAULT_DOCKER_NETWORK = "none";
15
+ const DEFAULT_DOCKER_USER = "65532:65532";
16
+ const DEFAULT_DOCKER_PIDS_LIMIT = 256;
17
+ async function runDocker(manifest, bundlePath, input, executionTimeoutMs) {
13
18
  const dockerImage = manifest.runtime.docker_image;
14
19
  if (!dockerImage) {
15
20
  throw new errors_1.SpellError("runtime.docker_image is required when runtime.execution=docker");
@@ -19,7 +24,10 @@ async function runDocker(manifest, bundlePath, input) {
19
24
  await (0, promises_1.writeFile)(inputPath, JSON.stringify(input), "utf8");
20
25
  try {
21
26
  const args = buildDockerArgs(dockerImage, bundlePath, tempDir, manifest);
22
- const { code, stdout, stderr } = await runProcess("docker", args, process.cwd());
27
+ const { code, stdout, stderr, timedOut } = await runProcess("docker", args, process.cwd(), executionTimeoutMs);
28
+ if (timedOut && executionTimeoutMs !== undefined) {
29
+ throw new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs));
30
+ }
23
31
  if (code !== 0) {
24
32
  throw new errors_1.SpellError(stderr.trim() || `docker exited with code ${code}`);
25
33
  }
@@ -40,13 +48,22 @@ async function runDocker(manifest, bundlePath, input) {
40
48
  await (0, promises_1.rm)(tempDir, { recursive: true, force: true });
41
49
  }
42
50
  }
43
- function buildDockerArgs(dockerImage, bundlePath, tempDir, manifest) {
51
+ function buildDockerArgs(dockerImage, bundlePath, tempDir, manifest, env = process.env) {
44
52
  const inputInContainer = "/tmp/spell-input/input.json";
45
- const envVars = collectEnvVarsToPass(manifest);
53
+ const envVars = collectEnvVarsToPass(manifest, env);
54
+ const dockerRunConfig = readDockerRunConfig(env);
46
55
  const args = [
47
56
  "run",
48
57
  "--rm",
49
58
  "-i",
59
+ "--network",
60
+ dockerRunConfig.network,
61
+ "--cap-drop",
62
+ "ALL",
63
+ "--security-opt",
64
+ "no-new-privileges",
65
+ "--tmpfs",
66
+ "/tmp:rw,noexec,nosuid,size=64m",
50
67
  "--workdir",
51
68
  "/spell",
52
69
  "-v",
@@ -56,24 +73,126 @@ function buildDockerArgs(dockerImage, bundlePath, tempDir, manifest) {
56
73
  "-e",
57
74
  `INPUT_JSON=${inputInContainer}`
58
75
  ];
76
+ if (dockerRunConfig.readOnly) {
77
+ args.push("--read-only");
78
+ }
79
+ if (dockerRunConfig.user !== undefined) {
80
+ args.push("--user", dockerRunConfig.user);
81
+ }
82
+ if (dockerRunConfig.pidsLimit !== undefined) {
83
+ args.push("--pids-limit", String(dockerRunConfig.pidsLimit));
84
+ }
85
+ if (dockerRunConfig.memory !== undefined) {
86
+ args.push("--memory", dockerRunConfig.memory);
87
+ }
88
+ if (dockerRunConfig.cpus !== undefined) {
89
+ args.push("--cpus", dockerRunConfig.cpus);
90
+ }
59
91
  for (const [key, value] of envVars) {
60
92
  args.push("-e", `${key}=${value}`);
61
93
  }
62
94
  args.push(dockerImage, "spell-runner", "/spell/spell.yaml", inputInContainer);
63
95
  return args;
64
96
  }
65
- function collectEnvVarsToPass(manifest) {
97
+ function collectEnvVarsToPass(manifest, env = process.env) {
66
98
  const out = [];
67
- // pass connector tokens only (and fail earlier if missing)
99
+ // pass connector tokens (and fail earlier if missing)
68
100
  for (const permission of manifest.permissions) {
69
101
  const tokenKey = `CONNECTOR_${permission.connector.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_TOKEN`;
70
- const value = process.env[tokenKey];
102
+ const value = env[tokenKey];
71
103
  if (typeof value === "string" && value.trim() !== "") {
72
104
  out.push([tokenKey, value]);
73
105
  }
74
106
  }
107
+ const stepTimeout = env.SPELL_RUNTIME_STEP_TIMEOUT_MS;
108
+ if (typeof stepTimeout === "string" && stepTimeout.trim() !== "") {
109
+ out.push(["SPELL_RUNTIME_STEP_TIMEOUT_MS", stepTimeout.trim()]);
110
+ }
75
111
  return out;
76
112
  }
113
+ function readDockerRunConfig(env) {
114
+ return {
115
+ network: readDockerNetwork(env),
116
+ user: readDockerUser(env),
117
+ readOnly: readDockerReadOnly(env),
118
+ pidsLimit: readDockerPidsLimit(env),
119
+ memory: readDockerMemory(env),
120
+ cpus: readDockerCpus(env)
121
+ };
122
+ }
123
+ function readDockerNetwork(env) {
124
+ const raw = env.SPELL_DOCKER_NETWORK;
125
+ const value = raw === undefined || raw.trim() === "" ? DEFAULT_DOCKER_NETWORK : raw.trim();
126
+ if (value === "none" || value === "bridge" || value === "host") {
127
+ return value;
128
+ }
129
+ throw new errors_1.SpellError("SPELL_DOCKER_NETWORK must be one of: none, bridge, host");
130
+ }
131
+ function readDockerUser(env) {
132
+ const raw = env.SPELL_DOCKER_USER;
133
+ if (raw === undefined) {
134
+ return DEFAULT_DOCKER_USER;
135
+ }
136
+ const value = raw.trim();
137
+ if (value === "") {
138
+ return undefined;
139
+ }
140
+ if (/\s/.test(value)) {
141
+ throw new errors_1.SpellError("SPELL_DOCKER_USER must not contain whitespace");
142
+ }
143
+ return value;
144
+ }
145
+ function readDockerReadOnly(env) {
146
+ const raw = env.SPELL_DOCKER_READ_ONLY;
147
+ if (raw === undefined || raw.trim() === "") {
148
+ return true;
149
+ }
150
+ const value = raw.trim();
151
+ if (value === "1") {
152
+ return true;
153
+ }
154
+ if (value === "0") {
155
+ return false;
156
+ }
157
+ throw new errors_1.SpellError("SPELL_DOCKER_READ_ONLY must be '1' or '0'");
158
+ }
159
+ function readDockerPidsLimit(env) {
160
+ const raw = env.SPELL_DOCKER_PIDS_LIMIT;
161
+ if (raw === undefined || raw.trim() === "") {
162
+ return DEFAULT_DOCKER_PIDS_LIMIT;
163
+ }
164
+ const value = Number(raw);
165
+ if (!Number.isInteger(value) || value < 0) {
166
+ throw new errors_1.SpellError("SPELL_DOCKER_PIDS_LIMIT must be an integer >= 0");
167
+ }
168
+ if (value === 0) {
169
+ return undefined;
170
+ }
171
+ return value;
172
+ }
173
+ function readDockerMemory(env) {
174
+ const raw = env.SPELL_DOCKER_MEMORY;
175
+ if (raw === undefined || raw.trim() === "") {
176
+ return undefined;
177
+ }
178
+ const value = raw.trim();
179
+ if (!/^\d+[bkmg]?$/i.test(value)) {
180
+ throw new errors_1.SpellError("SPELL_DOCKER_MEMORY must be a positive integer optionally suffixed with b, k, m, or g");
181
+ }
182
+ return value;
183
+ }
184
+ function readDockerCpus(env) {
185
+ const raw = env.SPELL_DOCKER_CPUS;
186
+ if (raw === undefined || raw.trim() === "") {
187
+ return undefined;
188
+ }
189
+ const value = raw.trim();
190
+ const parsed = Number(value);
191
+ if (!Number.isFinite(parsed) || parsed <= 0) {
192
+ throw new errors_1.SpellError("SPELL_DOCKER_CPUS must be a number > 0");
193
+ }
194
+ return value;
195
+ }
77
196
  function parseRunnerJson(stdout) {
78
197
  const trimmed = stdout.trim();
79
198
  if (!trimmed) {
@@ -98,7 +217,7 @@ function parseRunnerJson(stdout) {
98
217
  checks: Array.isArray(obj.checks) ? obj.checks : []
99
218
  };
100
219
  }
101
- async function runProcess(command, args, cwd) {
220
+ async function runProcess(command, args, cwd, timeoutMs) {
102
221
  const child = (0, node_child_process_1.spawn)(command, args, {
103
222
  shell: false,
104
223
  cwd,
@@ -112,10 +231,26 @@ async function runProcess(command, args, cwd) {
112
231
  child.stderr.on("data", (chunk) => {
113
232
  stderr += chunk.toString();
114
233
  });
115
- const code = await new Promise((resolve, reject) => {
116
- child.once("error", reject);
117
- child.once("close", (exitCode) => resolve(exitCode ?? 1));
118
- });
119
- return { code, stdout, stderr };
234
+ let timedOut = false;
235
+ let timer;
236
+ if (timeoutMs !== undefined) {
237
+ timer = setTimeout(() => {
238
+ timedOut = true;
239
+ child.kill("SIGKILL");
240
+ }, timeoutMs);
241
+ }
242
+ let code;
243
+ try {
244
+ code = await new Promise((resolve, reject) => {
245
+ child.once("error", reject);
246
+ child.once("close", (exitCode) => resolve(exitCode ?? 1));
247
+ });
248
+ }
249
+ finally {
250
+ if (timer) {
251
+ clearTimeout(timer);
252
+ }
253
+ }
254
+ return { code, stdout, stderr, timedOut };
120
255
  }
121
256
  //# sourceMappingURL=dockerRunner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dockerRunner.js","sourceRoot":"","sources":["../../src/runner/dockerRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dockerRunner.js","sourceRoot":"","sources":["../../src/runner/dockerRunner.ts"],"names":[],"mappings":";;;;;AA+BA,8BA0CC;AAED,0CA2DC;AAtID,+CAA0D;AAC1D,qCAAiC;AACjC,0DAA6B;AAC7B,2DAA2C;AAE3C,2CAA4C;AAC5C,mDAAgE;AAahE,MAAM,sBAAsB,GAAsB,MAAM,CAAC;AACzD,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAC1C,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAU/B,KAAK,UAAU,SAAS,CAC7B,QAA6B,EAC7B,UAAkB,EAClB,KAA8B,EAC9B,kBAA2B;IAE3B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,mBAAU,CAAC,gEAAgE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,mBAAI,CAAC,IAAI,CAAC,IAAA,gBAAM,GAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,IAAA,oBAAS,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAE/G,IAAI,QAAQ,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACjD,MAAM,IAAI,mBAAU,CAAC,IAAA,6CAA6B,EAAC,kBAAkB,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,mBAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,2BAA2B,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,mBAAU,CAAC,MAAM,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAI,KAAe,CAAC,OAAO,CAAC;QACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,mBAAU,CAAC,2DAA2D,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,IAAA,aAAE,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC7B,WAAmB,EACnB,UAAkB,EAClB,OAAe,EACf,QAA6B,EAC7B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;IACvD,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAa;QACrB,KAAK;QACL,MAAM;QACN,IAAI;QACJ,WAAW;QACX,eAAe,CAAC,OAAO;QACvB,YAAY;QACZ,KAAK;QACL,gBAAgB;QAChB,mBAAmB;QACnB,SAAS;QACT,gCAAgC;QAChC,WAAW;QACX,QAAQ;QACR,IAAI;QACJ,GAAG,mBAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY;QACvC,IAAI;QACJ,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB;QAC9C,IAAI;QACJ,cAAc,gBAAgB,EAAE;KACjC,CAAC;IAEF,IAAI,eAAe,CAAC,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,eAAe,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA6B,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC/F,MAAM,GAAG,GAA4B,EAAE,CAAC;IAExC,sDAAsD;IACtD,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,aAAa,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC;QACpG,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,6BAA6B,CAAC;IACtD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,CAAC,+BAA+B,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAsB;IACjD,OAAO;QACL,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC;QAC/B,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC;QACzB,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC;QACjC,SAAS,EAAE,mBAAmB,CAAC,GAAG,CAAC;QACnC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC;QAC7B,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAsB;IAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,oBAAoB,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3F,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,mBAAU,CAAC,yDAAyD,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,cAAc,CAAC,GAAsB;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,mBAAU,CAAC,+CAA+C,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAsB;IAChD,MAAM,GAAG,GAAG,GAAG,CAAC,sBAAsB,CAAC;IACvC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,mBAAU,CAAC,2CAA2C,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAsB;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,mBAAU,CAAC,iDAAiD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAsB;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,mBAAmB,CAAC;IACpC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,mBAAU,CAAC,uFAAuF,CAAC,CAAC;IAChH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAAsB;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,mBAAU,CAAC,wCAAwC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,mBAAU,CAAC,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,mBAAU,CAAC,2CAA2C,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,mBAAU,CAAC,4CAA4C,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAC7B,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC5D,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,WAA4B,CAAC,CAAC,CAAC,EAAE;QACpF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,OAAmC,CAAC,CAAC,CAAC,EAAE;QACtI,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,MAAwB,CAAC,CAAC,CAAC,EAAE;KACvE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,IAAc,EACd,GAAW,EACX,SAAkB;IAElB,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE,IAAI,EAAE;QACjC,KAAK,EAAE,KAAK;QACZ,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,KAAiC,CAAC;IACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC5C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { SpellBundleManifest, StepResult } from "../types";
2
- export declare function runHost(manifest: SpellBundleManifest, bundlePath: string, input: Record<string, unknown>): Promise<{
2
+ export declare function runHost(manifest: SpellBundleManifest, bundlePath: string, input: Record<string, unknown>, executionTimeoutMs?: number): Promise<{
3
3
  outputs: Record<string, unknown>;
4
4
  stepResults: StepResult[];
5
5
  }>;
@@ -10,10 +10,12 @@ const node_path_1 = __importDefault(require("node:path"));
10
10
  const errors_1 = require("../util/errors");
11
11
  const httpStep_1 = require("../steps/httpStep");
12
12
  const shellStep_1 = require("../steps/shellStep");
13
- async function runHost(manifest, bundlePath, input) {
13
+ const runtimeLimits_1 = require("./runtimeLimits");
14
+ async function runHost(manifest, bundlePath, input, executionTimeoutMs) {
14
15
  const tempDir = await (0, promises_1.mkdtemp)(node_path_1.default.join((0, node_os_1.tmpdir)(), "spell-input-"));
15
16
  const inputPath = node_path_1.default.join(tempDir, "input.json");
16
17
  await (0, promises_1.writeFile)(inputPath, JSON.stringify(input), "utf8");
18
+ const executionDeadlineMs = executionTimeoutMs !== undefined ? Date.now() + executionTimeoutMs : undefined;
17
19
  const env = {
18
20
  ...process.env,
19
21
  INPUT_JSON: inputPath
@@ -22,14 +24,21 @@ async function runHost(manifest, bundlePath, input) {
22
24
  const stepResults = [];
23
25
  for (const step of manifest.steps) {
24
26
  const runPath = node_path_1.default.resolve(bundlePath, step.run);
27
+ const remainingExecutionMs = executionDeadlineMs !== undefined ? executionDeadlineMs - Date.now() : undefined;
28
+ if (remainingExecutionMs !== undefined && remainingExecutionMs <= 0) {
29
+ throw new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs, step.name));
30
+ }
25
31
  if (step.uses === "shell") {
26
- const result = await (0, shellStep_1.runShellStep)(step, runPath, bundlePath, env);
32
+ const result = await (0, shellStep_1.runShellStep)(step, runPath, bundlePath, env, {
33
+ maxDurationMs: remainingExecutionMs,
34
+ executionTimeoutMs
35
+ });
27
36
  stepResults.push(result.stepResult);
28
37
  outputs[`step.${step.name}.stdout`] = result.stdout;
29
38
  continue;
30
39
  }
31
40
  if (step.uses === "http") {
32
- const result = await (0, httpStep_1.runHttpStep)(step, runPath, input, env);
41
+ const result = await runHttpStepWithExecutionTimeout(step, runPath, input, env, remainingExecutionMs, executionTimeoutMs);
33
42
  stepResults.push(result.stepResult);
34
43
  outputs[`step.${step.name}.json`] = result.responseBody;
35
44
  continue;
@@ -38,4 +47,22 @@ async function runHost(manifest, bundlePath, input) {
38
47
  }
39
48
  return { outputs, stepResults };
40
49
  }
50
+ async function runHttpStepWithExecutionTimeout(step, runPath, input, env, remainingExecutionMs, executionTimeoutMs) {
51
+ if (remainingExecutionMs === undefined) {
52
+ return (0, httpStep_1.runHttpStep)(step, runPath, input, env);
53
+ }
54
+ if (remainingExecutionMs <= 0) {
55
+ throw new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs, step.name));
56
+ }
57
+ const controller = new AbortController();
58
+ const timer = setTimeout(() => {
59
+ controller.abort(new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs, step.name)));
60
+ }, remainingExecutionMs);
61
+ try {
62
+ return await (0, httpStep_1.runHttpStep)(step, runPath, input, env, controller.signal);
63
+ }
64
+ finally {
65
+ clearTimeout(timer);
66
+ }
67
+ }
41
68
  //# sourceMappingURL=hostRunner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hostRunner.js","sourceRoot":"","sources":["../../src/runner/hostRunner.ts"],"names":[],"mappings":";;;;;AAQA,0BAsCC;AA9CD,+CAAsD;AACtD,qCAAiC;AACjC,0DAA6B;AAE7B,2CAA4C;AAC5C,gDAAgD;AAChD,kDAAkD;AAE3C,KAAK,UAAU,OAAO,CAC3B,QAA6B,EAC7B,UAAkB,EAClB,KAA8B;IAE9B,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,mBAAI,CAAC,IAAI,CAAC,IAAA,gBAAM,GAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,IAAA,oBAAS,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAE1D,MAAM,GAAG,GAAG;QACV,GAAG,OAAO,CAAC,GAAG;QACd,UAAU,EAAE,SAAS;KACtB,CAAC;IAEF,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,mBAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAY,EAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAClE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;YACpD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAW,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5D,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;YACxD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,mBAAU,CAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"hostRunner.js","sourceRoot":"","sources":["../../src/runner/hostRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const DEFAULT_RUNTIME_INPUT_MAX_BYTES: number;
2
+ export declare const DEFAULT_RUNTIME_STEP_TIMEOUT_MS = 60000;
3
+ export declare function readRuntimeInputMaxBytes(env?: NodeJS.ProcessEnv): number;
4
+ export declare function readRuntimeStepTimeoutMs(env?: NodeJS.ProcessEnv): number;
5
+ export declare function readRuntimeExecutionTimeoutMs(env?: NodeJS.ProcessEnv): number | undefined;
6
+ export declare function formatExecutionTimeoutMessage(timeoutMs: number, stepName?: string): string;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_RUNTIME_STEP_TIMEOUT_MS = exports.DEFAULT_RUNTIME_INPUT_MAX_BYTES = void 0;
4
+ exports.readRuntimeInputMaxBytes = readRuntimeInputMaxBytes;
5
+ exports.readRuntimeStepTimeoutMs = readRuntimeStepTimeoutMs;
6
+ exports.readRuntimeExecutionTimeoutMs = readRuntimeExecutionTimeoutMs;
7
+ exports.formatExecutionTimeoutMessage = formatExecutionTimeoutMessage;
8
+ const errors_1 = require("../util/errors");
9
+ exports.DEFAULT_RUNTIME_INPUT_MAX_BYTES = 64 * 1024;
10
+ exports.DEFAULT_RUNTIME_STEP_TIMEOUT_MS = 60_000;
11
+ function readRuntimeInputMaxBytes(env = process.env) {
12
+ return readPositiveIntegerEnv("SPELL_RUNTIME_INPUT_MAX_BYTES", exports.DEFAULT_RUNTIME_INPUT_MAX_BYTES, env);
13
+ }
14
+ function readRuntimeStepTimeoutMs(env = process.env) {
15
+ return readPositiveIntegerEnv("SPELL_RUNTIME_STEP_TIMEOUT_MS", exports.DEFAULT_RUNTIME_STEP_TIMEOUT_MS, env);
16
+ }
17
+ function readRuntimeExecutionTimeoutMs(env = process.env) {
18
+ const raw = env.SPELL_RUNTIME_EXECUTION_TIMEOUT_MS;
19
+ if (raw === undefined || raw.trim() === "") {
20
+ return undefined;
21
+ }
22
+ const value = Number(raw);
23
+ if (!Number.isInteger(value) || value < 0) {
24
+ throw new errors_1.SpellError("SPELL_RUNTIME_EXECUTION_TIMEOUT_MS must be an integer >= 0");
25
+ }
26
+ if (value === 0) {
27
+ return undefined;
28
+ }
29
+ return value;
30
+ }
31
+ function formatExecutionTimeoutMessage(timeoutMs, stepName) {
32
+ if (stepName) {
33
+ return `cast execution timed out after ${timeoutMs}ms while running step '${stepName}'`;
34
+ }
35
+ return `cast execution timed out after ${timeoutMs}ms`;
36
+ }
37
+ function readPositiveIntegerEnv(name, fallback, env) {
38
+ const raw = env[name];
39
+ if (raw === undefined || raw.trim() === "") {
40
+ return fallback;
41
+ }
42
+ const value = Number(raw);
43
+ if (!Number.isInteger(value) || value < 1) {
44
+ throw new errors_1.SpellError(`${name} must be an integer >= 1`);
45
+ }
46
+ return value;
47
+ }
48
+ //# sourceMappingURL=runtimeLimits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeLimits.js","sourceRoot":"","sources":["../../src/runner/runtimeLimits.ts"],"names":[],"mappings":";;;AAKA,4DAEC;AAED,4DAEC;AAED,sEAgBC;AAED,sEAMC;AArCD,2CAA4C;AAE/B,QAAA,+BAA+B,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,QAAA,+BAA+B,GAAG,MAAM,CAAC;AAEtD,SAAgB,wBAAwB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC3E,OAAO,sBAAsB,CAAC,+BAA+B,EAAE,uCAA+B,EAAE,GAAG,CAAC,CAAC;AACvG,CAAC;AAED,SAAgB,wBAAwB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC3E,OAAO,sBAAsB,CAAC,+BAA+B,EAAE,uCAA+B,EAAE,GAAG,CAAC,CAAC;AACvG,CAAC;AAED,SAAgB,6BAA6B,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChF,MAAM,GAAG,GAAG,GAAG,CAAC,kCAAkC,CAAC;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,mBAAU,CAAC,4DAA4D,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,6BAA6B,CAAC,SAAiB,EAAE,QAAiB;IAChF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,kCAAkC,SAAS,0BAA0B,QAAQ,GAAG,CAAC;IAC1F,CAAC;IAED,OAAO,kCAAkC,SAAS,IAAI,CAAC;AACzD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,QAAgB,EAAE,GAAsB;IACpF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,mBAAU,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
File without changes
@@ -4,4 +4,4 @@ export interface HttpStepExecution {
4
4
  responseBody: unknown;
5
5
  status: number;
6
6
  }
7
- export declare function runHttpStep(step: SpellStep, runPath: string, input: Record<string, unknown>, env: NodeJS.ProcessEnv): Promise<HttpStepExecution>;
7
+ export declare function runHttpStep(step: SpellStep, runPath: string, input: Record<string, unknown>, env: NodeJS.ProcessEnv, signal?: AbortSignal): Promise<HttpStepExecution>;
@@ -5,7 +5,7 @@ const promises_1 = require("node:fs/promises");
5
5
  const errors_1 = require("../util/errors");
6
6
  const http_1 = require("../util/http");
7
7
  const template_1 = require("../util/template");
8
- async function runHttpStep(step, runPath, input, env) {
8
+ async function runHttpStep(step, runPath, input, env, signal) {
9
9
  const started = new Date().toISOString();
10
10
  const raw = await (0, promises_1.readFile)(runPath, "utf8");
11
11
  let parsed;
@@ -43,11 +43,25 @@ async function runHttpStep(step, runPath, input, env) {
43
43
  }
44
44
  }
45
45
  }
46
- const response = await (0, http_1.fetchHttp)(resolvedUrl, {
47
- method: resolvedMethod,
48
- headers,
49
- body
50
- });
46
+ let response;
47
+ try {
48
+ response = await (0, http_1.fetchHttp)(resolvedUrl, {
49
+ method: resolvedMethod,
50
+ headers,
51
+ body,
52
+ signal
53
+ });
54
+ }
55
+ catch (error) {
56
+ if (signal?.aborted) {
57
+ const reason = signal.reason;
58
+ if (reason instanceof Error) {
59
+ throw reason;
60
+ }
61
+ throw new errors_1.SpellError(`http step '${step.name}' aborted`);
62
+ }
63
+ throw new errors_1.SpellError(`http step '${step.name}' request failed: ${error.message}`);
64
+ }
51
65
  const responseText = await response.text();
52
66
  let responseBody;
53
67
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"httpStep.js","sourceRoot":"","sources":["../../src/steps/httpStep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"httpStep.js","sourceRoot":"","sources":["../../src/steps/httpStep.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,8 @@ export interface ShellStepExecution {
4
4
  stdout: string;
5
5
  stderr: string;
6
6
  }
7
- export declare function runShellStep(step: SpellStep, runPath: string, cwd: string, env: NodeJS.ProcessEnv): Promise<ShellStepExecution>;
7
+ export interface ShellStepRunOptions {
8
+ maxDurationMs?: number;
9
+ executionTimeoutMs?: number;
10
+ }
11
+ export declare function runShellStep(step: SpellStep, runPath: string, cwd: string, env: NodeJS.ProcessEnv, options?: ShellStepRunOptions): Promise<ShellStepExecution>;
@@ -3,8 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runShellStep = runShellStep;
4
4
  const node_child_process_1 = require("node:child_process");
5
5
  const errors_1 = require("../util/errors");
6
- async function runShellStep(step, runPath, cwd, env) {
6
+ const runtimeLimits_1 = require("../runner/runtimeLimits");
7
+ async function runShellStep(step, runPath, cwd, env, options = {}) {
7
8
  const started = new Date().toISOString();
9
+ const configuredStepTimeoutMs = (0, runtimeLimits_1.readRuntimeStepTimeoutMs)(env);
10
+ const cappedByExecution = options.maxDurationMs !== undefined &&
11
+ Number.isFinite(options.maxDurationMs) &&
12
+ options.maxDurationMs > 0 &&
13
+ options.maxDurationMs < configuredStepTimeoutMs;
14
+ const timeoutMs = cappedByExecution
15
+ ? Math.max(1, Math.ceil(options.maxDurationMs))
16
+ : configuredStepTimeoutMs;
8
17
  const child = (0, node_child_process_1.spawn)(runPath, [], {
9
18
  shell: false,
10
19
  cwd,
@@ -18,12 +27,29 @@ async function runShellStep(step, runPath, cwd, env) {
18
27
  child.stderr.on("data", (chunk) => {
19
28
  stderr += chunk.toString();
20
29
  });
21
- const exitCode = await new Promise((resolve, reject) => {
22
- child.on("error", reject);
23
- child.on("close", resolve);
24
- }).catch((error) => {
25
- throw new errors_1.SpellError(`failed to execute shell step '${step.name}': ${error.message}`);
26
- });
30
+ let timeoutHit = false;
31
+ const timer = setTimeout(() => {
32
+ timeoutHit = true;
33
+ child.kill("SIGKILL");
34
+ }, timeoutMs);
35
+ let exitCode;
36
+ try {
37
+ exitCode = await new Promise((resolve, reject) => {
38
+ child.on("error", reject);
39
+ child.on("close", resolve);
40
+ }).catch((error) => {
41
+ throw new errors_1.SpellError(`failed to execute shell step '${step.name}': ${error.message}`);
42
+ });
43
+ }
44
+ finally {
45
+ clearTimeout(timer);
46
+ }
47
+ if (timeoutHit) {
48
+ if (cappedByExecution && options.executionTimeoutMs !== undefined) {
49
+ throw new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(options.executionTimeoutMs, step.name));
50
+ }
51
+ throw new errors_1.SpellError(`shell step '${step.name}' timed out after ${timeoutMs}ms`);
52
+ }
27
53
  const finished = new Date().toISOString();
28
54
  const stepResult = {
29
55
  stepName: step.name,
@@ -1 +1 @@
1
- {"version":3,"file":"shellStep.js","sourceRoot":"","sources":["../../src/steps/shellStep.ts"],"names":[],"mappings":";;AAUA,oCAuDC;AAjED,2DAA2C;AAE3C,2CAA4C;AAQrC,KAAK,UAAU,YAAY,CAChC,IAAe,EACf,OAAe,EACf,GAAW,EACX,GAAsB;IAEtB,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE,EAAE,EAAE;QAC/B,KAAK,EAAE,KAAK;QACZ,GAAG;QACH,GAAG;KACJ,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,IAAI,mBAAU,CAAC,iCAAiC,IAAI,CAAC,IAAI,MAAO,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE1C,MAAM,UAAU,GAAe;QAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,QAAQ,KAAK,CAAC;QACvB,QAAQ;QACR,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACjC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACjC,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB,QAAQ,EAAE;KACnE,CAAC;IAEF,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,mBAAU,CAAC,gBAAgB,IAAI,CAAC,IAAI,eAAe,QAAQ,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO;QACL,UAAU;QACV,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"shellStep.js","sourceRoot":"","sources":["../../src/steps/shellStep.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -92,6 +92,10 @@ export interface ExecutionLog {
92
92
  risk: SpellRisk;
93
93
  billing: SpellBilling;
94
94
  runtime: SpellRuntime;
95
+ license: {
96
+ licensed: boolean;
97
+ name?: string;
98
+ };
95
99
  };
96
100
  steps: StepResult[];
97
101
  outputs: Record<string, unknown>;
@@ -3,4 +3,5 @@ export declare function spellsRoot(): string;
3
3
  export declare function logsRoot(): string;
4
4
  export declare function trustRoot(): string;
5
5
  export declare function trustedPublishersRoot(): string;
6
+ export declare function licensesRoot(): string;
6
7
  export declare function ensureSpellDirs(): Promise<void>;
@@ -8,6 +8,7 @@ exports.spellsRoot = spellsRoot;
8
8
  exports.logsRoot = logsRoot;
9
9
  exports.trustRoot = trustRoot;
10
10
  exports.trustedPublishersRoot = trustedPublishersRoot;
11
+ exports.licensesRoot = licensesRoot;
11
12
  exports.ensureSpellDirs = ensureSpellDirs;
12
13
  const promises_1 = require("node:fs/promises");
13
14
  const node_os_1 = require("node:os");
@@ -27,9 +28,13 @@ function trustRoot() {
27
28
  function trustedPublishersRoot() {
28
29
  return node_path_1.default.join(trustRoot(), "publishers");
29
30
  }
31
+ function licensesRoot() {
32
+ return node_path_1.default.join(spellHome(), "licenses");
33
+ }
30
34
  async function ensureSpellDirs() {
31
35
  await (0, promises_1.mkdir)(spellsRoot(), { recursive: true });
32
36
  await (0, promises_1.mkdir)(logsRoot(), { recursive: true });
33
37
  await (0, promises_1.mkdir)(trustedPublishersRoot(), { recursive: true });
38
+ await (0, promises_1.mkdir)(licensesRoot(), { recursive: true });
34
39
  }
35
40
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":";;;;;AAIA,8BAEC;AAED,gCAEC;AAED,4BAEC;AAED,8BAEC;AAED,sDAEC;AAED,0CAIC;AA5BD,+CAAyC;AACzC,qCAAkC;AAClC,0DAA6B;AAE7B,SAAgB,SAAS;IACvB,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAA,iBAAO,GAAE,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,qBAAqB;IACnC,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC;AAEM,KAAK,UAAU,eAAe;IACnC,MAAM,IAAA,gBAAK,EAAC,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAA,gBAAK,EAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAA,gBAAK,EAAC,qBAAqB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":";;;;;AAIA,8BAEC;AAED,gCAEC;AAED,4BAEC;AAED,8BAEC;AAED,sDAEC;AAED,oCAEC;AAED,0CAKC;AAjCD,+CAAyC;AACzC,qCAAkC;AAClC,0DAA6B;AAE7B,SAAgB,SAAS;IACvB,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAA,iBAAO,GAAE,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,qBAAqB;IACnC,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAEM,KAAK,UAAU,eAAe;IACnC,MAAM,IAAA,gBAAK,EAAC,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAA,gBAAK,EAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAA,gBAAK,EAAC,qBAAqB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAA,gBAAK,EAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "spell-runtime",
3
- "version": "1.2.0",
3
+ "version": "1.2.5",
4
4
  "description": "Minimal CLI runtime for SpellBundle v1",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
7
+ "packageManager": "pnpm@10.13.1",
7
8
  "files": [
8
9
  "dist",
10
+ "README.md",
9
11
  "README.txt",
10
12
  "LICENSE"
11
13
  ],
@@ -21,12 +23,18 @@
21
23
  "api:dev": "tsx src/api/index.ts",
22
24
  "api:start": "node dist/api/index.js",
23
25
  "build": "tsc -p tsconfig.json",
26
+ "typecheck": "tsc -p tsconfig.json --noEmit",
27
+ "lint": "npm run typecheck",
24
28
  "prepare": "npm run build",
25
29
  "test": "vitest run",
26
30
  "test:watch": "vitest",
31
+ "pack:check": "npm pack --dry-run",
27
32
  "smoke:link": "npm run build && npm link && spell --help",
28
33
  "smoke:npx": "npm run build && npx --yes --package file:. spell --help"
29
34
  },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
30
38
  "dependencies": {
31
39
  "ajv": "^8.17.1",
32
40
  "commander": "^14.0.1",