@visualautomate/plugin-sdk 0.6.1 → 0.7.0

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/simulate.ts", "../src/platform-rules.ts", "../src/validate.ts", "../src/context-api.ts"],
4
- "sourcesContent": ["/**\n * Running a plugin on your own machine, with a context that behaves.\n *\n * Storage and state are implemented here, in memory, with the same\n * signatures and the same edge cases the real ones have: `get` on a missing key\n * is `null` rather than a throw, `put` accepts a string or bytes, `list` is\n * prefix-filtered. A plugin that works against these works against the real\n * ones, which is the only property that makes a simulator worth having.\n *\n * WHAT IS DELIBERATELY NOT IMPLEMENTED: connections and media. Both are other\n * people's systems \u2014 an OAuth account and an ffmpeg container \u2014 and pretending\n * to be them would produce a plugin that passes here and fails on the canvas.\n * They are absent unless you pass a stub, and asking for one you did not stub\n * fails with a sentence saying so rather than with `undefined`.\n */\n\nimport type {\n PluginConnections,\n PluginContext,\n PluginExecutionResult,\n PluginMedia,\n PluginModule,\n PluginOutput,\n PluginState,\n PluginStorage,\n StorageListResult,\n StorageResult,\n} from \"./types\"\n\n/** A file held in memory, as the local storage keeps it. */\ninterface LocalFile {\n bytes: Uint8Array\n contentType: string\n uploadedAt: string\n}\n\nfunction toBytes(data: Uint8Array | string): Uint8Array {\n return typeof data === \"string\" ? new TextEncoder().encode(data) : data\n}\n\n/**\n * The account's files, in memory.\n *\n * Seeded from `options.storage` so a test can start with a file already there,\n * and readable afterwards through the returned `files` \u2014 which is how you\n * assert that a step wrote what it said it wrote.\n */\nexport function createLocalStorage(seed: Record<string, Uint8Array | string> = {}): {\n storage: PluginStorage\n files: Map<string, LocalFile>\n} {\n const files = new Map<string, LocalFile>()\n for (const [path, data] of Object.entries(seed)) {\n files.set(path, {\n bytes: toBytes(data),\n contentType: \"application/octet-stream\",\n uploadedAt: new Date().toISOString(),\n })\n }\n\n const result = (path: string, file: LocalFile): StorageResult => ({\n url: `memory://${path}`,\n size: file.bytes.length,\n contentType: file.contentType,\n uploadedAt: file.uploadedAt,\n // The real one expires; this one does not, and says so rather than\n // inventing a date a test might come to rely on.\n expiresAt: \"never (local simulation)\",\n })\n\n const storage: PluginStorage = {\n async put(path, data, contentType = \"application/octet-stream\") {\n const file: LocalFile = {\n bytes: toBytes(data),\n contentType,\n uploadedAt: new Date().toISOString(),\n }\n files.set(path, file)\n return result(path, file)\n },\n async get(path) {\n return files.get(path)?.bytes ?? null\n },\n async delete(path) {\n files.delete(path)\n },\n async list(prefix) {\n const listed: StorageListResult[\"files\"] = []\n let totalSize = 0\n for (const [path, file] of files) {\n if (prefix && !path.startsWith(prefix)) continue\n listed.push({\n url: `memory://${path}`,\n pathname: path,\n size: file.bytes.length,\n uploadedAt: file.uploadedAt,\n })\n totalSize += file.bytes.length\n }\n return { files: listed, totalSize }\n },\n async head(path) {\n const file = files.get(path)\n return file ? { size: file.bytes.length, contentType: file.contentType } : null\n },\n async signedUrl(path) {\n return files.has(path) ? `memory://${path}` : null\n },\n /**\n * Really fetches, because that is the only way to find out whether the\n * URL a plugin builds is the URL it meant. The bytes land in the same\n * in-memory store the rest of these read from.\n */\n async download(url, path, contentType) {\n const res = await fetch(url)\n if (!res.ok) throw new Error(`Downloading ${url} failed with status ${res.status}`)\n const file: LocalFile = {\n bytes: new Uint8Array(await res.arrayBuffer()),\n contentType: contentType ?? res.headers.get(\"content-type\") ?? \"application/octet-stream\",\n uploadedAt: new Date().toISOString(),\n }\n files.set(path, file)\n return result(path, file)\n },\n }\n\n return { storage, files }\n}\n\n/** Workflow state, in memory. `values` is there so a test can look afterwards. */\nexport function createLocalState(seed: Record<string, unknown> = {}): {\n state: PluginState\n values: Map<string, unknown>\n} {\n const values = new Map<string, unknown>(Object.entries(seed))\n const state: PluginState = {\n async get(key) {\n // `null` for a key that was never set, matching the real one. A\n // plugin that treats `undefined` and `null` differently should find\n // out here rather than on somebody's canvas.\n return values.has(key) ? values.get(key) : null\n },\n async set(key, value) {\n values.set(key, value)\n },\n async delete(key) {\n values.delete(key)\n },\n async list(prefix) {\n const keys = [...values.keys()].filter((k) => !prefix || k.startsWith(prefix))\n return { keys }\n },\n }\n return { state, values }\n}\n\n/** What a helper says when it is asked for and was not provided. */\nfunction absent(name: string, what: string): never {\n throw new Error(\n `context.${name} is not available locally. ${what} `\n + `Pass a stub to simulate({ ${name}: \u2026 }) to test the code around it, `\n + `or run the step on a canvas to exercise the real thing.`,\n )\n}\n\nexport interface SimulateOptions {\n /** What the steps before this one produced. */\n input?: Record<string, unknown>\n /** The fields somebody filled in on the canvas. */\n config?: Record<string, unknown>\n /** What the plugin was published with. */\n secrets?: Record<string, string>\n\n /** Files the account already has, as `{ \"path/name.txt\": \"contents\" }`. */\n storage?: Record<string, Uint8Array | string>\n /** Workflow state the run starts with. */\n state?: Record<string, unknown>\n /**\n * Stand-ins for the two helpers that cannot be simulated honestly.\n *\n * Give `connections` a fake that answers the requests your plugin makes,\n * and assert on what it was asked for \u2014 that is a better test of an\n * integration step than any simulation of a provider would be.\n */\n connections?: PluginConnections\n media?: PluginMedia\n\n workflowId?: string\n nodeId?: string\n userId?: string\n executionId?: string\n /** How long the plugin may take, as the account's plan would cap it. */\n timeoutMs?: number\n}\n\n/** What `simulate` gives back: the result, and what the run left behind. */\nexport interface SimulateResult extends PluginExecutionResult {\n /** The files in storage when the step finished. */\n files: Map<string, LocalFile>\n /** The workflow state when the step finished. */\n state: Map<string, unknown>\n}\n\n/**\n * Run a plugin's `execute` the way the sandbox would.\n *\n * Same context shape, same timeout race, same normalising of the return value \u2014\n * so a result that is `success` here is one the platform would also call\n * `success`.\n */\nexport async function simulate(\n plugin: PluginModule | PluginModule[\"execute\"],\n options: SimulateOptions = {},\n): Promise<SimulateResult> {\n const startTime = Date.now()\n\n const execute = typeof plugin === \"function\" ? plugin : plugin?.execute\n const { storage, files } = createLocalStorage(options.storage)\n const { state, values } = createLocalState(options.state)\n\n if (typeof execute !== \"function\") {\n return {\n status: \"error\",\n output: null,\n error:\n \"This module exports no execute function. A plugin is `export default { execute }`, \"\n + \"`module.exports.execute = \u2026`, or a default export that is the function itself.\",\n durationMs: Date.now() - startTime,\n files,\n state: values,\n }\n }\n\n const context: PluginContext = {\n workflowId: options.workflowId ?? \"local-workflow\",\n nodeId: options.nodeId ?? \"local-node\",\n userId: options.userId ?? \"local-user\",\n executionId: options.executionId ?? `local-${Date.now()}`,\n startedAt: new Date(startTime).toISOString(),\n secrets: options.secrets ?? {},\n storage,\n state,\n connections:\n options.connections ??\n ({\n get: async () =>\n absent(\"connections\", \"It reaches an account somebody connected on the platform.\"),\n } as PluginConnections),\n media:\n options.media ??\n ({\n run: async () => absent(\"media\", \"It runs ffmpeg in a container of its own.\"),\n } as PluginMedia),\n }\n\n const timeoutMs = options.timeoutMs ?? 30_000\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Plugin execution timed out after ${timeoutMs}ms`)),\n timeoutMs,\n )\n })\n\n try {\n const raw = await Promise.race([\n Promise.resolve(execute(options.input ?? {}, options.config ?? {}, context)),\n timeout,\n ])\n\n const durationMs = Date.now() - startTime\n\n if (!raw || typeof raw !== \"object\") {\n return {\n status: \"error\",\n output: null,\n error:\n \"A plugin must return an object like { output: \\\"success\\\", data: {} }. \"\n + `This one returned ${raw === undefined ? \"undefined\" : JSON.stringify(raw)}.`,\n durationMs,\n files,\n state: values,\n }\n }\n\n const output = raw as PluginOutput\n if (typeof output.output !== \"string\") {\n return {\n status: \"error\",\n output: null,\n error:\n \"The returned object has no `output`. That field names which port the run leaves \"\n + \"by \u2014 usually \\\"success\\\" or \\\"error\\\" \u2014 and it has to be one of the `outputs` \"\n + \"in your manifest.\",\n durationMs,\n files,\n state: values,\n }\n }\n\n return {\n status: \"success\",\n output: { ...output, data: output.data ?? {} },\n durationMs,\n outputPort: output.output,\n logs: output.metadata?.logs,\n files,\n state: values,\n }\n } catch (error) {\n const durationMs = Date.now() - startTime\n const message = error instanceof Error ? error.message : String(error)\n return {\n status: message.includes(\"timed out\") ? \"timeout\" : \"error\",\n output: null,\n error: message,\n durationMs,\n files,\n state: values,\n }\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n", "/**\n * The rules the VisualAutomate platform applies to a plugin's code on upload.\n *\n * Kept identical to the platform's, so a local test refuses what an upload\n * would refuse. When the platform changes them, this file changes with them in\n * the next release of the SDK.\n */\n\n/** The npm packages a step may require, and the version the sandbox has installed. */\nexport const ALLOWED_PACKAGES: ReadonlyArray<{ name: string; version: string }> = [\n {\n \"name\": \"nodemailer\",\n \"version\": \"^6.10.0\"\n },\n {\n \"name\": \"lodash\",\n \"version\": \"^4.17.21\"\n },\n {\n \"name\": \"ramda\",\n \"version\": \"^0.30.1\"\n },\n {\n \"name\": \"underscore\",\n \"version\": \"^1.13.8\"\n },\n {\n \"name\": \"immer\",\n \"version\": \"^11.1.18\"\n },\n {\n \"name\": \"immutable\",\n \"version\": \"^5.1.9\"\n },\n {\n \"name\": \"deepmerge\",\n \"version\": \"^4.3.1\"\n },\n {\n \"name\": \"defu\",\n \"version\": \"^6.1.7\"\n },\n {\n \"name\": \"rfdc\",\n \"version\": \"^1.4.1\"\n },\n {\n \"name\": \"klona\",\n \"version\": \"^2.0.6\"\n },\n {\n \"name\": \"fast-copy\",\n \"version\": \"^4.1.1\"\n },\n {\n \"name\": \"fast-deep-equal\",\n \"version\": \"^3.1.3\"\n },\n {\n \"name\": \"dequal\",\n \"version\": \"^2.0.3\"\n },\n {\n \"name\": \"object-hash\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"hash-sum\",\n \"version\": \"^2.0.0\"\n },\n {\n \"name\": \"flat\",\n \"version\": \"^6.0.1\"\n },\n {\n \"name\": \"dot-prop\",\n \"version\": \"^10.2.0\"\n },\n {\n \"name\": \"object-path\",\n \"version\": \"^0.11.8\"\n },\n {\n \"name\": \"sort-array\",\n \"version\": \"^5.1.1\"\n },\n {\n \"name\": \"natural-orderby\",\n \"version\": \"^5.0.0\"\n },\n {\n \"name\": \"deep-object-diff\",\n \"version\": \"^1.1.9\"\n },\n {\n \"name\": \"microdiff\",\n \"version\": \"^1.6.0\"\n },\n {\n \"name\": \"fast-json-patch\",\n \"version\": \"^3.1.1\"\n },\n {\n \"name\": \"rfc6902\",\n \"version\": \"^5.3.0\"\n },\n {\n \"name\": \"just-clone\",\n \"version\": \"^6.2.0\"\n },\n {\n \"name\": \"just-diff\",\n \"version\": \"^6.0.2\"\n },\n {\n \"name\": \"just-diff-apply\",\n \"version\": \"^5.5.0\"\n },\n {\n \"name\": \"just-omit\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"just-pick\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-group-by\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"just-order-by\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"just-unique\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-flatten-it\",\n \"version\": \"^5.2.0\"\n },\n {\n \"name\": \"just-safe-get\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-safe-set\",\n \"version\": \"^4.2.1\"\n },\n {\n \"name\": \"just-typeof\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"just-range\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-zip-it\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"just-compare\",\n \"version\": \"^2.3.0\"\n },\n {\n \"name\": \"just-intersect\",\n \"version\": \"^4.3.0\"\n },\n {\n \"name\": \"just-split\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"just-truncate\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"semver\",\n \"version\": \"^7.6.3\"\n },\n {\n \"name\": \"compare-versions\",\n \"version\": \"^6.1.1\"\n },\n {\n \"name\": \"tiny-invariant\",\n \"version\": \"^1.3.3\"\n },\n {\n \"name\": \"json-stringify-safe\",\n \"version\": \"^5.0.1\"\n },\n {\n \"name\": \"fast-safe-stringify\",\n \"version\": \"^2.1.1\"\n },\n {\n \"name\": \"flatted\",\n \"version\": \"^3.4.4\"\n },\n {\n \"name\": \"superjson\",\n \"version\": \"^2.2.6\"\n },\n {\n \"name\": \"devalue\",\n \"version\": \"^5.9.2\"\n },\n {\n \"name\": \"lru-cache\",\n \"version\": \"^11.5.2\"\n },\n {\n \"name\": \"quick-lru\",\n \"version\": \"^7.3.0\"\n },\n {\n \"name\": \"memoize-one\",\n \"version\": \"^6.0.0\"\n },\n {\n \"name\": \"fast-memoize\",\n \"version\": \"^2.5.2\"\n },\n {\n \"name\": \"uuid\",\n \"version\": \"^11.0.5\"\n },\n {\n \"name\": \"nanoid\",\n \"version\": \"^5.0.9\"\n },\n {\n \"name\": \"ulid\",\n \"version\": \"^3.0.2\"\n },\n {\n \"name\": \"@paralleldrive/cuid2\",\n \"version\": \"^3.3.0\"\n },\n {\n \"name\": \"slugify\",\n \"version\": \"^1.6.6\"\n },\n {\n \"name\": \"slug\",\n \"version\": \"^12.0.1\"\n },\n {\n \"name\": \"sanitize-filename\",\n \"version\": \"^1.6.4\"\n },\n {\n \"name\": \"filenamify\",\n \"version\": \"^7.0.3\"\n },\n {\n \"name\": \"seedrandom\",\n \"version\": \"^3.0.5\"\n },\n {\n \"name\": \"random-js\",\n \"version\": \"^2.1.0\"\n },\n {\n \"name\": \"chance\",\n \"version\": \"^1.1.13\"\n },\n {\n \"name\": \"@faker-js/faker\",\n \"version\": \"^10.6.0\"\n },\n {\n \"name\": \"lorem-ipsum\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"randomcolor\",\n \"version\": \"^0.6.2\"\n },\n {\n \"name\": \"date-fns\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"date-fns-tz\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"dayjs\",\n \"version\": \"^1.11.13\"\n },\n {\n \"name\": \"luxon\",\n \"version\": \"^3.5.0\"\n },\n {\n \"name\": \"moment\",\n \"version\": \"^2.30.1\"\n },\n {\n \"name\": \"moment-timezone\",\n \"version\": \"^0.6.3\"\n },\n {\n \"name\": \"ms\",\n \"version\": \"^2.1.3\"\n },\n {\n \"name\": \"pretty-ms\",\n \"version\": \"^9.3.1\"\n },\n {\n \"name\": \"parse-duration\",\n \"version\": \"^2.1.8\"\n },\n {\n \"name\": \"humanize-duration\",\n \"version\": \"^3.34.1\"\n },\n {\n \"name\": \"timeago.js\",\n \"version\": \"^4.0.2\"\n },\n {\n \"name\": \"chrono-node\",\n \"version\": \"^2.7.7\"\n },\n {\n \"name\": \"rrule\",\n \"version\": \"^2.8.1\"\n },\n {\n \"name\": \"cron-parser\",\n \"version\": \"^5.10.0\"\n },\n {\n \"name\": \"cronstrue\",\n \"version\": \"^3.26.0\"\n },\n {\n \"name\": \"date-and-time\",\n \"version\": \"^4.5.2\"\n },\n {\n \"name\": \"fecha\",\n \"version\": \"^4.2.3\"\n },\n {\n \"name\": \"dateformat\",\n \"version\": \"^5.0.3\"\n },\n {\n \"name\": \"iso8601-duration\",\n \"version\": \"^2.1.4\"\n },\n {\n \"name\": \"ics\",\n \"version\": \"^3.12.0\"\n },\n {\n \"name\": \"zod\",\n \"version\": \"^3.24.1\"\n },\n {\n \"name\": \"yup\",\n \"version\": \"^1.6.1\"\n },\n {\n \"name\": \"joi\",\n \"version\": \"^18.2.8\"\n },\n {\n \"name\": \"ajv\",\n \"version\": \"^8.17.1\"\n },\n {\n \"name\": \"ajv-formats\",\n \"version\": \"^3.0.1\"\n },\n {\n \"name\": \"ajv-errors\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"superstruct\",\n \"version\": \"^2.0.2\"\n },\n {\n \"name\": \"valibot\",\n \"version\": \"^1.5.0\"\n },\n {\n \"name\": \"jsonschema\",\n \"version\": \"^1.5.0\"\n },\n {\n \"name\": \"@sinclair/typebox\",\n \"version\": \"^0.34.52\"\n },\n {\n \"name\": \"validator\",\n \"version\": \"^13.12.0\"\n },\n {\n \"name\": \"email-validator\",\n \"version\": \"^2.0.4\"\n },\n {\n \"name\": \"libphonenumber-js\",\n \"version\": \"^1.11.17\"\n },\n {\n \"name\": \"iban\",\n \"version\": \"^0.0.14\"\n },\n {\n \"name\": \"credit-card-type\",\n \"version\": \"^10.3.0\"\n },\n {\n \"name\": \"card-validator\",\n \"version\": \"^10.0.4\"\n },\n {\n \"name\": \"psl\",\n \"version\": \"^1.15.0\"\n },\n {\n \"name\": \"tldts\",\n \"version\": \"^7.4.12\"\n },\n {\n \"name\": \"normalize-url\",\n \"version\": \"^9.0.1\"\n },\n {\n \"name\": \"valid-url\",\n \"version\": \"^1.0.9\"\n },\n {\n \"name\": \"is-ip\",\n \"version\": \"^5.0.1\"\n },\n {\n \"name\": \"ipaddr.js\",\n \"version\": \"^2.5.0\"\n },\n {\n \"name\": \"ip-address\",\n \"version\": \"^10.7.0\"\n },\n {\n \"name\": \"netmask\",\n \"version\": \"^2.1.1\"\n },\n {\n \"name\": \"ua-parser-js\",\n \"version\": \"^2.0.10\"\n },\n {\n \"name\": \"bowser\",\n \"version\": \"^2.14.1\"\n },\n {\n \"name\": \"papaparse\",\n \"version\": \"^5.4.1\"\n },\n {\n \"name\": \"csv-parse\",\n \"version\": \"^7.0.2\"\n },\n {\n \"name\": \"csv-stringify\",\n \"version\": \"^6.8.3\"\n },\n {\n \"name\": \"json-2-csv\",\n \"version\": \"^5.6.0\"\n },\n {\n \"name\": \"js-yaml\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"yaml\",\n \"version\": \"^2.9.0\"\n },\n {\n \"name\": \"json5\",\n \"version\": \"^2.2.3\"\n },\n {\n \"name\": \"jsonc-parser\",\n \"version\": \"^3.3.1\"\n },\n {\n \"name\": \"hjson\",\n \"version\": \"^3.2.2\"\n },\n {\n \"name\": \"toml\",\n \"version\": \"^5.0.0\"\n },\n {\n \"name\": \"@iarna/toml\",\n \"version\": \"^2.2.5\"\n },\n {\n \"name\": \"ini\",\n \"version\": \"^7.0.0\"\n },\n {\n \"name\": \"fast-xml-parser\",\n \"version\": \"^4.5.1\"\n },\n {\n \"name\": \"xml2js\",\n \"version\": \"^0.6.2\"\n },\n {\n \"name\": \"xml-js\",\n \"version\": \"^1.6.11\"\n },\n {\n \"name\": \"xmlbuilder2\",\n \"version\": \"^4.0.3\"\n },\n {\n \"name\": \"@xmldom/xmldom\",\n \"version\": \"^0.9.12\"\n },\n {\n \"name\": \"xpath\",\n \"version\": \"^0.0.34\"\n },\n {\n \"name\": \"cheerio\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"htmlparser2\",\n \"version\": \"^12.0.0\"\n },\n {\n \"name\": \"node-html-parser\",\n \"version\": \"^9.0.4\"\n },\n {\n \"name\": \"parse5\",\n \"version\": \"^8.0.1\"\n },\n {\n \"name\": \"sanitize-html\",\n \"version\": \"^2.17.7\"\n },\n {\n \"name\": \"marked\",\n \"version\": \"^15.0.6\"\n },\n {\n \"name\": \"markdown-it\",\n \"version\": \"^15.0.1\"\n },\n {\n \"name\": \"showdown\",\n \"version\": \"^2.1.0\"\n },\n {\n \"name\": \"turndown\",\n \"version\": \"^7.2.0\"\n },\n {\n \"name\": \"html-to-text\",\n \"version\": \"^9.0.5\"\n },\n {\n \"name\": \"he\",\n \"version\": \"^1.2.0\"\n },\n {\n \"name\": \"entities\",\n \"version\": \"^8.1.0\"\n },\n {\n \"name\": \"striptags\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"front-matter\",\n \"version\": \"^4.0.2\"\n },\n {\n \"name\": \"qs\",\n \"version\": \"^6.13.1\"\n },\n {\n \"name\": \"query-string\",\n \"version\": \"^9.5.1\"\n },\n {\n \"name\": \"url-parse\",\n \"version\": \"^1.5.10\"\n },\n {\n \"name\": \"mime-types\",\n \"version\": \"^2.1.35\"\n },\n {\n \"name\": \"mime\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"content-type\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"cookie\",\n \"version\": \"^2.0.1\"\n },\n {\n \"name\": \"set-cookie-parser\",\n \"version\": \"^3.1.2\"\n },\n {\n \"name\": \"jsonpath-plus\",\n \"version\": \"^10.2.0\"\n },\n {\n \"name\": \"jmespath\",\n \"version\": \"^0.16.0\"\n },\n {\n \"name\": \"jsonata\",\n \"version\": \"^2.2.2\"\n },\n {\n \"name\": \"exceljs\",\n \"version\": \"^4.4.0\"\n },\n {\n \"name\": \"change-case\",\n \"version\": \"^5.4.4\"\n },\n {\n \"name\": \"camelcase\",\n \"version\": \"^9.0.0\"\n },\n {\n \"name\": \"decamelize\",\n \"version\": \"^6.0.1\"\n },\n {\n \"name\": \"title-case\",\n \"version\": \"^4.3.2\"\n },\n {\n \"name\": \"pluralize\",\n \"version\": \"^8.0.0\"\n },\n {\n \"name\": \"inflection\",\n \"version\": \"^3.0.2\"\n },\n {\n \"name\": \"voca\",\n \"version\": \"^1.4.1\"\n },\n {\n \"name\": \"underscore.string\",\n \"version\": \"^3.3.6\"\n },\n {\n \"name\": \"string-similarity\",\n \"version\": \"^4.0.4\"\n },\n {\n \"name\": \"fastest-levenshtein\",\n \"version\": \"^1.0.16\"\n },\n {\n \"name\": \"leven\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"diff\",\n \"version\": \"^7.0.0\"\n },\n {\n \"name\": \"diff-match-patch\",\n \"version\": \"^1.0.5\"\n },\n {\n \"name\": \"remove-accents\",\n \"version\": \"^0.5.0\"\n },\n {\n \"name\": \"transliteration\",\n \"version\": \"^2.6.1\"\n },\n {\n \"name\": \"latinize\",\n \"version\": \"^2.0.0\"\n },\n {\n \"name\": \"franc\",\n \"version\": \"^6.2.0\"\n },\n {\n \"name\": \"stopword\",\n \"version\": \"^3.1.5\"\n },\n {\n \"name\": \"emoji-regex\",\n \"version\": \"^10.6.0\"\n },\n {\n \"name\": \"node-emoji\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"string-width\",\n \"version\": \"^8.2.2\"\n },\n {\n \"name\": \"word-wrap\",\n \"version\": \"^1.2.5\"\n },\n {\n \"name\": \"wrap-ansi\",\n \"version\": \"^10.0.1\"\n },\n {\n \"name\": \"linkify-it\",\n \"version\": \"^6.1.0\"\n },\n {\n \"name\": \"linkifyjs\",\n \"version\": \"^4.3.3\"\n },\n {\n \"name\": \"fuse.js\",\n \"version\": \"^7.5.0\"\n },\n {\n \"name\": \"minisearch\",\n \"version\": \"^7.2.0\"\n },\n {\n \"name\": \"lunr\",\n \"version\": \"^2.3.9\"\n },\n {\n \"name\": \"flexsearch\",\n \"version\": \"^0.8.212\"\n },\n {\n \"name\": \"mustache\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"liquidjs\",\n \"version\": \"^10.20.1\"\n },\n {\n \"name\": \"intl-messageformat\",\n \"version\": \"^11.2.14\"\n },\n {\n \"name\": \"gpt-tokenizer\",\n \"version\": \"^4.0.0\"\n },\n {\n \"name\": \"js-tiktoken\",\n \"version\": \"^1.0.21\"\n },\n {\n \"name\": \"decimal.js\",\n \"version\": \"^10.4.3\"\n },\n {\n \"name\": \"big.js\",\n \"version\": \"^6.2.2\"\n },\n {\n \"name\": \"bignumber.js\",\n \"version\": \"^11.1.5\"\n },\n {\n \"name\": \"currency.js\",\n \"version\": \"^2.0.4\"\n },\n {\n \"name\": \"dinero.js\",\n \"version\": \"^2.0.2\"\n },\n {\n \"name\": \"numeral\",\n \"version\": \"^2.0.6\"\n },\n {\n \"name\": \"accounting\",\n \"version\": \"^0.4.1\"\n },\n {\n \"name\": \"fraction.js\",\n \"version\": \"^5.3.4\"\n },\n {\n \"name\": \"convert-units\",\n \"version\": \"^2.3.4\"\n },\n {\n \"name\": \"js-quantities\",\n \"version\": \"^1.8.0\"\n },\n {\n \"name\": \"mathjs\",\n \"version\": \"^15.2.0\"\n },\n {\n \"name\": \"simple-statistics\",\n \"version\": \"^7.12.0\"\n },\n {\n \"name\": \"ml-matrix\",\n \"version\": \"^6.15.0\"\n },\n {\n \"name\": \"d3-array\",\n \"version\": \"^3.2.4\"\n },\n {\n \"name\": \"d3-format\",\n \"version\": \"^3.1.2\"\n },\n {\n \"name\": \"d3-time-format\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"geolib\",\n \"version\": \"^3.3.14\"\n },\n {\n \"name\": \"haversine-distance\",\n \"version\": \"^1.2.4\"\n },\n {\n \"name\": \"filesize\",\n \"version\": \"^11.0.23\"\n },\n {\n \"name\": \"bytes\",\n \"version\": \"^3.1.2\"\n },\n {\n \"name\": \"human-format\",\n \"version\": \"^1.2.1\"\n },\n {\n \"name\": \"jsonwebtoken\",\n \"version\": \"^9.0.2\"\n },\n {\n \"name\": \"jose\",\n \"version\": \"^5.9.6\"\n },\n {\n \"name\": \"jws\",\n \"version\": \"^4.0.1\"\n },\n {\n \"name\": \"jwt-decode\",\n \"version\": \"^4.0.0\"\n },\n {\n \"name\": \"crypto-js\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"bcryptjs\",\n \"version\": \"^2.4.3\"\n },\n {\n \"name\": \"otplib\",\n \"version\": \"^13.5.0\"\n },\n {\n \"name\": \"otpauth\",\n \"version\": \"^9.5.2\"\n },\n {\n \"name\": \"tweetnacl\",\n \"version\": \"^1.0.3\"\n },\n {\n \"name\": \"tweetnacl-util\",\n \"version\": \"^0.15.1\"\n },\n {\n \"name\": \"node-forge\",\n \"version\": \"^1.4.0\"\n },\n {\n \"name\": \"elliptic\",\n \"version\": \"^6.6.1\"\n },\n {\n \"name\": \"bn.js\",\n \"version\": \"^5.2.5\"\n },\n {\n \"name\": \"js-base64\",\n \"version\": \"^3.7.7\"\n },\n {\n \"name\": \"base64-js\",\n \"version\": \"^1.5.1\"\n },\n {\n \"name\": \"base-64\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"hi-base32\",\n \"version\": \"^0.5.1\"\n },\n {\n \"name\": \"thirty-two\",\n \"version\": \"^1.0.2\"\n },\n {\n \"name\": \"js-sha256\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"js-sha512\",\n \"version\": \"^0.9.0\"\n },\n {\n \"name\": \"js-sha1\",\n \"version\": \"^0.7.0\"\n },\n {\n \"name\": \"js-md5\",\n \"version\": \"^0.9.2\"\n },\n {\n \"name\": \"hash.js\",\n \"version\": \"^1.1.7\"\n },\n {\n \"name\": \"spark-md5\",\n \"version\": \"^3.0.2\"\n },\n {\n \"name\": \"blueimp-md5\",\n \"version\": \"^2.19.0\"\n },\n {\n \"name\": \"crc-32\",\n \"version\": \"^1.2.2\"\n },\n {\n \"name\": \"crc\",\n \"version\": \"^4.3.2\"\n },\n {\n \"name\": \"utf8\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"iconv-lite\",\n \"version\": \"^0.7.3\"\n },\n {\n \"name\": \"punycode\",\n \"version\": \"^2.3.1\"\n },\n {\n \"name\": \"pako\",\n \"version\": \"^3.0.1\"\n },\n {\n \"name\": \"fflate\",\n \"version\": \"^0.8.3\"\n },\n {\n \"name\": \"lz-string\",\n \"version\": \"^1.5.0\"\n },\n {\n \"name\": \"color\",\n \"version\": \"^5.0.3\"\n },\n {\n \"name\": \"tinycolor2\",\n \"version\": \"^1.6.0\"\n },\n {\n \"name\": \"chroma-js\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"color-convert\",\n \"version\": \"^3.1.3\"\n },\n {\n \"name\": \"colord\",\n \"version\": \"^2.10.0\"\n },\n {\n \"name\": \"i18n-iso-countries\",\n \"version\": \"^7.14.0\"\n },\n {\n \"name\": \"iso-3166-1\",\n \"version\": \"^2.1.1\"\n },\n {\n \"name\": \"iso-639-1\",\n \"version\": \"^3.1.6\"\n },\n {\n \"name\": \"currency-codes\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"qrcode-generator\",\n \"version\": \"^2.0.4\"\n },\n {\n \"name\": \"p-limit\",\n \"version\": \"^6.2.0\"\n },\n {\n \"name\": \"p-retry\",\n \"version\": \"^6.2.1\"\n },\n {\n \"name\": \"p-map\",\n \"version\": \"^7.0.3\"\n },\n {\n \"name\": \"p-queue\",\n \"version\": \"^9.3.3\"\n },\n {\n \"name\": \"p-timeout\",\n \"version\": \"^7.0.1\"\n },\n {\n \"name\": \"p-all\",\n \"version\": \"^5.0.1\"\n },\n {\n \"name\": \"p-props\",\n \"version\": \"^6.1.0\"\n },\n {\n \"name\": \"p-settle\",\n \"version\": \"^5.2.1\"\n },\n {\n \"name\": \"p-throttle\",\n \"version\": \"^8.1.0\"\n },\n {\n \"name\": \"p-debounce\",\n \"version\": \"^5.1.0\"\n },\n {\n \"name\": \"async\",\n \"version\": \"^3.2.6\"\n },\n {\n \"name\": \"bluebird\",\n \"version\": \"^3.7.2\"\n },\n {\n \"name\": \"promise-retry\",\n \"version\": \"^2.0.1\"\n },\n {\n \"name\": \"retry\",\n \"version\": \"^0.13.1\"\n },\n {\n \"name\": \"exponential-backoff\",\n \"version\": \"^3.1.3\"\n },\n {\n \"name\": \"bottleneck\",\n \"version\": \"^2.19.5\"\n },\n {\n \"name\": \"throttle-debounce\",\n \"version\": \"^5.0.2\"\n },\n {\n \"name\": \"delay\",\n \"version\": \"^7.0.0\"\n },\n {\n \"name\": \"graphlib\",\n \"version\": \"^2.1.8\"\n }\n]\n\n/** Code matching any of these is refused on upload. */\nexport const RESTRICTED_PATTERNS: ReadonlyArray<RegExp> = [\n /\\bprocess\\s*\\.\\s*exit/,\n /\\bprocess\\s*\\.\\s*env/,\n /\\bprocess\\s*\\.\\s*binding/,\n /\\bprocess\\s*\\.\\s*mainModule/,\n /\\bprocess\\s*\\[/,\n /\\bprocess\\s*\\(/,\n /\\beval\\s*\\(/,\n /\\bFunction\\s*\\(/,\n /\\bnew\\s+Function\\b/,\n /\\bAsyncFunction\\b/,\n /\\bGeneratorFunction\\b/,\n /\\bglobalThis\\b/,\n /\\bself\\s*\\[/,\n /\\bimport\\s+/,\n /\\bimport\\s*\\(/,\n /\\bReflect\\b/,\n /\\bProxy\\b/,\n /\\b__proto__\\b/,\n /\\bprototype\\s*\\[/,\n /\\bprototype\\s*\\.\\s*constructor\\b/,\n /\\bconstructor\\b/,\n /\\bthis\\s*\\.\\s*constructor\\b/,\n /\\barguments\\s*\\.\\s*callee\\b/,\n /\\bObject\\s*\\.\\s*defineProperty\\b/,\n /\\b__defineGetter__\\b/,\n /\\b__defineSetter__\\b/,\n /\\b__lookupGetter__\\b/,\n /\\b__lookupSetter__\\b/,\n /\\bmodule\\s*\\.\\s*(?:constructor|extensions|_compile|_path|_sourceMaps)\\b/,\n /\\brequire\\s*\\.\\s*cache\\b/,\n /\\brequire\\s*\\.\\s*resolve\\b/,\n /\\bError\\s*\\.\\s*captureStackTrace\\b/,\n /\\bWebAssembly\\b/,\n]\n", "/**\n * What the platform checks about a step's code before it will take it.\n *\n * The same checks, in the same order, with the same messages as the platform's\n * upload, against the rules in ./platform-rules. A plugin that passes here is\n * not refused on push for its code; one that fails here would have been.\n *\n * And a `require` that behaves like the sandbox's: a step gets the allowed\n * packages and nothing else \u2014 no `fs`, no `http`, not even `path`.\n */\n\nimport { ALLOWED_PACKAGES, RESTRICTED_PATTERNS } from \"./platform-rules\"\n\nexport { ALLOWED_PACKAGES, RESTRICTED_PATTERNS }\n\n/** The names in ALLOWED_PACKAGES, for lookups. */\nexport const ALLOWED_PACKAGE_NAMES: ReadonlySet<string> = new Set(ALLOWED_PACKAGES.map((p) => p.name))\n\nexport type CodeCheck = { valid: true; packages: string[] } | { valid: false; error: string }\n\n/**\n * Check a step's code the way the platform's upload does.\n *\n * On success, also says which packages it requires \u2014 the ones a local run has to\n * be able to load.\n */\nexport function validatePluginCode(code: string): CodeCheck {\n const hasExecute = code.includes(\"module.exports\") || code.includes(\"exports.execute\") || code.includes(\"export\")\n if (!hasExecute) {\n return {\n valid: false,\n error: \"Plugin code must export an execute function. Example: module.exports = { execute: async (input, config, context) => { ... } }\",\n }\n }\n\n for (const pattern of RESTRICTED_PATTERNS) {\n if (pattern.test(code)) {\n return {\n valid: false,\n error:\n \"Plugin code contains restricted patterns. Plugins cannot access the filesystem, spawn processes, use eval, import modules, or escape the sandbox.\"\n + ` (matched ${pattern})`,\n }\n }\n }\n\n const packages: string[] = []\n const requireCall = /\\brequire\\s*\\(\\s*(['\"])([^'\"]+)\\1\\s*\\)/g\n let match: RegExpExecArray | null\n while ((match = requireCall.exec(code)) !== null) {\n const name = match[2]\n if (!ALLOWED_PACKAGE_NAMES.has(name)) {\n return {\n valid: false,\n error: `Plugin code requires \"${name}\" which is not an allowed package. See ALLOWED_PACKAGES for the list.`,\n }\n }\n if (!packages.includes(name)) packages.push(name)\n }\n\n if (/\\brequire\\s*\\(\\s*(?!['\"][^'\"]+['\"]\\s*\\))/.test(code)) {\n return {\n valid: false,\n error: \"Plugin code contains a dynamic require() call. Only require() with string literals of allowed packages is permitted.\",\n }\n }\n\n return { valid: true, packages }\n}\n\n/**\n * The `require` a step gets inside the sandbox, backed by a loader of your own.\n *\n * `load` is how this machine finds a package \u2014 in the CLI, Node's resolution\n * from the project's directory. The sandbox has every allowed package installed;\n * a laptop has whatever was installed there, so a missing one is reported with\n * the command that installs the version the sandbox has.\n */\nexport function sandboxRequire(load: (name: string) => unknown): (name: string) => unknown {\n return (name: string) => {\n const allowed = ALLOWED_PACKAGES.find((p) => p.name === name)\n if (!allowed) throw new Error(`Cannot require \"${name}\"`)\n try {\n return load(name)\n } catch {\n throw new Error(\n `\"${name}\" is available in the sandbox but not installed here. `\n + `To run this locally: npm install --save-dev ${name}@${allowed.version}`,\n )\n }\n }\n}\n\n/**\n * Evaluate a step's code the way the sandbox wraps it: as the body of a function\n * given `module`, `exports` and `require`, in strict mode. Returns what it exported.\n *\n * Not a security boundary \u2014 this runs your own code on your own machine. It is\n * here so a file the sandbox cannot load (an `export` statement, a top-level\n * `await`) fails here too, rather than passing a looser loader.\n */\nexport function loadPluginCode(code: string, require: (name: string) => unknown): unknown {\n const module = { exports: {} as unknown }\n // eslint-disable-next-line no-new-func\n const body = new Function(\"module\", \"exports\", \"require\", `\"use strict\"; ${code}`)\n body(module, module.exports, require)\n return module.exports\n}\n", "/**\n * The runtime API, as data.\n *\n * The same things types.ts describes, in a form a tool can read without a\n * TypeScript compiler: an editor's autocomplete, a documentation page, a lint\n * rule. Each entry is a name an author types, what it is, and a one-line\n * description.\n *\n * Plain data with no imports, so it can go into a browser bundle without the\n * rest of the SDK.\n */\n\nexport interface ContextApiEntry {\n /** What an author types, e.g. `context.storage.put`. */\n path: string\n /** `property` for a value, `method` for something you call. */\n kind: \"variable\" | \"property\" | \"method\"\n /** The signature, for a method. Shown beside the name. */\n signature?: string\n /** One line, in the hover card. */\n info: string\n /**\n * Set when the helper is not always there.\n *\n * The editor says so, because the alternative is an author writing\n * `context.media.run(...)` against a completion that promised it existed\n * and meeting `undefined` on somebody's canvas.\n */\n conditional?: string\n}\n\n/** Everything a plugin is called with, and everything it can reach. */\nexport const CONTEXT_API: ContextApiEntry[] = [\n { path: \"input\", kind: \"variable\", info: \"What the steps before this one produced, keyed by step name.\" },\n { path: \"config\", kind: \"variable\", info: \"The fields somebody filled in on the canvas.\" },\n { path: \"context\", kind: \"variable\", info: \"Everything about the run: ids, storage, state, media, connections.\" },\n\n { path: \"context.workflowId\", kind: \"property\", info: \"The workflow this run belongs to.\" },\n { path: \"context.nodeId\", kind: \"property\", info: \"This step's id on the canvas.\" },\n { path: \"context.userId\", kind: \"property\", info: \"Whose run it is.\" },\n { path: \"context.executionId\", kind: \"property\", info: \"This run, distinct from every other run of the workflow.\" },\n { path: \"context.startedAt\", kind: \"property\", info: \"When the run started, as an ISO string.\" },\n { path: \"context.secrets\", kind: \"property\", info: \"Values the plugin was published with. Never the user's credentials.\" },\n\n {\n path: \"context.storage.put\",\n kind: \"method\",\n signature: \"(path, data, contentType?) => Promise<StorageResult>\",\n info: \"Write a file to the account's storage. Data may be a string or bytes.\",\n },\n {\n path: \"context.storage.get\",\n kind: \"method\",\n signature: \"(path) => Promise<Uint8Array | null>\",\n info: \"Read a file back. null when it is not there.\",\n },\n { path: \"context.storage.delete\", kind: \"method\", signature: \"(path) => Promise<void>\", info: \"Remove a file.\" },\n {\n path: \"context.storage.list\",\n kind: \"method\",\n signature: \"(prefix?) => Promise<{ files, totalSize }>\",\n info: \"Everything under a prefix, or everything.\",\n },\n {\n path: \"context.storage.head\",\n kind: \"method\",\n signature: \"(path) => Promise<{ size, contentType } | null>\",\n info: \"Size and content type without moving the bytes.\",\n },\n {\n path: \"context.storage.signedUrl\",\n kind: \"method\",\n signature: \"(path, expiresInSeconds?) => Promise<string | null>\",\n info: \"A link somebody else can fetch the file from, for a few minutes. For APIs that pull rather than take bytes.\",\n },\n {\n path: \"context.storage.download\",\n kind: \"method\",\n signature: \"(url, path, contentType?) => Promise<StorageResult>\",\n info: \"Pull a URL straight into storage. The bytes never cross this step, so a large file costs the run nothing.\",\n conditional: \"Only when the download Worker is configured on the server.\",\n },\n\n {\n path: \"context.state.get\",\n kind: \"method\",\n signature: \"(key) => Promise<unknown>\",\n info: \"A value this workflow stored on an earlier run. null when never set.\",\n },\n {\n path: \"context.state.set\",\n kind: \"method\",\n signature: \"(key, value, { ttlSeconds }?) => Promise<void>\",\n info: \"Remember something between runs \u2014 a cursor, a last-seen id, a counter.\",\n },\n { path: \"context.state.delete\", kind: \"method\", signature: \"(key) => Promise<void>\", info: \"Forget one key.\" },\n {\n path: \"context.state.list\",\n kind: \"method\",\n signature: \"(prefix?) => Promise<{ keys }>\",\n info: \"Which keys this workflow has stored.\",\n },\n\n {\n path: \"context.media.run\",\n kind: \"method\",\n signature: \"(operation, params) => Promise<Record<string, unknown>>\",\n info: \"ffmpeg, by operation name. A plugin never builds a command line \u2014 the server does, one operation at a time.\",\n conditional: \"Only when the sandbox and storage are both configured.\",\n },\n\n {\n path: \"context.connections.get\",\n kind: \"method\",\n signature: \"(propertyName) => Promise<{ id, request }>\",\n info: \"One of the accounts this step was configured with. Takes your property name, not a connection id.\",\n conditional: \"Only when the step declares a `connection` property and an account was chosen.\",\n },\n {\n path: \"context.connections.get(...).request\",\n kind: \"method\",\n signature: \"({ path, method?, query?, headers?, body? }) => Promise<{ ok, status, body }>\",\n info: \"A request to the provider, with the credential attached on the way past. Relative paths only \u2014 never a host, and there is no getToken().\",\n },\n\n { path: \"module.exports.execute\", kind: \"method\", signature: \"(input, config, context) => ({ output, data })\", info: \"The entry point. Return which port to leave by and what to hand on.\" },\n { path: \"console.log\", kind: \"method\", info: \"Appears in the run's log panel. Not on stdout \u2014 the platform reads that.\" },\n { path: \"console.error\", kind: \"method\", info: \"Appears in the run's log panel, marked as an error.\" },\n]\n\n/**\n * The globals a plugin does NOT get, and what to reach for instead.\n *\n * Worth offering in an editor as much as the API is: an author who types\n * `require('fs')` should be told at the keystroke rather than at the push.\n */\nexport const BLOCKED_GLOBALS: Array<{ name: string; instead: string }> = [\n { name: \"process\", instead: \"Ids and secrets are on `context`.\" },\n { name: \"fs\", instead: \"Use context.storage.\" },\n { name: \"child_process\", instead: \"Not available. For ffmpeg, use context.media.run.\" },\n { name: \"os\", instead: \"Not available.\" },\n { name: \"net\", instead: \"Use fetch.\" },\n { name: \"http\", instead: \"Use fetch.\" },\n { name: \"https\", instead: \"Use fetch.\" },\n { name: \"eval\", instead: \"Not available.\" },\n { name: \"Function\", instead: \"Not available as a constructor.\" },\n { name: \"Buffer\", instead: \"Use Uint8Array and TextEncoder/TextDecoder.\" },\n { name: \"__dirname\", instead: \"There is no meaningful filesystem.\" },\n]\n"],
5
- "mappings": "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AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AACJ;AAGO,IAAM,sBAA6C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;AC3mCO,IAAM,wBAA6C,IAAI,IAAI,iBAAiB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAU9F,SAAS,mBAAmB,MAAyB;AACxD,QAAM,aAAa,KAAK,SAAS,gBAAgB,KAAK,KAAK,SAAS,iBAAiB,KAAK,KAAK,SAAS,QAAQ;AAChH,MAAI,CAAC,YAAY;AACb,WAAO;AAAA,MACH,OAAO;AAAA,MACP,OAAO;AAAA,IACX;AAAA,EACJ;AAEA,aAAW,WAAW,qBAAqB;AACvC,QAAI,QAAQ,KAAK,IAAI,GAAG;AACpB,aAAO;AAAA,QACH,OAAO;AAAA,QACP,OACI,8JACe,OAAO;AAAA,MAC9B;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,WAAqB,CAAC;AAC5B,QAAM,cAAc;AACpB,MAAI;AACJ,UAAQ,QAAQ,YAAY,KAAK,IAAI,OAAO,MAAM;AAC9C,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,sBAAsB,IAAI,IAAI,GAAG;AAClC,aAAO;AAAA,QACH,OAAO;AAAA,QACP,OAAO,yBAAyB,IAAI;AAAA,MACxC;AAAA,IACJ;AACA,QAAI,CAAC,SAAS,SAAS,IAAI,EAAG,UAAS,KAAK,IAAI;AAAA,EACpD;AAEA,MAAI,2CAA2C,KAAK,IAAI,GAAG;AACvD,WAAO;AAAA,MACH,OAAO;AAAA,MACP,OAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO,EAAE,OAAO,MAAM,SAAS;AACnC;AAUO,SAAS,eAAe,MAA4D;AACvF,SAAO,CAAC,SAAiB;AACrB,UAAM,UAAU,iBAAiB,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC5D,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mBAAmB,IAAI,GAAG;AACxD,QAAI;AACA,aAAO,KAAK,IAAI;AAAA,IACpB,QAAQ;AACJ,YAAM,IAAI;AAAA,QACN,IAAI,IAAI,qGACyC,IAAI,IAAI,QAAQ,OAAO;AAAA,MAC5E;AAAA,IACJ;AAAA,EACJ;AACJ;AAUO,SAAS,eAAe,MAAcA,UAA6C;AACtF,QAAM,SAAS,EAAE,SAAS,CAAC,EAAa;AAExC,QAAM,OAAO,IAAI,SAAS,UAAU,WAAW,WAAW,iBAAiB,IAAI,EAAE;AACjF,OAAK,QAAQ,OAAO,SAASA,QAAO;AACpC,SAAO,OAAO;AAClB;;;AC3EO,IAAM,cAAiC;AAAA,EAC1C,EAAE,MAAM,SAAS,MAAM,YAAY,MAAM,+DAA+D;AAAA,EACxG,EAAE,MAAM,UAAU,MAAM,YAAY,MAAM,+CAA+C;AAAA,EACzF,EAAE,MAAM,WAAW,MAAM,YAAY,MAAM,qEAAqE;AAAA,EAEhH,EAAE,MAAM,sBAAsB,MAAM,YAAY,MAAM,oCAAoC;AAAA,EAC1F,EAAE,MAAM,kBAAkB,MAAM,YAAY,MAAM,gCAAgC;AAAA,EAClF,EAAE,MAAM,kBAAkB,MAAM,YAAY,MAAM,mBAAmB;AAAA,EACrE,EAAE,MAAM,uBAAuB,MAAM,YAAY,MAAM,2DAA2D;AAAA,EAClH,EAAE,MAAM,qBAAqB,MAAM,YAAY,MAAM,0CAA0C;AAAA,EAC/F,EAAE,MAAM,mBAAmB,MAAM,YAAY,MAAM,sEAAsE;AAAA,EAEzH;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EACA,EAAE,MAAM,0BAA0B,MAAM,UAAU,WAAW,2BAA2B,MAAM,iBAAiB;AAAA,EAC/G;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EAEA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EACA,EAAE,MAAM,wBAAwB,MAAM,UAAU,WAAW,0BAA0B,MAAM,kBAAkB;AAAA,EAC7G;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EAEA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EAEA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACV;AAAA,EAEA,EAAE,MAAM,0BAA0B,MAAM,UAAU,WAAW,kDAAkD,MAAM,sEAAsE;AAAA,EAC3L,EAAE,MAAM,eAAe,MAAM,UAAU,MAAM,gFAA2E;AAAA,EACxH,EAAE,MAAM,iBAAiB,MAAM,UAAU,MAAM,sDAAsD;AACzG;AAQO,IAAM,kBAA4D;AAAA,EACrE,EAAE,MAAM,WAAW,SAAS,oCAAoC;AAAA,EAChE,EAAE,MAAM,MAAM,SAAS,uBAAuB;AAAA,EAC9C,EAAE,MAAM,iBAAiB,SAAS,oDAAoD;AAAA,EACtF,EAAE,MAAM,MAAM,SAAS,iBAAiB;AAAA,EACxC,EAAE,MAAM,OAAO,SAAS,aAAa;AAAA,EACrC,EAAE,MAAM,QAAQ,SAAS,aAAa;AAAA,EACtC,EAAE,MAAM,SAAS,SAAS,aAAa;AAAA,EACvC,EAAE,MAAM,QAAQ,SAAS,iBAAiB;AAAA,EAC1C,EAAE,MAAM,YAAY,SAAS,kCAAkC;AAAA,EAC/D,EAAE,MAAM,UAAU,SAAS,8CAA8C;AAAA,EACzE,EAAE,MAAM,aAAa,SAAS,qCAAqC;AACvE;",
3
+ "sources": ["../src/platform-rules.ts", "../src/runtime.ts", "../src/simulate.ts", "../src/validate.ts", "../src/manifest-check.ts", "../src/context-api.ts"],
4
+ "sourcesContent": ["/**\n * The rules the VisualAutomate platform applies to a step, as facts.\n *\n * GENERATED by scripts/sync-platform.mjs from the platform's and the developer\n * portal's source. Do not edit by hand: run the script, so a local test refuses\n * what an upload would refuse and runs a step the way the platform runs it.\n */\n\n/** The npm packages a step may require, and the version the sandbox installs. */\nexport const ALLOWED_PACKAGES: ReadonlyArray<{ name: string; version: string }> = [\n {\n \"name\": \"nodemailer\",\n \"version\": \"^10.0.16\"\n },\n {\n \"name\": \"lodash\",\n \"version\": \"^4.17.21\"\n },\n {\n \"name\": \"ramda\",\n \"version\": \"^0.30.1\"\n },\n {\n \"name\": \"underscore\",\n \"version\": \"^1.13.8\"\n },\n {\n \"name\": \"immer\",\n \"version\": \"^11.1.18\"\n },\n {\n \"name\": \"immutable\",\n \"version\": \"^5.1.9\"\n },\n {\n \"name\": \"deepmerge\",\n \"version\": \"^4.3.1\"\n },\n {\n \"name\": \"defu\",\n \"version\": \"^6.1.7\"\n },\n {\n \"name\": \"rfdc\",\n \"version\": \"^1.4.1\"\n },\n {\n \"name\": \"klona\",\n \"version\": \"^2.0.6\"\n },\n {\n \"name\": \"fast-copy\",\n \"version\": \"^4.1.1\"\n },\n {\n \"name\": \"fast-deep-equal\",\n \"version\": \"^3.1.3\"\n },\n {\n \"name\": \"dequal\",\n \"version\": \"^2.0.3\"\n },\n {\n \"name\": \"object-hash\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"hash-sum\",\n \"version\": \"^2.0.0\"\n },\n {\n \"name\": \"flat\",\n \"version\": \"^6.0.1\"\n },\n {\n \"name\": \"dot-prop\",\n \"version\": \"^10.2.0\"\n },\n {\n \"name\": \"object-path\",\n \"version\": \"^0.11.8\"\n },\n {\n \"name\": \"sort-array\",\n \"version\": \"^5.1.1\"\n },\n {\n \"name\": \"natural-orderby\",\n \"version\": \"^5.0.0\"\n },\n {\n \"name\": \"deep-object-diff\",\n \"version\": \"^1.1.9\"\n },\n {\n \"name\": \"microdiff\",\n \"version\": \"^1.6.0\"\n },\n {\n \"name\": \"fast-json-patch\",\n \"version\": \"^3.1.1\"\n },\n {\n \"name\": \"rfc6902\",\n \"version\": \"^5.3.0\"\n },\n {\n \"name\": \"just-clone\",\n \"version\": \"^6.2.0\"\n },\n {\n \"name\": \"just-diff\",\n \"version\": \"^6.0.2\"\n },\n {\n \"name\": \"just-diff-apply\",\n \"version\": \"^5.5.0\"\n },\n {\n \"name\": \"just-omit\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"just-pick\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-group-by\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"just-order-by\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"just-unique\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-flatten-it\",\n \"version\": \"^5.2.0\"\n },\n {\n \"name\": \"just-safe-get\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-safe-set\",\n \"version\": \"^4.2.1\"\n },\n {\n \"name\": \"just-typeof\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"just-range\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"just-zip-it\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"just-compare\",\n \"version\": \"^2.3.0\"\n },\n {\n \"name\": \"just-intersect\",\n \"version\": \"^4.3.0\"\n },\n {\n \"name\": \"just-split\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"just-truncate\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"semver\",\n \"version\": \"^7.6.3\"\n },\n {\n \"name\": \"compare-versions\",\n \"version\": \"^6.1.1\"\n },\n {\n \"name\": \"tiny-invariant\",\n \"version\": \"^1.3.3\"\n },\n {\n \"name\": \"json-stringify-safe\",\n \"version\": \"^5.0.1\"\n },\n {\n \"name\": \"fast-safe-stringify\",\n \"version\": \"^2.1.1\"\n },\n {\n \"name\": \"flatted\",\n \"version\": \"^3.4.4\"\n },\n {\n \"name\": \"superjson\",\n \"version\": \"^2.2.6\"\n },\n {\n \"name\": \"devalue\",\n \"version\": \"^5.9.2\"\n },\n {\n \"name\": \"lru-cache\",\n \"version\": \"^11.5.2\"\n },\n {\n \"name\": \"quick-lru\",\n \"version\": \"^7.3.0\"\n },\n {\n \"name\": \"memoize-one\",\n \"version\": \"^6.0.0\"\n },\n {\n \"name\": \"fast-memoize\",\n \"version\": \"^2.5.2\"\n },\n {\n \"name\": \"uuid\",\n \"version\": \"^11.1.1\"\n },\n {\n \"name\": \"nanoid\",\n \"version\": \"^5.0.9\"\n },\n {\n \"name\": \"ulid\",\n \"version\": \"^3.0.2\"\n },\n {\n \"name\": \"@paralleldrive/cuid2\",\n \"version\": \"^3.3.0\"\n },\n {\n \"name\": \"slugify\",\n \"version\": \"^1.6.6\"\n },\n {\n \"name\": \"slug\",\n \"version\": \"^12.0.1\"\n },\n {\n \"name\": \"sanitize-filename\",\n \"version\": \"^1.6.4\"\n },\n {\n \"name\": \"filenamify\",\n \"version\": \"^7.0.3\"\n },\n {\n \"name\": \"seedrandom\",\n \"version\": \"^3.0.5\"\n },\n {\n \"name\": \"random-js\",\n \"version\": \"^2.1.0\"\n },\n {\n \"name\": \"chance\",\n \"version\": \"^1.1.13\"\n },\n {\n \"name\": \"@faker-js/faker\",\n \"version\": \"^10.6.0\"\n },\n {\n \"name\": \"lorem-ipsum\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"randomcolor\",\n \"version\": \"^0.6.2\"\n },\n {\n \"name\": \"date-fns\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"date-fns-tz\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"dayjs\",\n \"version\": \"^1.11.13\"\n },\n {\n \"name\": \"luxon\",\n \"version\": \"^3.5.0\"\n },\n {\n \"name\": \"moment\",\n \"version\": \"^2.30.1\"\n },\n {\n \"name\": \"moment-timezone\",\n \"version\": \"^0.6.3\"\n },\n {\n \"name\": \"ms\",\n \"version\": \"^2.1.3\"\n },\n {\n \"name\": \"pretty-ms\",\n \"version\": \"^9.3.1\"\n },\n {\n \"name\": \"parse-duration\",\n \"version\": \"^2.1.8\"\n },\n {\n \"name\": \"humanize-duration\",\n \"version\": \"^3.34.1\"\n },\n {\n \"name\": \"timeago.js\",\n \"version\": \"^4.0.2\"\n },\n {\n \"name\": \"chrono-node\",\n \"version\": \"^2.7.7\"\n },\n {\n \"name\": \"rrule\",\n \"version\": \"^2.8.1\"\n },\n {\n \"name\": \"cron-parser\",\n \"version\": \"^5.10.0\"\n },\n {\n \"name\": \"cronstrue\",\n \"version\": \"^3.26.0\"\n },\n {\n \"name\": \"date-and-time\",\n \"version\": \"^4.5.2\"\n },\n {\n \"name\": \"fecha\",\n \"version\": \"^4.2.3\"\n },\n {\n \"name\": \"dateformat\",\n \"version\": \"^5.0.3\"\n },\n {\n \"name\": \"iso8601-duration\",\n \"version\": \"^2.1.4\"\n },\n {\n \"name\": \"ics\",\n \"version\": \"^3.12.0\"\n },\n {\n \"name\": \"zod\",\n \"version\": \"^3.24.1\"\n },\n {\n \"name\": \"yup\",\n \"version\": \"^1.6.1\"\n },\n {\n \"name\": \"joi\",\n \"version\": \"^18.2.8\"\n },\n {\n \"name\": \"ajv\",\n \"version\": \"^8.17.1\"\n },\n {\n \"name\": \"ajv-formats\",\n \"version\": \"^3.0.1\"\n },\n {\n \"name\": \"ajv-errors\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"superstruct\",\n \"version\": \"^2.0.2\"\n },\n {\n \"name\": \"valibot\",\n \"version\": \"^1.5.0\"\n },\n {\n \"name\": \"jsonschema\",\n \"version\": \"^1.5.0\"\n },\n {\n \"name\": \"@sinclair/typebox\",\n \"version\": \"^0.34.52\"\n },\n {\n \"name\": \"validator\",\n \"version\": \"^13.12.0\"\n },\n {\n \"name\": \"email-validator\",\n \"version\": \"^2.0.4\"\n },\n {\n \"name\": \"libphonenumber-js\",\n \"version\": \"^1.11.17\"\n },\n {\n \"name\": \"iban\",\n \"version\": \"^0.0.14\"\n },\n {\n \"name\": \"credit-card-type\",\n \"version\": \"^10.3.0\"\n },\n {\n \"name\": \"card-validator\",\n \"version\": \"^10.0.4\"\n },\n {\n \"name\": \"psl\",\n \"version\": \"^1.15.0\"\n },\n {\n \"name\": \"tldts\",\n \"version\": \"^7.4.12\"\n },\n {\n \"name\": \"normalize-url\",\n \"version\": \"^9.0.1\"\n },\n {\n \"name\": \"valid-url\",\n \"version\": \"^1.0.9\"\n },\n {\n \"name\": \"is-ip\",\n \"version\": \"^5.0.1\"\n },\n {\n \"name\": \"ipaddr.js\",\n \"version\": \"^2.5.0\"\n },\n {\n \"name\": \"ip-address\",\n \"version\": \"^10.7.0\"\n },\n {\n \"name\": \"netmask\",\n \"version\": \"^2.1.1\"\n },\n {\n \"name\": \"ua-parser-js\",\n \"version\": \"^2.0.10\"\n },\n {\n \"name\": \"bowser\",\n \"version\": \"^2.14.1\"\n },\n {\n \"name\": \"papaparse\",\n \"version\": \"^5.4.1\"\n },\n {\n \"name\": \"csv-parse\",\n \"version\": \"^7.0.2\"\n },\n {\n \"name\": \"csv-stringify\",\n \"version\": \"^6.8.3\"\n },\n {\n \"name\": \"json-2-csv\",\n \"version\": \"^5.6.0\"\n },\n {\n \"name\": \"js-yaml\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"yaml\",\n \"version\": \"^2.9.0\"\n },\n {\n \"name\": \"json5\",\n \"version\": \"^2.2.3\"\n },\n {\n \"name\": \"jsonc-parser\",\n \"version\": \"^3.3.1\"\n },\n {\n \"name\": \"hjson\",\n \"version\": \"^3.2.2\"\n },\n {\n \"name\": \"toml\",\n \"version\": \"^5.0.0\"\n },\n {\n \"name\": \"@iarna/toml\",\n \"version\": \"^2.2.5\"\n },\n {\n \"name\": \"ini\",\n \"version\": \"^7.0.0\"\n },\n {\n \"name\": \"fast-xml-parser\",\n \"version\": \"^5.11.2\"\n },\n {\n \"name\": \"xml2js\",\n \"version\": \"^0.6.2\"\n },\n {\n \"name\": \"xml-js\",\n \"version\": \"^1.6.11\"\n },\n {\n \"name\": \"xmlbuilder2\",\n \"version\": \"^4.0.3\"\n },\n {\n \"name\": \"@xmldom/xmldom\",\n \"version\": \"^0.9.12\"\n },\n {\n \"name\": \"xpath\",\n \"version\": \"^0.0.34\"\n },\n {\n \"name\": \"cheerio\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"htmlparser2\",\n \"version\": \"^12.0.0\"\n },\n {\n \"name\": \"node-html-parser\",\n \"version\": \"^9.0.4\"\n },\n {\n \"name\": \"parse5\",\n \"version\": \"^8.0.1\"\n },\n {\n \"name\": \"sanitize-html\",\n \"version\": \"^2.17.7\"\n },\n {\n \"name\": \"marked\",\n \"version\": \"^15.0.6\"\n },\n {\n \"name\": \"markdown-it\",\n \"version\": \"^15.0.1\"\n },\n {\n \"name\": \"showdown\",\n \"version\": \"^2.1.0\"\n },\n {\n \"name\": \"turndown\",\n \"version\": \"^7.2.0\"\n },\n {\n \"name\": \"html-to-text\",\n \"version\": \"^9.0.5\"\n },\n {\n \"name\": \"he\",\n \"version\": \"^1.2.0\"\n },\n {\n \"name\": \"entities\",\n \"version\": \"^8.1.0\"\n },\n {\n \"name\": \"striptags\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"front-matter\",\n \"version\": \"^4.0.2\"\n },\n {\n \"name\": \"qs\",\n \"version\": \"^6.13.1\"\n },\n {\n \"name\": \"query-string\",\n \"version\": \"^9.5.1\"\n },\n {\n \"name\": \"url-parse\",\n \"version\": \"^1.5.10\"\n },\n {\n \"name\": \"mime-types\",\n \"version\": \"^2.1.35\"\n },\n {\n \"name\": \"mime\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"content-type\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"cookie\",\n \"version\": \"^2.0.1\"\n },\n {\n \"name\": \"set-cookie-parser\",\n \"version\": \"^3.1.2\"\n },\n {\n \"name\": \"jsonpath-plus\",\n \"version\": \"^10.2.0\"\n },\n {\n \"name\": \"jmespath\",\n \"version\": \"^0.16.0\"\n },\n {\n \"name\": \"jsonata\",\n \"version\": \"^2.2.2\"\n },\n {\n \"name\": \"exceljs\",\n \"version\": \"^4.4.0\"\n },\n {\n \"name\": \"change-case\",\n \"version\": \"^5.4.4\"\n },\n {\n \"name\": \"camelcase\",\n \"version\": \"^9.0.0\"\n },\n {\n \"name\": \"decamelize\",\n \"version\": \"^6.0.1\"\n },\n {\n \"name\": \"title-case\",\n \"version\": \"^4.3.2\"\n },\n {\n \"name\": \"pluralize\",\n \"version\": \"^8.0.0\"\n },\n {\n \"name\": \"inflection\",\n \"version\": \"^3.0.2\"\n },\n {\n \"name\": \"voca\",\n \"version\": \"^1.4.1\"\n },\n {\n \"name\": \"underscore.string\",\n \"version\": \"^3.3.6\"\n },\n {\n \"name\": \"string-similarity\",\n \"version\": \"^4.0.4\"\n },\n {\n \"name\": \"fastest-levenshtein\",\n \"version\": \"^1.0.16\"\n },\n {\n \"name\": \"leven\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"diff\",\n \"version\": \"^8.0.4\"\n },\n {\n \"name\": \"diff-match-patch\",\n \"version\": \"^1.0.5\"\n },\n {\n \"name\": \"remove-accents\",\n \"version\": \"^0.5.0\"\n },\n {\n \"name\": \"transliteration\",\n \"version\": \"^2.6.1\"\n },\n {\n \"name\": \"latinize\",\n \"version\": \"^2.0.0\"\n },\n {\n \"name\": \"franc\",\n \"version\": \"^6.2.0\"\n },\n {\n \"name\": \"stopword\",\n \"version\": \"^3.1.5\"\n },\n {\n \"name\": \"emoji-regex\",\n \"version\": \"^10.6.0\"\n },\n {\n \"name\": \"node-emoji\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"string-width\",\n \"version\": \"^8.2.2\"\n },\n {\n \"name\": \"word-wrap\",\n \"version\": \"^1.2.5\"\n },\n {\n \"name\": \"wrap-ansi\",\n \"version\": \"^10.0.1\"\n },\n {\n \"name\": \"linkify-it\",\n \"version\": \"^6.1.0\"\n },\n {\n \"name\": \"linkifyjs\",\n \"version\": \"^4.3.3\"\n },\n {\n \"name\": \"fuse.js\",\n \"version\": \"^7.5.0\"\n },\n {\n \"name\": \"minisearch\",\n \"version\": \"^7.2.0\"\n },\n {\n \"name\": \"lunr\",\n \"version\": \"^2.3.9\"\n },\n {\n \"name\": \"flexsearch\",\n \"version\": \"^0.8.212\"\n },\n {\n \"name\": \"mustache\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"liquidjs\",\n \"version\": \"^10.20.1\"\n },\n {\n \"name\": \"intl-messageformat\",\n \"version\": \"^11.2.14\"\n },\n {\n \"name\": \"gpt-tokenizer\",\n \"version\": \"^4.0.0\"\n },\n {\n \"name\": \"js-tiktoken\",\n \"version\": \"^1.0.21\"\n },\n {\n \"name\": \"decimal.js\",\n \"version\": \"^10.4.3\"\n },\n {\n \"name\": \"big.js\",\n \"version\": \"^6.2.2\"\n },\n {\n \"name\": \"bignumber.js\",\n \"version\": \"^11.1.5\"\n },\n {\n \"name\": \"currency.js\",\n \"version\": \"^2.0.4\"\n },\n {\n \"name\": \"dinero.js\",\n \"version\": \"^2.0.2\"\n },\n {\n \"name\": \"numeral\",\n \"version\": \"^2.0.6\"\n },\n {\n \"name\": \"accounting\",\n \"version\": \"^0.4.1\"\n },\n {\n \"name\": \"fraction.js\",\n \"version\": \"^5.3.4\"\n },\n {\n \"name\": \"convert-units\",\n \"version\": \"^2.3.4\"\n },\n {\n \"name\": \"js-quantities\",\n \"version\": \"^1.8.0\"\n },\n {\n \"name\": \"mathjs\",\n \"version\": \"^15.2.0\"\n },\n {\n \"name\": \"simple-statistics\",\n \"version\": \"^7.12.0\"\n },\n {\n \"name\": \"ml-matrix\",\n \"version\": \"^6.15.0\"\n },\n {\n \"name\": \"d3-array\",\n \"version\": \"^3.2.4\"\n },\n {\n \"name\": \"d3-format\",\n \"version\": \"^3.1.2\"\n },\n {\n \"name\": \"d3-time-format\",\n \"version\": \"^4.1.0\"\n },\n {\n \"name\": \"geolib\",\n \"version\": \"^3.3.14\"\n },\n {\n \"name\": \"haversine-distance\",\n \"version\": \"^1.2.4\"\n },\n {\n \"name\": \"filesize\",\n \"version\": \"^11.0.23\"\n },\n {\n \"name\": \"bytes\",\n \"version\": \"^3.1.2\"\n },\n {\n \"name\": \"human-format\",\n \"version\": \"^1.2.1\"\n },\n {\n \"name\": \"jsonwebtoken\",\n \"version\": \"^9.0.2\"\n },\n {\n \"name\": \"jose\",\n \"version\": \"^5.9.6\"\n },\n {\n \"name\": \"jws\",\n \"version\": \"^4.0.1\"\n },\n {\n \"name\": \"jwt-decode\",\n \"version\": \"^4.0.0\"\n },\n {\n \"name\": \"crypto-js\",\n \"version\": \"^4.2.0\"\n },\n {\n \"name\": \"bcryptjs\",\n \"version\": \"^2.4.3\"\n },\n {\n \"name\": \"otplib\",\n \"version\": \"^13.5.0\"\n },\n {\n \"name\": \"otpauth\",\n \"version\": \"^9.5.2\"\n },\n {\n \"name\": \"tweetnacl\",\n \"version\": \"^1.0.3\"\n },\n {\n \"name\": \"tweetnacl-util\",\n \"version\": \"^0.15.1\"\n },\n {\n \"name\": \"node-forge\",\n \"version\": \"^1.4.0\"\n },\n {\n \"name\": \"elliptic\",\n \"version\": \"^6.6.1\"\n },\n {\n \"name\": \"bn.js\",\n \"version\": \"^5.2.5\"\n },\n {\n \"name\": \"js-base64\",\n \"version\": \"^3.7.7\"\n },\n {\n \"name\": \"base64-js\",\n \"version\": \"^1.5.1\"\n },\n {\n \"name\": \"base-64\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"hi-base32\",\n \"version\": \"^0.5.1\"\n },\n {\n \"name\": \"thirty-two\",\n \"version\": \"^1.0.2\"\n },\n {\n \"name\": \"js-sha256\",\n \"version\": \"^1.0.0\"\n },\n {\n \"name\": \"js-sha512\",\n \"version\": \"^0.9.0\"\n },\n {\n \"name\": \"js-sha1\",\n \"version\": \"^0.7.0\"\n },\n {\n \"name\": \"js-md5\",\n \"version\": \"^0.9.2\"\n },\n {\n \"name\": \"hash.js\",\n \"version\": \"^1.1.7\"\n },\n {\n \"name\": \"spark-md5\",\n \"version\": \"^3.0.2\"\n },\n {\n \"name\": \"blueimp-md5\",\n \"version\": \"^2.19.0\"\n },\n {\n \"name\": \"crc-32\",\n \"version\": \"^1.2.2\"\n },\n {\n \"name\": \"crc\",\n \"version\": \"^4.3.2\"\n },\n {\n \"name\": \"utf8\",\n \"version\": \"^3.0.0\"\n },\n {\n \"name\": \"iconv-lite\",\n \"version\": \"^0.7.3\"\n },\n {\n \"name\": \"punycode\",\n \"version\": \"^2.3.1\"\n },\n {\n \"name\": \"pako\",\n \"version\": \"^3.0.1\"\n },\n {\n \"name\": \"fflate\",\n \"version\": \"^0.8.3\"\n },\n {\n \"name\": \"lz-string\",\n \"version\": \"^1.5.0\"\n },\n {\n \"name\": \"color\",\n \"version\": \"^5.0.3\"\n },\n {\n \"name\": \"tinycolor2\",\n \"version\": \"^1.6.0\"\n },\n {\n \"name\": \"chroma-js\",\n \"version\": \"^3.2.0\"\n },\n {\n \"name\": \"color-convert\",\n \"version\": \"^3.1.3\"\n },\n {\n \"name\": \"colord\",\n \"version\": \"^2.10.0\"\n },\n {\n \"name\": \"i18n-iso-countries\",\n \"version\": \"^7.14.0\"\n },\n {\n \"name\": \"iso-3166-1\",\n \"version\": \"^2.1.1\"\n },\n {\n \"name\": \"iso-639-1\",\n \"version\": \"^3.1.6\"\n },\n {\n \"name\": \"currency-codes\",\n \"version\": \"^2.2.0\"\n },\n {\n \"name\": \"qrcode-generator\",\n \"version\": \"^2.0.4\"\n },\n {\n \"name\": \"p-limit\",\n \"version\": \"^6.2.0\"\n },\n {\n \"name\": \"p-retry\",\n \"version\": \"^6.2.1\"\n },\n {\n \"name\": \"p-map\",\n \"version\": \"^7.0.3\"\n },\n {\n \"name\": \"p-queue\",\n \"version\": \"^9.3.3\"\n },\n {\n \"name\": \"p-timeout\",\n \"version\": \"^7.0.1\"\n },\n {\n \"name\": \"p-all\",\n \"version\": \"^5.0.1\"\n },\n {\n \"name\": \"p-props\",\n \"version\": \"^6.1.0\"\n },\n {\n \"name\": \"p-settle\",\n \"version\": \"^5.2.1\"\n },\n {\n \"name\": \"p-throttle\",\n \"version\": \"^8.1.0\"\n },\n {\n \"name\": \"p-debounce\",\n \"version\": \"^5.1.0\"\n },\n {\n \"name\": \"async\",\n \"version\": \"^3.2.6\"\n },\n {\n \"name\": \"bluebird\",\n \"version\": \"^3.7.2\"\n },\n {\n \"name\": \"promise-retry\",\n \"version\": \"^2.0.1\"\n },\n {\n \"name\": \"retry\",\n \"version\": \"^0.13.1\"\n },\n {\n \"name\": \"exponential-backoff\",\n \"version\": \"^3.1.3\"\n },\n {\n \"name\": \"bottleneck\",\n \"version\": \"^2.19.5\"\n },\n {\n \"name\": \"throttle-debounce\",\n \"version\": \"^5.0.2\"\n },\n {\n \"name\": \"delay\",\n \"version\": \"^7.0.0\"\n },\n {\n \"name\": \"graphlib\",\n \"version\": \"^2.1.8\"\n }\n]\n\n/** npm overrides the platform's sandbox installs the packages with. */\nexport const SANDBOX_OVERRIDES: Readonly<Record<string, Record<string, string>>> = {\n \"exceljs\": {\n \"uuid\": \"^11.1.1\"\n }\n}\n\n/** Code matching any of these is refused on upload. */\nexport const RESTRICTED_PATTERNS: ReadonlyArray<RegExp> = [\n /\\bprocess\\s*\\.\\s*exit/,\n /\\bprocess\\s*\\.\\s*env/,\n /\\bprocess\\s*\\.\\s*binding/,\n /\\bprocess\\s*\\.\\s*mainModule/,\n /\\bprocess\\s*\\[/,\n /\\bprocess\\s*\\(/,\n /\\beval\\s*\\(/,\n /\\bFunction\\s*\\(/,\n /\\bnew\\s+Function\\b/,\n /\\bAsyncFunction\\b/,\n /\\bGeneratorFunction\\b/,\n /\\bglobalThis\\b/,\n /\\bself\\s*\\[/,\n /\\bimport\\s+/,\n /\\bimport\\s*\\(/,\n /\\bReflect\\b/,\n /\\bProxy\\b/,\n /\\b__proto__\\b/,\n /\\bprototype\\s*\\[/,\n /\\bprototype\\s*\\.\\s*constructor\\b/,\n /\\bconstructor\\b/,\n /\\bthis\\s*\\.\\s*constructor\\b/,\n /\\barguments\\s*\\.\\s*callee\\b/,\n /\\bObject\\s*\\.\\s*defineProperty\\b/,\n /\\b__defineGetter__\\b/,\n /\\b__defineSetter__\\b/,\n /\\b__lookupGetter__\\b/,\n /\\b__lookupSetter__\\b/,\n /\\bmodule\\s*\\.\\s*(?:constructor|extensions|_compile|_path|_sourceMaps)\\b/,\n /\\brequire\\s*\\.\\s*cache\\b/,\n /\\brequire\\s*\\.\\s*resolve\\b/,\n /\\bError\\s*\\.\\s*captureStackTrace\\b/,\n /\\bWebAssembly\\b/,\n]\n\n/** Code longer than this many characters is refused on upload. */\nexport const MAX_CODE_LENGTH = 100000\n\n/** The major version of Node the platform runs steps on. */\nexport const PLATFORM_NODE_MAJOR = 24\n\n/**\n * The globals the runner hands a step's code, besides the language's own\n * (Object, Array, JSON, Math, Promise and the rest, which the step's context\n * has a fresh set of). `require` and `console` are among them.\n */\nexport const PROVIDED_GLOBALS: ReadonlyArray<string> = [\n \"fetch\",\n \"Request\",\n \"Response\",\n \"Headers\",\n \"URL\",\n \"URLSearchParams\",\n \"btoa\",\n \"atob\",\n \"console\",\n \"setTimeout\",\n \"clearTimeout\",\n \"setInterval\",\n \"clearInterval\",\n \"crypto\",\n \"TextEncoder\",\n \"TextDecoder\",\n \"ArrayBuffer\",\n \"Uint8Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"Int8Array\",\n \"Int16Array\",\n \"Int32Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"DataView\",\n \"Blob\",\n \"FormData\",\n \"AbortController\",\n \"AbortSignal\",\n \"require\"\n]\n\n/** Names the runner sets to undefined in a step's context. */\nexport const BLOCKED_GLOBAL_NAMES: ReadonlyArray<string> = [\n \"process\",\n \"global\",\n \"module\",\n \"exports\",\n \"__dirname\",\n \"__filename\",\n \"eval\",\n \"Function\",\n \"child_process\",\n \"fs\",\n \"os\",\n \"cluster\",\n \"dgram\",\n \"dns\",\n \"net\",\n \"http\",\n \"https\",\n \"path\",\n \"readline\",\n \"stream\",\n \"tls\",\n \"zlib\",\n \"buffer\",\n \"Buffer\",\n \"globalThis\",\n \"self\",\n \"window\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"WeakRef\",\n \"FinalizationRegistry\",\n \"AsyncFunction\",\n \"GeneratorFunction\",\n \"AsyncGeneratorFunction\",\n \"WebAssembly\"\n]\n\n/** The machines a run can be given, smallest first. */\nexport const SANDBOX_TIERS: ReadonlyArray<{ id: string; label: string; vcpus: number; memoryGb: number }> = [\n {\n \"id\": \"standard\",\n \"label\": \"Standard\",\n \"vcpus\": 0.5,\n \"memoryGb\": 4\n },\n {\n \"id\": \"boosted\",\n \"label\": \"Boosted\",\n \"vcpus\": 1,\n \"memoryGb\": 6\n },\n {\n \"id\": \"high\",\n \"label\": \"High\",\n \"vcpus\": 2,\n \"memoryGb\": 8\n }\n]\n\n/** Tier names that are no longer offered, and the tier they now mean. */\nexport const RETIRED_TIERS: Readonly<Record<string, string>> = {\n \"max\": \"high\"\n}\n\n/** Limits on `context.state`. */\nexport const STATE_LIMITS = {\n /** One value, once encoded as JSON. */\n maxValueBytes: 128 * 1024,\n /** The shortest `ttlSeconds` the store accepts. */\n minTtlSeconds: 60,\n} as const\n\n/** How long a `context.storage.signedUrl` link may be valid, in seconds. */\nexport const SIGNED_URL_SECONDS = { default: 900, min: 60, max: 3600 } as const\n\n/** How the developer portal's check on a push runs a step. */\nexport const PUSH_CHECK = {\n /** When manifest.json names no `timeoutMs`. The test file's is not read. */\n defaultTimeoutMs: 30000,\n /** The longest `timeoutMs` a manifest is given. */\n maxTimeoutMs: 60000,\n /** The port a run must leave by when the test file names none. */\n defaultExpectOutput: \"success\",\n /** A declared step (an `action` block) is tested in the portal's editor, not on a push. */\n declaredStepsTestedOnPush: false,\n} as const\n", "/**\n * Load a step's code the way the platform's runner does.\n *\n * The runner does not evaluate a step in its own process. It compiles the code\n * into a `vm` context of its own, hands it a fixed set of globals (fetch, URL,\n * the encoders, timers, crypto, the typed arrays, Blob, FormData and a few\n * more), sets a longer list to undefined (Buffer, process, globalThis,\n * SharedArrayBuffer, WeakRef, the Node modules by name) and gives it a console\n * with four methods. Everything else a step reaches for is the context's own\n * language objects.\n *\n * Loading code with `new Function` instead, in this process, gave a step all of\n * Node: `Buffer.from(\u2026)`, `structuredClone`, `process.version`, `console.debug`\n * all worked on a laptop and were undefined on the platform. A test that\n * passes here has to fail there for a reason worth looking for, not for that.\n *\n * The lists come from the platform's runner (see platform-rules.ts, which\n * scripts/sync-platform.mjs writes), so they cannot be remembered wrongly.\n *\n * Not a security boundary: this runs your own code on your own machine. The\n * platform's boundary is the container, one per run.\n */\nimport vm from \"node:vm\"\n\nimport { BLOCKED_GLOBAL_NAMES, PROVIDED_GLOBALS } from \"./platform-rules\"\n\n/** The console a step has: these four methods, and no others. */\nexport interface PluginConsole {\n log(...args: unknown[]): void\n error(...args: unknown[]): void\n warn(...args: unknown[]): void\n info(...args: unknown[]): void\n}\n\nexport interface LoadOptions {\n /**\n * The `fetch` the step gets. Pass a guarded one to apply an egress rule;\n * without it, this process's own.\n */\n fetch?: typeof fetch\n /** Where the step's console output goes. Defaults to this process's console. */\n console?: Partial<PluginConsole>\n /** How long the code's top level may take to run, in milliseconds. */\n timeoutMs?: number\n}\n\n/** A console with exactly the platform's four methods, writing where `target` says. */\nexport function pluginConsole(target: Partial<PluginConsole> = console): PluginConsole {\n const forward =\n (level: keyof PluginConsole) =>\n (...args: unknown[]) => {\n const write = target[level] ?? target.log ?? console.log\n write.apply(target, args)\n }\n return { log: forward(\"log\"), error: forward(\"error\"), warn: forward(\"warn\"), info: forward(\"info\") }\n}\n\n/**\n * The globals a step's context starts with: the platform's list, taken from\n * this process where the platform takes them from its own, and the blocked\n * names set to undefined.\n */\nexport function sandboxGlobals(options: LoadOptions = {}): Record<string, unknown> {\n const host = globalThis as unknown as Record<string, unknown>\n const globals: Record<string, unknown> = {}\n for (const name of PROVIDED_GLOBALS) {\n if (name === \"require\") continue\n if (name === \"console\") globals.console = pluginConsole(options.console)\n else if (name === \"fetch\") globals.fetch = options.fetch ?? host.fetch\n else globals[name] = host[name]\n }\n for (const name of BLOCKED_GLOBAL_NAMES) globals[name] = undefined\n return globals\n}\n\n/**\n * Evaluate a step's code as the runner does, and return what it exported.\n *\n * The code is wrapped exactly as the runner wraps it, on one line with nothing\n * added after it, so a file the platform cannot load fails to load here too:\n * a last line that is a `//` comment with no newline after it comments out the\n * wrapper's closing bracket on the platform, and does here.\n */\nexport function loadPluginCode(code: string, require: (name: string) => unknown, options: LoadOptions = {}): unknown {\n const sandbox = sandboxGlobals(options)\n Object.defineProperty(sandbox, \"constructor\", { value: undefined, writable: false, configurable: false })\n const wrapped =\n '(function(module, exports, context, require) { \"use strict\"; var console = context.console; ' + code + \" })\"\n const script = new vm.Script(wrapped, { filename: \"plugin.js\" })\n const context = vm.createContext(sandbox, { name: \"plugin-sandbox\" })\n const fn = script.runInContext(context, { timeout: options.timeoutMs ?? 10_000 }) as (\n module: { exports: unknown },\n exports: unknown,\n context: Record<string, unknown>,\n require: (name: string) => unknown,\n ) => void\n const moduleObject: { exports: unknown } = { exports: {} }\n fn(moduleObject, moduleObject.exports, { ...sandbox }, require)\n return moduleObject.exports\n}\n\n/**\n * The function the runner calls, from what the code exported: the export\n * itself if it is a function, else its `execute`, else its `default` if that is\n * a function. `null` when there is none, which the runner reports as \"Plugin\n * must export an execute function\".\n */\nexport function executeOf(exported: unknown): ((...args: unknown[]) => unknown) | null {\n if (typeof exported === \"function\") return exported as (...args: unknown[]) => unknown\n const object = exported as { execute?: unknown; default?: unknown } | null | undefined\n if (object && typeof object.execute === \"function\") return object.execute as (...args: unknown[]) => unknown\n if (object && typeof object.default === \"function\") return object.default as (...args: unknown[]) => unknown\n return null\n}\n", "/**\n * Running a plugin on your own machine, with a context that behaves.\n *\n * Storage and state are implemented here, in memory, with the same\n * signatures and the same edge cases the real ones have: `get` on a missing key\n * is `null` rather than a throw, `put` accepts a string or bytes, `list` is\n * prefix-filtered. A plugin that works against these works against the real\n * ones, which is the only property that makes a simulator worth having.\n *\n * WHAT IS DELIBERATELY NOT IMPLEMENTED: connections and media. Both are other\n * people's systems \u2014 an OAuth account and an ffmpeg container \u2014 and pretending\n * to be them would produce a plugin that passes here and fails on the canvas.\n * They are absent unless you pass a stub, and asking for one you did not stub\n * fails with a sentence saying so rather than with `undefined`.\n */\n\nimport type {\n PluginConnections,\n PluginContext,\n PluginExecutionResult,\n PluginMedia,\n PluginModule,\n PluginOutput,\n PluginState,\n PluginStorage,\n StorageListResult,\n StorageResult,\n} from \"./types\"\nimport { SIGNED_URL_SECONDS, STATE_LIMITS, PUSH_CHECK } from \"./platform-rules\"\nimport { executeOf } from \"./runtime\"\n\n/** A file held in memory, as the local storage keeps it. */\ninterface LocalFile {\n bytes: Uint8Array\n contentType: string\n uploadedAt: string\n}\n\nfunction toBytes(data: Uint8Array | string): Uint8Array {\n return typeof data === \"string\" ? new TextEncoder().encode(data) : data\n}\n\n/**\n * The account's files, in memory.\n *\n * Seeded from `options.storage` so a test can start with a file already there,\n * and readable afterwards through the returned `files` \u2014 which is how you\n * assert that a step wrote what it said it wrote.\n */\nexport function createLocalStorage(seed: Record<string, Uint8Array | string> = {}): {\n storage: PluginStorage\n files: Map<string, LocalFile>\n} {\n const files = new Map<string, LocalFile>()\n for (const [path, data] of Object.entries(seed)) {\n files.set(path, {\n bytes: toBytes(data),\n contentType: \"application/octet-stream\",\n uploadedAt: new Date().toISOString(),\n })\n }\n\n const result = (path: string, file: LocalFile): StorageResult => ({\n url: `memory://${path}`,\n size: file.bytes.length,\n contentType: file.contentType,\n uploadedAt: file.uploadedAt,\n // The real one expires; this one does not, and says so rather than\n // inventing a date a test might come to rely on.\n expiresAt: \"never (local simulation)\",\n })\n\n const storage: PluginStorage = {\n async put(path, data, contentType = \"application/octet-stream\") {\n const file: LocalFile = {\n bytes: toBytes(data),\n contentType,\n uploadedAt: new Date().toISOString(),\n }\n files.set(path, file)\n return result(path, file)\n },\n async get(path) {\n return files.get(path)?.bytes ?? null\n },\n async delete(path) {\n files.delete(path)\n },\n async list(prefix) {\n const listed: StorageListResult[\"files\"] = []\n let totalSize = 0\n for (const [path, file] of files) {\n if (prefix && !path.startsWith(prefix)) continue\n listed.push({\n url: `memory://${path}`,\n pathname: path,\n size: file.bytes.length,\n uploadedAt: file.uploadedAt,\n })\n totalSize += file.bytes.length\n }\n return { files: listed, totalSize }\n },\n async head(path) {\n const file = files.get(path)\n return file ? { size: file.bytes.length, contentType: file.contentType } : null\n },\n async signedUrl(path, seconds) {\n // The platform's clamp, so a test that asks for a day learns it gets an hour.\n const valid = Math.min(Math.max(Number(seconds) || SIGNED_URL_SECONDS.default, SIGNED_URL_SECONDS.min), SIGNED_URL_SECONDS.max)\n return files.has(path) ? `memory://${path}?expires=${valid}` : null\n },\n async shareUrl(path, seconds) {\n const valid = Number(seconds) || SIGNED_URL_SECONDS.default\n return files.has(path) ? `memory://share/${path}?expires=${valid}` : null\n },\n /**\n * Really fetches, because that is the only way to find out whether the\n * URL a plugin builds is the URL it meant. The bytes land in the same\n * in-memory store the rest of these read from.\n */\n async download(url, path, contentType) {\n const res = await fetch(url)\n if (!res.ok) throw new Error(`Downloading ${url} failed with status ${res.status}`)\n const file: LocalFile = {\n bytes: new Uint8Array(await res.arrayBuffer()),\n contentType: contentType ?? res.headers.get(\"content-type\") ?? \"application/octet-stream\",\n uploadedAt: new Date().toISOString(),\n }\n files.set(path, file)\n return result(path, file)\n },\n }\n\n return { storage, files }\n}\n\n/** Workflow state, in memory. `values` is there so a test can look afterwards. */\nexport function createLocalState(seed: Record<string, unknown> = {}): {\n state: PluginState\n values: Map<string, unknown>\n} {\n const values = new Map<string, unknown>(Object.entries(seed))\n const expiries = new Map<string, number>()\n const expired = (key: string) => {\n const at = expiries.get(key)\n if (at === undefined || at > Date.now()) return false\n values.delete(key)\n expiries.delete(key)\n return true\n }\n const state: PluginState = {\n async get(key) {\n // `null` for a key that was never set, matching the real one. A\n // plugin that treats `undefined` and `null` differently should find\n // out here rather than on somebody's canvas.\n if (expired(key)) return null\n return values.has(key) ? values.get(key) : null\n },\n async set(key, value, options) {\n // The store's own limits, so a value that is too big or a TTL that is\n // too short fails here as it fails there.\n const encoded = JSON.stringify(value)\n if (encoded === undefined) throw new Error(`state.set(\"${key}\"): the value must be JSON-serialisable.`)\n const bytes = new TextEncoder().encode(encoded).length\n if (bytes > STATE_LIMITS.maxValueBytes) {\n throw new Error(\n `state.set(\"${key}\"): the value is ${Math.ceil(bytes / 1024)} KB once encoded, and a value may be at most `\n + `${STATE_LIMITS.maxValueBytes / 1024} KB. Put large data in storage and keep its path here.`,\n )\n }\n const ttl = options?.ttlSeconds\n if (ttl !== undefined && (typeof ttl !== \"number\" || ttl < STATE_LIMITS.minTtlSeconds)) {\n throw new Error(`state.set(\"${key}\"): ttlSeconds must be at least ${STATE_LIMITS.minTtlSeconds}.`)\n }\n values.set(key, JSON.parse(encoded))\n if (ttl !== undefined) expiries.set(key, Date.now() + ttl * 1000)\n else expiries.delete(key)\n },\n async delete(key) {\n values.delete(key)\n expiries.delete(key)\n },\n async list(prefix) {\n const keys = [...values.keys()]\n .filter((key) => !expired(key) && (!prefix || key.startsWith(prefix)))\n .map((key) => {\n const at = expiries.get(key)\n return { key, expiresAt: at === undefined ? null : new Date(at).toISOString() }\n })\n return { keys, complete: true }\n },\n }\n return { state, values }\n}\n\n/** What a helper says when it is asked for and was not provided. */\nfunction absent(name: string, what: string): never {\n throw new Error(\n `context.${name} is not available locally. ${what} `\n + `Pass a stub to simulate({ ${name}: \u2026 }) to test the code around it, `\n + `or run the step on a canvas to exercise the real thing.`,\n )\n}\n\nexport interface SimulateOptions {\n /** What the steps before this one produced. */\n input?: Record<string, unknown>\n /** The fields somebody filled in on the canvas. */\n config?: Record<string, unknown>\n /** What the plugin was published with. */\n secrets?: Record<string, string>\n\n /** Files the account already has, as `{ \"path/name.txt\": \"contents\" }`. */\n storage?: Record<string, Uint8Array | string>\n /** Workflow state the run starts with. */\n state?: Record<string, unknown>\n /**\n * Stand-ins for the two helpers that cannot be simulated honestly.\n *\n * Give `connections` a fake that answers the requests your plugin makes,\n * and assert on what it was asked for \u2014 that is a better test of an\n * integration step than any simulation of a provider would be.\n */\n connections?: PluginConnections\n media?: PluginMedia\n\n workflowId?: string\n nodeId?: string\n userId?: string\n executionId?: string\n /** How long the plugin may take, as the account's plan would cap it. */\n timeoutMs?: number\n}\n\n/** What `simulate` gives back: the result, and what the run left behind. */\nexport interface SimulateResult extends PluginExecutionResult {\n /** The files in storage when the step finished. */\n files: Map<string, LocalFile>\n /** The workflow state when the step finished. */\n state: Map<string, unknown>\n}\n\n/**\n * Run a plugin's `execute` the way the sandbox would.\n *\n * Same context shape, same timeout race, same normalising of the return value \u2014\n * so a result that is `success` here is one the platform would also call\n * `success`.\n */\nexport async function simulate(\n plugin: PluginModule | PluginModule[\"execute\"],\n options: SimulateOptions = {},\n): Promise<SimulateResult> {\n const startTime = Date.now()\n\n const execute = executeOf(plugin)\n const { storage, files } = createLocalStorage(options.storage)\n const { state, values } = createLocalState(options.state)\n\n if (typeof execute !== \"function\") {\n return {\n status: \"error\",\n output: null,\n error:\n \"Plugin must export an execute function: `module.exports = { execute }`, \"\n + \"`module.exports.execute = \u2026`, or a function as `module.exports` or `module.exports.default`.\",\n durationMs: Date.now() - startTime,\n files,\n state: values,\n }\n }\n\n const context: PluginContext = {\n workflowId: options.workflowId ?? \"local-workflow\",\n nodeId: options.nodeId ?? \"local-node\",\n userId: options.userId ?? \"local-user\",\n executionId: options.executionId ?? `local-${Date.now()}`,\n startedAt: new Date(startTime).toISOString(),\n secrets: options.secrets ?? {},\n storage,\n state,\n // Absent unless a stub is given, as on the platform when no account was\n // chosen for the step: the push check runs a step with only the accounts\n // its test file names, and none can be named here.\n connections: options.connections,\n media:\n options.media ??\n ({\n run: async () => absent(\"media\", \"It runs ffmpeg in a container of its own.\"),\n } as PluginMedia),\n }\n\n const timeoutMs = options.timeoutMs ?? PUSH_CHECK.defaultTimeoutMs\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Plugin execution timed out after ${timeoutMs}ms`)),\n timeoutMs,\n )\n })\n\n try {\n const raw = await Promise.race([\n Promise.resolve(execute(options.input ?? {}, options.config ?? {}, context)),\n timeout,\n ])\n\n const durationMs = Date.now() - startTime\n\n if (!raw || typeof raw !== \"object\") {\n return {\n status: \"error\",\n output: null,\n error:\n \"A plugin must return an object like { output: \\\"success\\\", data: {} }. \"\n + `This one returned ${raw === undefined ? \"undefined\" : JSON.stringify(raw)}.`,\n durationMs,\n files,\n state: values,\n }\n }\n\n const output = raw as PluginOutput\n if (typeof output.output !== \"string\") {\n return {\n status: \"error\",\n output: null,\n error:\n \"The returned object has no `output`. That field names which port the run leaves \"\n + \"by \u2014 usually \\\"success\\\" or \\\"error\\\" \u2014 and it has to be one of the `outputs` \"\n + \"in your manifest.\",\n durationMs,\n files,\n state: values,\n }\n }\n\n return {\n status: \"success\",\n output: { ...output, data: output.data ?? {} },\n durationMs,\n outputPort: output.output,\n logs: output.metadata?.logs,\n files,\n state: values,\n }\n } catch (error) {\n const durationMs = Date.now() - startTime\n // Read as the platform reads it, by duck typing: an error thrown inside a\n // step's own context is not an instance of this realm's Error.\n const message =\n error && typeof error === \"object\" && typeof (error as { message?: unknown }).message === \"string\"\n ? (error as { message: string }).message\n : String(error)\n return {\n status: message.includes(\"timed out\") ? \"timeout\" : \"error\",\n output: null,\n error: message,\n durationMs,\n files,\n state: values,\n }\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n", "/**\n * What the platform checks about a step's code before it will take it.\n *\n * The same checks, in the same order, with the same messages as the platform's\n * upload, against the rules in ./platform-rules. A plugin that passes here is\n * not refused on push for its code; one that fails here would have been.\n *\n * And a `require` that behaves like the sandbox's: a step gets the allowed\n * packages and nothing else \u2014 no `fs`, no `http`, not even `path`.\n */\n\nimport { ALLOWED_PACKAGES, MAX_CODE_LENGTH, RESTRICTED_PATTERNS } from \"./platform-rules\"\n\nexport { ALLOWED_PACKAGES, RESTRICTED_PATTERNS }\n\n/** The names in ALLOWED_PACKAGES, for lookups. */\nexport const ALLOWED_PACKAGE_NAMES: ReadonlySet<string> = new Set(ALLOWED_PACKAGES.map((p) => p.name))\n\nexport type CodeCheck = { valid: true; packages: string[] } | { valid: false; error: string }\n\n/**\n * Check a step's code the way the platform's upload does.\n *\n * On success, also says which packages it requires \u2014 the ones a local run has to\n * be able to load.\n */\nexport function validatePluginCode(code: string): CodeCheck {\n if (code.length > MAX_CODE_LENGTH) {\n return { valid: false, error: `Plugin code exceeds maximum length of ${Math.round(MAX_CODE_LENGTH / 1000)}KB.` }\n }\n\n const hasExecute = code.includes(\"module.exports\") || code.includes(\"exports.execute\") || code.includes(\"export\")\n if (!hasExecute) {\n return {\n valid: false,\n error: \"Plugin code must export an execute function. Example: module.exports = { execute: async (input, config, context) => { ... } }\",\n }\n }\n\n for (const pattern of RESTRICTED_PATTERNS) {\n if (pattern.test(code)) {\n return {\n valid: false,\n error:\n \"Plugin code contains restricted patterns. Plugins cannot access the filesystem, spawn processes, use eval, import modules, or escape the sandbox.\"\n + ` (matched ${pattern})`,\n }\n }\n }\n\n const packages: string[] = []\n const requireCall = /\\brequire\\s*\\(\\s*(['\"])([^'\"]+)\\1\\s*\\)/g\n let match: RegExpExecArray | null\n while ((match = requireCall.exec(code)) !== null) {\n const name = match[2]\n if (!ALLOWED_PACKAGE_NAMES.has(name)) {\n return {\n valid: false,\n error: `Plugin code requires \"${name}\" which is not an allowed package. See ALLOWED_PACKAGES for the list.`,\n }\n }\n if (!packages.includes(name)) packages.push(name)\n }\n\n if (/\\brequire\\s*\\(\\s*(?!['\"][^'\"]+['\"]\\s*\\))/.test(code)) {\n return {\n valid: false,\n error: \"Plugin code contains a dynamic require() call. Only require() with string literals of allowed packages is permitted.\",\n }\n }\n\n return { valid: true, packages }\n}\n\n/**\n * The `require` a step gets inside the sandbox, backed by a loader of your own.\n *\n * `load` is how this machine finds a package \u2014 in the CLI, Node's resolution\n * from the project's directory. The sandbox has every allowed package installed;\n * a laptop has whatever was installed there, so a missing one is reported with\n * the command that installs the version the sandbox has.\n */\nexport function sandboxRequire(load: (name: string) => unknown): (name: string) => unknown {\n return (name: string) => {\n const allowed = ALLOWED_PACKAGES.find((p) => p.name === name)\n if (!allowed) throw new Error(`Cannot require \"${name}\"`)\n try {\n return load(name)\n } catch {\n throw new Error(\n `\"${name}\" is available in the sandbox but not installed here. `\n + `To run this locally: npm install --save-dev ${name}@${allowed.version}`,\n )\n }\n }\n}\n", "/**\n * Check a manifest before the platform does.\n *\n * The developer portal refuses a push whose manifest does not validate, and a\n * declared step (an `action` block) or a trigger has no code for `vsa test` to\n * run, so until now nothing on a developer's machine looked at one at all. This\n * checks what the platform is known to refuse, in the platform's terms, and\n * warns about what it would silently drop or change.\n *\n * It is the SDK's own reading of those rules, written from the platform's\n * behaviour rather than copied from it, so it is a subset: a manifest that\n * passes here can still be refused by the portal, whose word is final. One\n * that fails here would be refused there.\n */\nimport { PUSH_CHECK } from \"./platform-rules\"\n\n/** What a manifest makes a step. */\nexport type StepKind = \"code\" | \"declared\" | \"outputs-only\" | \"trigger\"\n\nexport interface ManifestCheck {\n /** False when the platform would refuse it. */\n ok: boolean\n kind: StepKind\n /** Why the platform would refuse it. */\n errors: string[]\n /** What the platform would drop, change or regret. */\n warnings: string[]\n}\n\nconst KNOWN_BLOCKS = new Set([\n \"properties\", \"inputs\", \"outputs\", \"outputFields\", \"auth\", \"trigger\", \"action\",\n \"timeoutMs\", \"memoryLimitMb\", \"icon\", \"color\", \"description\", \"version\",\n])\nconst PROPERTY_TYPES = new Set([\n \"string\", \"number\", \"boolean\", \"select\", \"multiselect\", \"json\", \"code\", \"color\", \"date\",\n \"connection\", \"file\", \"path\", \"paths\", \"secret\",\n])\nconst AUTH_TYPES = new Set([\"oauth2\", \"api_key\", \"basic\", \"none\"])\nconst HOST_KEYS = [\"url\", \"baseUrl\", \"base_url\", \"host\"]\nconst METHODS = new Set([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"])\nconst BODY_TYPES = new Set([\"json\", \"form\", \"multipart\"])\nconst PAGINATE_FROM = new Set([\"response\", \"item\", \"page\", \"offset\"])\nconst MAX_ITEM_LIMIT = 1000\nconst MAX_PAGES = 50\nconst MAX_MEMORY_MB = 128\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst isRelativePath = (path: unknown): boolean =>\n typeof path === \"string\" && path.trim() !== \"\" && !/^[a-z][a-z0-9+.-]*:/i.test(path) && !path.startsWith(\"//\")\n\n/**\n * Check `raw`, the parsed manifest.json. `hasCode` says whether an index.js\n * (or plugin.ts) sits beside it.\n */\nexport function checkManifest(raw: unknown, hasCode: boolean): ManifestCheck {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!isObject(raw)) {\n return { ok: false, kind: hasCode ? \"code\" : \"declared\", errors: [\"manifest.json must be a JSON object.\"], warnings }\n }\n const m = raw\n\n const kind: StepKind = isObject(m.trigger)\n ? \"trigger\"\n : isObject(m.action)\n ? isObject(m.action.request) ? \"declared\" : \"outputs-only\"\n : \"code\"\n\n for (const key of Object.keys(m)) {\n if (!KNOWN_BLOCKS.has(key)) warnings.push(`\"${key}\" is not something a manifest can declare, and is dropped when the step is saved.`)\n }\n\n // \u2500\u2500\u2500 Properties \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const properties = isObject(m.properties) ? m.properties : {}\n if (m.properties !== undefined && !isObject(m.properties)) errors.push(\"properties must be an object of fields.\")\n const typeOf = (name: unknown) => (typeof name === \"string\" && isObject(properties[name]) ? properties[name].type : undefined)\n\n for (const [key, value] of Object.entries(properties)) {\n if (!isObject(value)) {\n errors.push(`properties.${key} must be an object with at least a label and a type.`)\n continue\n }\n if (typeof value.type !== \"string\" || !PROPERTY_TYPES.has(value.type)) {\n warnings.push(`properties.${key} has type ${JSON.stringify(value.type)}, which the platform does not know; it becomes a plain text field.`)\n }\n if (typeof value.label !== \"string\" || !value.label.trim()) {\n warnings.push(`properties.${key} has no label; the canvas shows \"${key}\" instead.`)\n }\n if ((value.type === \"select\" || value.type === \"multiselect\") && value.options === undefined && value.optionsFrom === undefined) {\n warnings.push(`properties.${key} is a ${value.type} with no options and no optionsFrom; there is nothing to choose.`)\n }\n if (value.options !== undefined) {\n const options = Array.isArray(value.options) ? value.options : null\n if (!options || options.some((o) => !isObject(o) || typeof o.label !== \"string\" || typeof o.value !== \"string\")) {\n errors.push(`properties.${key}.options must be a list of { \"label\": \"\u2026\", \"value\": \"\u2026\" }, both text.`)\n }\n }\n if (value.optionsFrom !== undefined) checkOptionsFrom(key, value, typeOf, errors)\n }\n\n // \u2500\u2500\u2500 Auth, ports, limits \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (m.auth !== undefined) {\n if (!isObject(m.auth)) errors.push(\"auth must be an object.\")\n else {\n if (typeof m.auth.type !== \"string\" || !AUTH_TYPES.has(m.auth.type)) {\n errors.push(`auth.type must be one of ${[...AUTH_TYPES].join(\", \")}.`)\n }\n for (const key of HOST_KEYS) {\n if (key in m.auth) errors.push(`auth.${key} is refused: a manifest may not name a host. The provider's base URL belongs to the platform.`)\n }\n }\n }\n for (const ports of [\"inputs\", \"outputs\"] as const) {\n if (m[ports] !== undefined && (!Array.isArray(m[ports]) || (m[ports] as unknown[]).some((p) => typeof p !== \"string\"))) {\n errors.push(`${ports} must be a list of port names.`)\n }\n }\n if (Array.isArray(m.outputs) && m.outputs.length === 0 && kind !== \"trigger\") {\n warnings.push(\"outputs is empty: no line can be drawn from this step.\")\n }\n if (m.timeoutMs !== undefined) {\n if (typeof m.timeoutMs !== \"number\" || m.timeoutMs <= 0) errors.push(\"timeoutMs must be a number of milliseconds.\")\n else if (m.timeoutMs > PUSH_CHECK.maxTimeoutMs) warnings.push(`timeoutMs ${m.timeoutMs} is cut to ${PUSH_CHECK.maxTimeoutMs}, the most a step is given.`)\n }\n if (typeof m.memoryLimitMb === \"number\" && m.memoryLimitMb > MAX_MEMORY_MB) {\n warnings.push(`memoryLimitMb ${m.memoryLimitMb} is cut to ${MAX_MEMORY_MB}.`)\n }\n\n // \u2500\u2500\u2500 Declared steps \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (m.action !== undefined) {\n if (!isObject(m.action)) errors.push(\"action must be an object.\")\n else checkAction(m.action, properties, typeOf, errors, warnings)\n if (hasCode) errors.push(\"This step has both an action block and code. A step is one or the other: remove index.js, or the action block.\")\n }\n\n // \u2500\u2500\u2500 Triggers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (m.trigger !== undefined) {\n if (!isObject(m.trigger)) errors.push(\"trigger must be an object.\")\n else checkTrigger(m.trigger, typeOf, errors, warnings)\n }\n\n if (kind === \"code\" && !hasCode) {\n errors.push(\"There is no index.js and no action or trigger block, so this step has nothing to run.\")\n }\n\n return { ok: errors.length === 0, kind, errors, warnings }\n}\n\nfunction checkConnectionName(where: string, name: unknown, typeOf: (n: unknown) => unknown, errors: string[]): void {\n if (typeof name !== \"string\" || !name) {\n errors.push(`${where} must name one of this step's properties of type \"connection\".`)\n } else if (typeOf(name) === undefined) {\n errors.push(`${where} names \"${name}\", which is not one of this step's properties.`)\n } else if (typeOf(name) !== \"connection\") {\n errors.push(`${where} names \"${name}\", which is a ${String(typeOf(name))} property rather than a connection.`)\n }\n}\n\nfunction checkAction(\n a: Record<string, unknown>,\n properties: Record<string, unknown>,\n typeOf: (n: unknown) => unknown,\n errors: string[],\n warnings: string[],\n): void {\n const request = a.request\n if (request !== undefined) {\n if (!isObject(request)) {\n errors.push(\"action.request must be an object.\")\n return\n }\n const viaConnection = a.connection !== undefined\n const viaBaseUrl = a.baseUrl !== undefined\n if (viaConnection && viaBaseUrl) errors.push(\"action has both connection and baseUrl: a request goes as an account or to a named host, never both.\")\n if (!viaConnection && !viaBaseUrl) errors.push(\"action.request needs either connection (an account to act as) or baseUrl (the https:// host to call).\")\n if (viaConnection) checkConnectionName(\"action.connection\", a.connection, typeOf, errors)\n if (viaBaseUrl) {\n if (typeof a.baseUrl !== \"string\" || !/^https:\\/\\//i.test(a.baseUrl)) errors.push(\"action.baseUrl must start with https://.\")\n else if (/\\{\\{\\s*input\\./.test(a.baseUrl)) errors.push(\"action.baseUrl may read the step's fields ({{config.\u2026}}) but never {{input.\u2026}}: what an earlier step hands on must not decide where a key is sent.\")\n }\n const method = String(request.method ?? \"GET\").toUpperCase()\n if (!METHODS.has(method)) errors.push(`action.request.method must be one of ${[...METHODS].join(\", \")}.`)\n if (!isRelativePath(request.path)) errors.push(\"action.request.path must be a path relative to the base URL, never a full URL.\")\n if (request.bodyType !== undefined && !BODY_TYPES.has(String(request.bodyType))) {\n errors.push(`action.request.bodyType must be one of ${[...BODY_TYPES].join(\", \")}.`)\n }\n if (request.body !== undefined && method === \"GET\") warnings.push(\"action.request has a body on a GET; most APIs ignore it.\")\n if (viaConnection && isObject(request.headers)) {\n for (const header of Object.keys(request.headers)) {\n if (header.toLowerCase() === \"authorization\") warnings.push(\"action.request sets Authorization while acting as an account; the platform adds the account's credential itself.\")\n }\n }\n }\n if (a.outputs !== undefined && !isObject(a.outputs)) errors.push(\"action.outputs must be an object of name to value.\")\n if (a.outputs === undefined) warnings.push(\"action has no outputs: the step hands nothing on.\")\n for (const key of [\"errorPath\", \"okPath\", \"okValue\"] as const) {\n if (a[key] !== undefined && typeof a[key] !== \"string\") errors.push(`action.${key} must be text.`)\n }\n if (a.items !== undefined) {\n if (!isObject(a.items) || typeof a.items.path !== \"string\") errors.push('action.items must be { \"path\": \"\u2026\" }, with \"\" when the answer is the list itself.')\n else if (a.items.limit !== undefined && (typeof a.items.limit !== \"number\" || a.items.limit < 1 || a.items.limit > MAX_ITEM_LIMIT)) {\n errors.push(`action.items.limit must be a number from 1 to ${MAX_ITEM_LIMIT}.`)\n }\n }\n if (a.paginate !== undefined) {\n if (!isObject(a.paginate) || !PAGINATE_FROM.has(String(a.paginate.from))) {\n errors.push(`action.paginate.from must be one of ${[...PAGINATE_FROM].join(\", \")}.`)\n } else if (a.paginate.maxPages !== undefined && (typeof a.paginate.maxPages !== \"number\" || a.paginate.maxPages > MAX_PAGES)) {\n errors.push(`action.paginate.maxPages must be at most ${MAX_PAGES}.`)\n }\n if (a.items === undefined) errors.push(\"action.paginate needs action.items: pages are pages of a list.\")\n }\n const text = JSON.stringify({ baseUrl: a.baseUrl, request: a.request, outputs: a.outputs })\n for (const [, key] of text.matchAll(/\\{\\{\\s*config\\.([A-Za-z0-9_$]+)/g)) {\n if (!(key in properties)) warnings.push(`{{config.${key}}} names no property; it is always empty.`)\n }\n}\n\nfunction checkTrigger(t: Record<string, unknown>, typeOf: (n: unknown) => unknown, errors: string[], warnings: string[]): void {\n checkConnectionName(\"trigger.connection\", t.connection, typeOf, errors)\n if (!isObject(t.request) || !isRelativePath(t.request.path)) errors.push(\"trigger.request.path must be a path relative to the provider.\")\n else if (t.request.method !== undefined && ![\"GET\", \"POST\"].includes(String(t.request.method).toUpperCase())) {\n errors.push(\"trigger.request.method must be GET or POST.\")\n }\n if (typeof t.items !== \"string\") errors.push('trigger.items must be the dotted path to the list in the answer (\"\" when the answer is the list).')\n if (typeof t.id !== \"string\" || !t.id) errors.push(\"trigger.id must be the dotted path, within an item, to what makes it unique.\")\n if (t.poll !== undefined && typeof t.poll !== \"number\" && (typeof t.poll !== \"string\" || typeOf(t.poll) === undefined)) {\n errors.push(\"trigger.poll must be a number of minutes, or the name of a property that holds one.\")\n }\n if (t.cursor !== undefined) {\n if (!isObject(t.cursor) || ![\"response\", \"item\"].includes(String(t.cursor.from)) || typeof t.cursor.path !== \"string\") {\n errors.push('trigger.cursor must be { \"from\": \"response\" | \"item\", \"path\": \"\u2026\" }.')\n } else if (t.cursor.initial !== \"now\") {\n warnings.push('trigger.cursor has no \"initial\": \"now\": switching the trigger on starts a run, at the user\\'s cost, for every item already there.')\n }\n }\n if (t.hydrate !== undefined && (!isObject(t.hydrate) || !isRelativePath(t.hydrate.path))) {\n errors.push(\"trigger.hydrate.path must be a path relative to the provider.\")\n }\n if (t.maxPerPoll !== undefined && (typeof t.maxPerPoll !== \"number\" || t.maxPerPoll < 1)) errors.push(\"trigger.maxPerPoll must be a positive number.\")\n}\n\nfunction checkOptionsFrom(\n key: string,\n property: Record<string, unknown>,\n typeOf: (n: unknown) => unknown,\n errors: string[],\n): void {\n const where = `properties.${key}.optionsFrom`\n if (property.type !== \"select\" && property.type !== \"multiselect\") {\n errors.push(`${where} only means something on a select or multiselect, and ${key} is a ${String(property.type)}.`)\n }\n const o = property.optionsFrom\n if (!isObject(o)) {\n errors.push(`${where} must be an object.`)\n return\n }\n checkConnectionName(`${where}.connection`, o.connection, typeOf, errors)\n if (typeof o.label !== \"string\" || !o.label.trim()) errors.push(`${where}.label must say what each option shows, e.g. {{item.name}}.`)\n if (typeof o.value !== \"string\" || !o.value.trim()) errors.push(`${where}.value must say what choosing it stores, e.g. {{item.id}}.`)\n if (!isObject(o.request) || !isRelativePath(o.request.path)) errors.push(`${where}.request.path must be a path relative to the provider.`)\n else {\n if (o.request.method !== undefined && String(o.request.method).toUpperCase() !== \"GET\") errors.push(`${where}.request must be a GET: options are read whenever somebody opens the step.`)\n if (o.request.body !== undefined) errors.push(`${where}.request cannot have a body: it is a GET.`)\n }\n}\n", "/**\n * The runtime API, as data.\n *\n * The same things types.ts describes, in a form a tool can read without a\n * TypeScript compiler: an editor's autocomplete, a documentation page, a lint\n * rule. Each entry is a name an author types, what it is, and a one-line\n * description.\n *\n * Plain data with no imports, so it can go into a browser bundle without the\n * rest of the SDK.\n */\n\nexport interface ContextApiEntry {\n /** What an author types, e.g. `context.storage.put`. */\n path: string\n /** `property` for a value, `method` for something you call. */\n kind: \"variable\" | \"property\" | \"method\"\n /** The signature, for a method. Shown beside the name. */\n signature?: string\n /** One line, in the hover card. */\n info: string\n /**\n * Set when the helper is not always there.\n *\n * The editor says so, because the alternative is an author writing\n * `context.media.run(...)` against a completion that promised it existed\n * and meeting `undefined` on somebody's canvas.\n */\n conditional?: string\n}\n\n/** Everything a plugin is called with, and everything it can reach. */\nexport const CONTEXT_API: ContextApiEntry[] = [\n { path: \"input\", kind: \"variable\", info: \"What the steps before this one produced, keyed by step name.\" },\n { path: \"config\", kind: \"variable\", info: \"The fields somebody filled in on the canvas.\" },\n { path: \"context\", kind: \"variable\", info: \"Everything about the run: ids, storage, state, media, connections.\" },\n\n { path: \"context.workflowId\", kind: \"property\", info: \"The workflow this run belongs to.\" },\n { path: \"context.nodeId\", kind: \"property\", info: \"This step's id on the canvas.\" },\n { path: \"context.userId\", kind: \"property\", info: \"Whose run it is.\" },\n { path: \"context.executionId\", kind: \"property\", info: \"This run, distinct from every other run of the workflow.\" },\n { path: \"context.startedAt\", kind: \"property\", info: \"When the run started, as an ISO string.\" },\n { path: \"context.secrets\", kind: \"property\", info: \"Values the plugin was published with. Never the user's credentials.\" },\n\n {\n path: \"context.storage.put\",\n kind: \"method\",\n signature: \"(path, data, contentType?) => Promise<StorageResult>\",\n info: \"Write a file to the account's storage. Data may be a string or bytes.\",\n },\n {\n path: \"context.storage.get\",\n kind: \"method\",\n signature: \"(path) => Promise<Uint8Array | null>\",\n info: \"Read a file back. null when it is not there.\",\n },\n { path: \"context.storage.delete\", kind: \"method\", signature: \"(path) => Promise<void>\", info: \"Remove a file.\" },\n {\n path: \"context.storage.list\",\n kind: \"method\",\n signature: \"(prefix?) => Promise<{ files, totalSize }>\",\n info: \"Everything under a prefix, or everything.\",\n },\n {\n path: \"context.storage.head\",\n kind: \"method\",\n signature: \"(path) => Promise<{ size, contentType } | null>\",\n info: \"Size and content type without moving the bytes.\",\n },\n {\n path: \"context.storage.signedUrl\",\n kind: \"method\",\n signature: \"(path, expiresInSeconds?) => Promise<string | null>\",\n info: \"A link somebody else can fetch the file from, for a few minutes. For APIs that pull rather than take bytes.\",\n },\n {\n path: \"context.storage.download\",\n kind: \"method\",\n signature: \"(url, path, contentType?) => Promise<StorageResult>\",\n info: \"Pull a URL straight into storage. The bytes never cross this step, so a large file costs the run nothing.\",\n conditional: \"Only when the download Worker is configured on the server.\",\n },\n\n {\n path: \"context.state.get\",\n kind: \"method\",\n signature: \"(key) => Promise<unknown>\",\n info: \"A value this workflow stored on an earlier run. null when never set.\",\n },\n {\n path: \"context.state.set\",\n kind: \"method\",\n signature: \"(key, value, { ttlSeconds }?) => Promise<void>\",\n info: \"Remember something between runs \u2014 a cursor, a last-seen id, a counter.\",\n },\n { path: \"context.state.delete\", kind: \"method\", signature: \"(key) => Promise<void>\", info: \"Forget one key.\" },\n {\n path: \"context.state.list\",\n kind: \"method\",\n signature: \"(prefix?) => Promise<{ keys }>\",\n info: \"Which keys this workflow has stored.\",\n },\n\n {\n path: \"context.media.run\",\n kind: \"method\",\n signature: \"(operation, params) => Promise<Record<string, unknown>>\",\n info: \"ffmpeg, by operation name. A plugin never builds a command line \u2014 the server does, one operation at a time.\",\n conditional: \"Only when the sandbox and storage are both configured.\",\n },\n\n {\n path: \"context.connections.get\",\n kind: \"method\",\n signature: \"(propertyName) => Promise<{ id, request }>\",\n info: \"One of the accounts this step was configured with. Takes your property name, not a connection id.\",\n conditional: \"Only when the step declares a `connection` property and an account was chosen.\",\n },\n {\n path: \"context.connections.get(...).request\",\n kind: \"method\",\n signature: \"({ path, method?, query?, headers?, body? }) => Promise<{ ok, status, body }>\",\n info: \"A request to the provider, with the credential attached on the way past. Relative paths only \u2014 never a host, and there is no getToken().\",\n },\n\n { path: \"module.exports.execute\", kind: \"method\", signature: \"(input, config, context) => ({ output, data })\", info: \"The entry point. Return which port to leave by and what to hand on.\" },\n { path: \"console.log\", kind: \"method\", info: \"Appears in the run's log panel. Not on stdout \u2014 the platform reads that.\" },\n { path: \"console.error\", kind: \"method\", info: \"Appears in the run's log panel, marked as an error.\" },\n]\n\n/**\n * The globals a plugin does NOT get, and what to reach for instead.\n *\n * Worth offering in an editor as much as the API is: an author who types\n * `require('fs')` should be told at the keystroke rather than at the push.\n */\nexport const BLOCKED_GLOBALS: Array<{ name: string; instead: string }> = [\n { name: \"process\", instead: \"Ids and secrets are on `context`.\" },\n { name: \"fs\", instead: \"Use context.storage.\" },\n { name: \"child_process\", instead: \"Not available. For ffmpeg, use context.media.run.\" },\n { name: \"os\", instead: \"Not available.\" },\n { name: \"net\", instead: \"Use fetch.\" },\n { name: \"http\", instead: \"Use fetch.\" },\n { name: \"https\", instead: \"Use fetch.\" },\n { name: \"eval\", instead: \"Not available.\" },\n { name: \"Function\", instead: \"Not available as a constructor.\" },\n { name: \"Buffer\", instead: \"Use Uint8Array and TextEncoder/TextDecoder.\" },\n { name: \"__dirname\", instead: \"There is no meaningful filesystem.\" },\n]\n"],
5
+ "mappings": ";AASO,IAAM,mBAAqE;AAAA,EAC9E;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,IACR,WAAW;AAAA,EACf;AAAA,EACA;AAAA,IACI,QAAQ;AAAA,I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",
6
6
  "names": ["require"]
7
7
  }
@@ -0,0 +1,16 @@
1
+ /** What a manifest makes a step. */
2
+ export type StepKind = "code" | "declared" | "outputs-only" | "trigger";
3
+ export interface ManifestCheck {
4
+ /** False when the platform would refuse it. */
5
+ ok: boolean;
6
+ kind: StepKind;
7
+ /** Why the platform would refuse it. */
8
+ errors: string[];
9
+ /** What the platform would drop, change or regret. */
10
+ warnings: string[];
11
+ }
12
+ /**
13
+ * Check `raw`, the parsed manifest.json. `hasCode` says whether an index.js
14
+ * (or plugin.ts) sits beside it.
15
+ */
16
+ export declare function checkManifest(raw: unknown, hasCode: boolean): ManifestCheck;
@@ -1,14 +1,61 @@
1
1
  /**
2
- * The rules the VisualAutomate platform applies to a plugin's code on upload.
2
+ * The rules the VisualAutomate platform applies to a step, as facts.
3
3
  *
4
- * Kept identical to the platform's, so a local test refuses what an upload
5
- * would refuse. When the platform changes them, this file changes with them in
6
- * the next release of the SDK.
4
+ * GENERATED by scripts/sync-platform.mjs from the platform's and the developer
5
+ * portal's source. Do not edit by hand: run the script, so a local test refuses
6
+ * what an upload would refuse and runs a step the way the platform runs it.
7
7
  */
8
- /** The npm packages a step may require, and the version the sandbox has installed. */
8
+ /** The npm packages a step may require, and the version the sandbox installs. */
9
9
  export declare const ALLOWED_PACKAGES: ReadonlyArray<{
10
10
  name: string;
11
11
  version: string;
12
12
  }>;
13
+ /** npm overrides the platform's sandbox installs the packages with. */
14
+ export declare const SANDBOX_OVERRIDES: Readonly<Record<string, Record<string, string>>>;
13
15
  /** Code matching any of these is refused on upload. */
14
16
  export declare const RESTRICTED_PATTERNS: ReadonlyArray<RegExp>;
17
+ /** Code longer than this many characters is refused on upload. */
18
+ export declare const MAX_CODE_LENGTH = 100000;
19
+ /** The major version of Node the platform runs steps on. */
20
+ export declare const PLATFORM_NODE_MAJOR = 24;
21
+ /**
22
+ * The globals the runner hands a step's code, besides the language's own
23
+ * (Object, Array, JSON, Math, Promise and the rest, which the step's context
24
+ * has a fresh set of). `require` and `console` are among them.
25
+ */
26
+ export declare const PROVIDED_GLOBALS: ReadonlyArray<string>;
27
+ /** Names the runner sets to undefined in a step's context. */
28
+ export declare const BLOCKED_GLOBAL_NAMES: ReadonlyArray<string>;
29
+ /** The machines a run can be given, smallest first. */
30
+ export declare const SANDBOX_TIERS: ReadonlyArray<{
31
+ id: string;
32
+ label: string;
33
+ vcpus: number;
34
+ memoryGb: number;
35
+ }>;
36
+ /** Tier names that are no longer offered, and the tier they now mean. */
37
+ export declare const RETIRED_TIERS: Readonly<Record<string, string>>;
38
+ /** Limits on `context.state`. */
39
+ export declare const STATE_LIMITS: {
40
+ /** One value, once encoded as JSON. */
41
+ readonly maxValueBytes: number;
42
+ /** The shortest `ttlSeconds` the store accepts. */
43
+ readonly minTtlSeconds: 60;
44
+ };
45
+ /** How long a `context.storage.signedUrl` link may be valid, in seconds. */
46
+ export declare const SIGNED_URL_SECONDS: {
47
+ readonly default: 900;
48
+ readonly min: 60;
49
+ readonly max: 3600;
50
+ };
51
+ /** How the developer portal's check on a push runs a step. */
52
+ export declare const PUSH_CHECK: {
53
+ /** When manifest.json names no `timeoutMs`. The test file's is not read. */
54
+ readonly defaultTimeoutMs: 30000;
55
+ /** The longest `timeoutMs` a manifest is given. */
56
+ readonly maxTimeoutMs: 60000;
57
+ /** The port a run must leave by when the test file names none. */
58
+ readonly defaultExpectOutput: "success";
59
+ /** A declared step (an `action` block) is tested in the portal's editor, not on a push. */
60
+ readonly declaredStepsTestedOnPush: false;
61
+ };