@visualautomate/plugin-sdk 0.7.0 → 0.8.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
3
  "sources": ["../src/index.ts", "../src/platform-rules.ts", "../src/runtime.ts", "../src/simulate.ts", "../src/validate.ts", "../src/manifest-check.ts", "../src/context-api.ts"],
4
- "sourcesContent": ["/**\n * @visualautomate/plugin-sdk\n *\n * Three things: the types a plugin is written against, a way to run one on\n * your own machine before it goes anywhere near a canvas, and the checks the\n * platform applies to a plugin's code before it will accept it.\n *\n * Nothing here runs inside the sandbox. Plugin code is plain JavaScript that\n * the platform loads; this package exists so an editor can tell you what\n * `context` has on it, and so `visualautomate test` can call your execute with\n * a context that behaves like the real one.\n */\n\nexport * from \"./types\"\nexport * from \"./simulate\"\nexport * from \"./validate\"\nexport * from \"./runtime\"\nexport {\n BLOCKED_GLOBAL_NAMES,\n MAX_CODE_LENGTH,\n PLATFORM_NODE_MAJOR,\n PROVIDED_GLOBALS,\n PUSH_CHECK,\n RETIRED_TIERS,\n SANDBOX_OVERRIDES,\n SANDBOX_TIERS,\n SIGNED_URL_SECONDS,\n STATE_LIMITS,\n} from \"./platform-rules\"\nexport { checkManifest, type ManifestCheck, type StepKind } from \"./manifest-check\"\nexport { CONTEXT_API, BLOCKED_GLOBALS, type ContextApiEntry } from \"./context-api\"\n", "/**\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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACSO,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,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",
4
+ "sourcesContent": ["/**\n * @visualautomate/plugin-sdk\n *\n * Three things: the types a plugin is written against, a way to run one on\n * your own machine before it goes anywhere near a canvas, and the checks the\n * platform applies to a plugin's code before it will accept it.\n *\n * Nothing here runs inside the sandbox. Plugin code is plain JavaScript that\n * the platform loads; this package exists so an editor can tell you what\n * `context` has on it, and so `visualautomate test` can call your execute with\n * a context that behaves like the real one.\n */\n\nexport * from \"./types\"\nexport * from \"./simulate\"\nexport * from \"./validate\"\nexport * from \"./runtime\"\nexport {\n BLOCKED_GLOBAL_NAMES,\n MAX_CODE_LENGTH,\n PLATFORM_NODE_MAJOR,\n PROVIDED_GLOBALS,\n PUSH_CHECK,\n RETIRED_TIERS,\n SANDBOX_OVERRIDES,\n SANDBOX_TIERS,\n SIGNED_URL_SECONDS,\n STATE_LIMITS,\n} from \"./platform-rules\"\nexport { ACCOUNTS_ARE_OURS, accountUseIn, checkManifest, type ManifestCheck, type StepKind } from \"./manifest-check\"\nexport { CONTEXT_API, BLOCKED_GLOBALS, type ContextApiEntry } from \"./context-api\"\n", "/**\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 * @deprecated for `connections`: only VisualAutomate's own apps act as a\n * connected account, so a step you build is never given one. Stub `fetch`\n * through loadPluginCode instead.\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 */\n/**\n * Why a developer's step cannot use a connected account, and what to do instead.\n *\n * Only VisualAutomate's own apps act as somebody's mailbox, workspace or store.\n * A step built with this SDK reaches an API at its own address, with a key the\n * user enters in a `secret` property.\n */\nexport const ACCOUNTS_ARE_OURS =\n 'Only VisualAutomate\\'s own apps act as a connected account: call the API at its own address instead (action.baseUrl, or fetch in code), with a key the user enters in a property of type \"secret\"'\n\n/** Each way a manifest would use a connected account, in words. Empty when it uses none. */\nexport function accountUseIn(manifest: unknown): string[] {\n if (!isObject(manifest)) return []\n const m = manifest as Record<string, unknown>\n const uses: string[] = []\n if (isObject(m.properties)) {\n for (const [key, value] of Object.entries(m.properties)) {\n if (!isObject(value)) continue\n if (value.type === \"connection\") uses.push(`properties.${key} is a connection: an account to act as`)\n if (value.optionsFrom !== undefined) uses.push(`properties.${key}.optionsFrom reads its options as an account`)\n }\n }\n if (isObject(m.action) && m.action.connection !== undefined) uses.push(\"action.connection makes the call as an account\")\n if (m.trigger !== undefined) uses.push(\"trigger watches an account\")\n if (isObject(m.auth) && typeof m.auth.provider === \"string\" && m.auth.provider) uses.push(`auth.provider names \"${m.auth.provider}\"`)\n return uses\n}\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 } else if (m.auth.type !== \"none\" && !m.auth.provider) {\n // The platform wants a provider for every other type, and a\n // provider is an account to act as, which accountUseIn refuses.\n errors.push(`auth.type \"${m.auth.type}\" needs a provider to sign in to, and only VisualAutomate's own apps name one: use { \"type\": \"none\" } and take the user's key in a property of type \"secret\".`)\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 // Only VisualAutomate's own apps act as a connected account: the platform\n // refuses a developer's step that names one, and the portal will not save\n // or publish it. So each way in is an error here, not a warning.\n for (const use of accountUseIn(m)) errors.push(`${use}. ${ACCOUNTS_ARE_OURS}`)\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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACSO,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,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",
6
6
  "names": ["require", "vm"]
7
7
  }