spell-runtime 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateSigningKeypair = generateSigningKeypair;
7
+ exports.signBundleFromPrivateKey = signBundleFromPrivateKey;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const promises_1 = require("node:fs/promises");
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const manifest_1 = require("../bundle/manifest");
12
+ const errors_1 = require("../util/errors");
13
+ const idKey_1 = require("../util/idKey");
14
+ const bundleDigest_1 = require("./bundleDigest");
15
+ const trustStore_1 = require("./trustStore");
16
+ async function generateSigningKeypair(options) {
17
+ validateSimpleToken(options.publisher, "publisher");
18
+ validateSimpleToken(options.keyId, "key id");
19
+ const outDir = node_path_1.default.resolve(options.outDir);
20
+ const safePublisher = (0, idKey_1.sanitizeIdForFilename)(options.publisher);
21
+ const safeKeyId = (0, idKey_1.sanitizeIdForFilename)(options.keyId);
22
+ await (0, promises_1.mkdir)(outDir, { recursive: true });
23
+ const privateKeyPath = node_path_1.default.join(outDir, `${safePublisher}__${safeKeyId}.private.pem`);
24
+ const publicKeyPath = node_path_1.default.join(outDir, `${safePublisher}__${safeKeyId}.public.b64url.txt`);
25
+ const { publicKey, privateKey } = (0, node_crypto_1.generateKeyPairSync)("ed25519");
26
+ const publicDer = publicKey.export({ format: "der", type: "spki" });
27
+ const privatePem = privateKey.export({ format: "pem", type: "pkcs8" });
28
+ await (0, promises_1.writeFile)(privateKeyPath, privatePem, { encoding: "utf8", mode: 0o600 });
29
+ await (0, promises_1.writeFile)(publicKeyPath, `${publicDer.toString("base64url")}\n`, "utf8");
30
+ return {
31
+ publisher: options.publisher,
32
+ keyId: options.keyId,
33
+ privateKeyPath,
34
+ publicKeyPath,
35
+ publicKeyBase64Url: publicDer.toString("base64url")
36
+ };
37
+ }
38
+ async function signBundleFromPrivateKey(options) {
39
+ validateSimpleToken(options.keyId, "key id");
40
+ const bundlePath = node_path_1.default.resolve(options.bundlePath);
41
+ const { manifest } = await (0, manifest_1.loadManifestFromDir)(bundlePath);
42
+ const derivedPublisher = (0, trustStore_1.publisherFromId)(manifest.id);
43
+ const publisher = options.publisher?.trim() || derivedPublisher;
44
+ if (publisher !== derivedPublisher) {
45
+ throw new errors_1.SpellError(`publisher mismatch: manifest expects '${derivedPublisher}', got '${publisher}'`);
46
+ }
47
+ const privateKeyRaw = await (0, promises_1.readFile)(node_path_1.default.resolve(options.privateKeyPath), "utf8").catch(() => {
48
+ throw new errors_1.SpellError(`private key file not found: ${options.privateKeyPath}`);
49
+ });
50
+ let privateKey;
51
+ try {
52
+ privateKey = (0, node_crypto_1.createPrivateKey)(privateKeyRaw);
53
+ }
54
+ catch (error) {
55
+ throw new errors_1.SpellError(`failed to parse private key: ${error.message}`);
56
+ }
57
+ const digest = await (0, bundleDigest_1.computeBundleDigest)(bundlePath);
58
+ const signature = (0, node_crypto_1.sign)(null, digest.value, privateKey).toString("base64url");
59
+ const signaturePath = node_path_1.default.join(bundlePath, "spell.sig.json");
60
+ const payload = {
61
+ version: "v1",
62
+ publisher,
63
+ key_id: options.keyId,
64
+ algorithm: "ed25519",
65
+ digest: {
66
+ algorithm: "sha256",
67
+ value: digest.valueHex
68
+ },
69
+ signature
70
+ };
71
+ await (0, promises_1.writeFile)(signaturePath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
72
+ return {
73
+ signaturePath,
74
+ digestHex: digest.valueHex,
75
+ publisher,
76
+ keyId: options.keyId
77
+ };
78
+ }
79
+ function validateSimpleToken(value, label) {
80
+ if (!value || !value.trim()) {
81
+ throw new errors_1.SpellError(`${label} must not be empty`);
82
+ }
83
+ if (/[\x00-\x1F\x7F]/.test(value)) {
84
+ throw new errors_1.SpellError(`${label} must not contain control characters`);
85
+ }
86
+ }
87
+ //# sourceMappingURL=signing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/signature/signing.ts"],"names":[],"mappings":"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"}
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "spell-runtime",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "Minimal CLI runtime for SpellBundle v1",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
@@ -21,6 +21,8 @@
21
21
  "api:dev": "tsx src/api/index.ts",
22
22
  "api:start": "node dist/api/index.js",
23
23
  "build": "tsc -p tsconfig.json",
24
+ "typecheck": "tsc -p tsconfig.json --noEmit",
25
+ "lint": "npm run typecheck",
24
26
  "prepare": "npm run build",
25
27
  "test": "vitest run",
26
28
  "test:watch": "vitest",