diff --git a/.github/workflows/update-api-spec.yml b/.github/workflows/update-api-spec.yml
index f302b0a..882b76a 100644
--- a/.github/workflows/update-api-spec.yml
+++ b/.github/workflows/update-api-spec.yml
@@ -18,11 +18,9 @@ jobs:
       - uses: actions/setup-node@v4
         with:
           node-version: "18"
-      - name: Generate spec
-        shell: bash
-        run: |
-          npm install
-          npm run gen
+      - working-directory: "./oxide-openapi-gen-ts"
+        run: 'npm install'
+      - run: ./tools/gen.sh
       - uses: EndBug/add-and-commit@v9
         with:
           add: .
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index 8833aa0..b7e2bab 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -19,13 +19,16 @@ jobs:
       - uses: actions/setup-node@v4
         with:
           node-version: "18"
-      - name: npm install
+      - working-directory: "./oxide-openapi-gen-ts"
         run: npm install
       - name: Generate client
-        run: npm run gen
-      - name: TypeCheck
+        run: "./tools/gen.sh"
+      - name: Typecheck
+        working-directory: "./oxide-openapi-gen-ts"
         run: npm run tsc
       - name: Lint
-        run: npx eslint .
+        working-directory: "./oxide-openapi-gen-ts"
+        run: npm run lint
       - name: Test
-        run: npm test
+        working-directory: "./oxide-openapi-gen-ts"
+        run: npm test run
diff --git a/.gitignore b/.gitignore
index 167e209..837c9c8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+packages/openpi-gen/node_modules
 node_modules
 dist
-spec.json
\ No newline at end of file
+spec.json
diff --git a/README.md b/README.md
index f2a495e..65b8c3e 100644
--- a/README.md
+++ b/README.md
@@ -7,58 +7,14 @@ The generator is built specifically for use with specs generated by
 [Dropshot](https://github.com/oxidecomputer/dropshot). It has not been tested on
 any other specs and is unlikely to handle them well.
 
-## Why a custom generator?
-
-We tried many existing generators, and while most worked in a basic sense, we
-found it hard to make customizations, whether through CLI flags, templates, or
-patching with [patch-package](https://github.com/ds300/patch-package). We
-decided to prototype our own TS generator after seeing other Oxide devs do the
-same for Rust ([progenitor](https://github.com/oxidecomputer/progenitor) and
-[oxide.rs](https://github.com/oxidecomputer/oxide.rs)) and Go
-([oxide.go](https://github.com/oxidecomputer/oxide.go)). It quickly became clear
-that a special-purpose generator could be dramatically simpler than a general
-one, so writing one was easier than existing generators made it look.
-
-## Repo guide
-
-The source of the generator is in [`generator`](generator/). The core logic for
-looping over the spec and creating the methods is in
-[`generator/client/api.ts`](generator/client/api.ts) and the mapping from
-OpenAPI schemas to TS types is in
-[`generator/schema/types.ts`](generator/schema/types.ts). The mapping from
-OpenAPI schemas to Zod schemas is in
-[`generator/schema/zod.ts`](generator/schema/zod.ts).
-
-The generated client can be found in [`client`](client/). The files in
-[`static`](static/) are copied over to `client` as-is during generation. We
-generate several distinct pieces:
-
-| File                                        | Description                                                                                            |
-| ------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
-| [`Api.ts`](client/Api.ts)                   | A [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)-based TS client to the Oxide API |
-| [`validate.ts`](client/validate.ts)         | [Zod](https://github.com/colinhacks/zod) validators for API request and response types                 |
-| [`msw-handlers.ts`](client/msw-handlers.ts) | Helpers used to build a mock API with [Mock Service Worker](https://mswjs.io/) in the console repo     |
+|Package| Description|
+|---|---|
+| [`@oxide/openapi-gen-ts`](./oxide-openapi-gen-ts) | TypeScript OpenAPI client generator |
+| [`@oxide/api`](./oxide-api) | The client generated for the Omicron commit specified in `OMICRON_VERSION` |
 
 ## Using the API client
 
-We intend to publish the generated code on npm, but have not done so yet. In
-the [Oxide web console](https://github.com/oxidecomputer/console) (the primary
-consumer of the TS client) we use the client by generating it from a pinned
-spec version with `tsx generator/index.ts` and versioning a full copy of the
-generated code in that repo.
-
-The generated client uses the Fetch API, so in
-order to be used in Node.js, it requires either Node.js v18 or a polyfill.
-
-## Generating the client
-
-```bash
-# optional: update omicron sha in OMICRON_VERSION
-npm i
-npm run gen
-```
-
-The TypeScript client code will be written to [`client`](client/).
+See the [README](./oxide-api/README.md) for the `@oxide/api` package.
 
 ## Contributing
 
diff --git a/generator/index.ts b/generator/index.ts
deleted file mode 100644
index de8c99e..0000000
--- a/generator/index.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, you can obtain one at https://mozilla.org/MPL/2.0/.
- *
- * Copyright Oxide Computer Company
- */
-
-import SwaggerParser from "@apidevtools/swagger-parser";
-import type { OpenAPIV3 } from "openapi-types";
-
-import { copyStaticFiles, generateApi } from "./client/api";
-import { generateMSWHandlers } from "./client/msw-handlers";
-import { generateTypeTests } from "./client/type-tests";
-import { generateZodValidators } from "./client/zodValidators";
-import { resolve } from "node:path";
-
-async function generate(specFile: string, destDir: string) {
-  // destination directory is resolved relative to CWD
-  const destDirAbs = resolve(process.cwd(), destDir);
-
-  const rawSpec = await SwaggerParser.parse(specFile);
-  if (!("openapi" in rawSpec) || !rawSpec.openapi.startsWith("3.0")) {
-    throw new Error("Only OpenAPI 3.0 is currently supported");
-  }
-
-  // we're not actually changing anything from rawSpec to spec, we've
-  // just ruled out v2 and v3.1
-  const spec = rawSpec as OpenAPIV3.Document;
-
-  copyStaticFiles(destDirAbs);
-  generateApi(spec, destDirAbs);
-  generateZodValidators(spec, destDirAbs);
-  // TODO: make conditional - we only want generated for testing purpose
-  generateTypeTests(spec, destDirAbs);
-  generateMSWHandlers(spec, destDirAbs);
-}
-
-function helpAndExit(msg: string): never {
-  console.log(msg);
-  console.log("\nUsage: gen <specFile> <destDir>");
-  process.exit(1);
-}
-
-const [specFile, destDir] = process.argv.slice(2);
-
-if (!specFile) helpAndExit(`Missing <specFile>`);
-if (!destDir) helpAndExit(`Missing <destdir>`);
-
-generate(specFile, destDir);
diff --git a/oxide-api/README.md b/oxide-api/README.md
new file mode 100644
index 0000000..71b3bd6
--- /dev/null
+++ b/oxide-api/README.md
@@ -0,0 +1,61 @@
+# Oxide TypeScript SDK
+
+## Usage
+
+### Installation
+
+```
+npm install @oxide/api
+```
+
+### Getting an API token
+
+The easiest way to get a device token is to use the CLI.
+
+```
+oxide auth login --host https://my-oxide-rack.com
+```
+
+Then print the token:
+
+```
+oxide auth status --show-token
+```
+
+In the following example it's passed to the script through the `OXIDE_TOKEN`
+environment variable on the assumption that you don't want to hard-code a token
+into a script, but this can of course be done however you want. `OXIDE_TOKEN` is
+not a special variable for the TypeScript SDK (it is for the CLI).
+
+### Example
+
+```ts
+import { Api } from "@oxide/api"
+
+const api = new Api({
+  host: "https://my-oxide-rack.com",
+  token: process.env.OXIDE_TOKEN,
+})
+
+const result = await api.methods.projectList({})
+
+if (result.type === "success") {
+  console.log(result.data.items.map((p) => p.name))
+}
+```
+
+## How does it all work?
+
+### Methods
+
+### Request bodies
+
+### Responses: `ApiResult<T>`
+
+## Other stuff in the package
+
+Most likely nobody but us wants this, and we should take it out of the npm package.
+
+### Mock Service Worker API skeleton
+
+### Zod validators
diff --git a/oxide-api/package-lock.json b/oxide-api/package-lock.json
new file mode 100644
index 0000000..6b56065
--- /dev/null
+++ b/oxide-api/package-lock.json
@@ -0,0 +1,2066 @@
+{
+  "name": "@oxide/api",
+  "version": "0.1.0-alpha.3",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "@oxide/api",
+      "version": "0.1.0-alpha.3",
+      "license": "MPL-2.0",
+      "dependencies": {
+        "zod": "^3.23.5"
+      },
+      "devDependencies": {
+        "tsup": "^8.0.2",
+        "typescript": "^5.4.5"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
+      "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
+      "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
+      "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
+      "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
+      "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
+      "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
+      "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
+      "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
+      "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
+      "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
+      "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
+      "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
+      "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
+      "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
+      "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
+      "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
+      "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
+      "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
+      "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
+      "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
+      "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
+      "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
+      "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+      "dev": true
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
+      "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
+      "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
+      "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
+      "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
+      "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz",
+      "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
+      "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
+      "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz",
+      "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
+      "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz",
+      "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
+      "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
+      "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
+      "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
+      "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
+      "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+      "dev": true
+    },
+    "node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+      "dev": true
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/bundle-require": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.1.0.tgz",
+      "integrity": "sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==",
+      "dev": true,
+      "dependencies": {
+        "load-tsconfig": "^0.2.3"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "esbuild": ">=0.17"
+      }
+    },
+    "node_modules/cac": {
+      "version": "6.7.14",
+      "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+      "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "dependencies": {
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+      "dev": true
+    },
+    "node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true
+    },
+    "node_modules/esbuild": {
+      "version": "0.19.12",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
+      "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.19.12",
+        "@esbuild/android-arm": "0.19.12",
+        "@esbuild/android-arm64": "0.19.12",
+        "@esbuild/android-x64": "0.19.12",
+        "@esbuild/darwin-arm64": "0.19.12",
+        "@esbuild/darwin-x64": "0.19.12",
+        "@esbuild/freebsd-arm64": "0.19.12",
+        "@esbuild/freebsd-x64": "0.19.12",
+        "@esbuild/linux-arm": "0.19.12",
+        "@esbuild/linux-arm64": "0.19.12",
+        "@esbuild/linux-ia32": "0.19.12",
+        "@esbuild/linux-loong64": "0.19.12",
+        "@esbuild/linux-mips64el": "0.19.12",
+        "@esbuild/linux-ppc64": "0.19.12",
+        "@esbuild/linux-riscv64": "0.19.12",
+        "@esbuild/linux-s390x": "0.19.12",
+        "@esbuild/linux-x64": "0.19.12",
+        "@esbuild/netbsd-x64": "0.19.12",
+        "@esbuild/openbsd-x64": "0.19.12",
+        "@esbuild/sunos-x64": "0.19.12",
+        "@esbuild/win32-arm64": "0.19.12",
+        "@esbuild/win32-ia32": "0.19.12",
+        "@esbuild/win32-x64": "0.19.12"
+      }
+    },
+    "node_modules/execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/glob": {
+      "version": "10.3.12",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
+      "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
+      "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.3.6",
+        "minimatch": "^9.0.1",
+        "minipass": "^7.0.4",
+        "path-scurry": "^1.10.2"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "dev": true,
+      "dependencies": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.17.0"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "node_modules/jackspeak": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+      "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+      "dev": true,
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/joycon": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+      "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/lilconfig": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
+      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antonk52"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true
+    },
+    "node_modules/load-tsconfig": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+      "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+      "dev": true,
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      }
+    },
+    "node_modules/lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+      "dev": true
+    },
+    "node_modules/lru-cache": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+      "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+      "dev": true,
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "dev": true,
+      "dependencies": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "9.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+      "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "dependencies": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-scurry": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
+      "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pirates": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/postcss-load-config": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "lilconfig": "^3.0.0",
+        "yaml": "^2.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      },
+      "peerDependencies": {
+        "postcss": ">=8.0.9",
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "postcss": {
+          "optional": true
+        },
+        "ts-node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
+      "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "1.0.5"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.17.2",
+        "@rollup/rollup-android-arm64": "4.17.2",
+        "@rollup/rollup-darwin-arm64": "4.17.2",
+        "@rollup/rollup-darwin-x64": "4.17.2",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
+        "@rollup/rollup-linux-arm-musleabihf": "4.17.2",
+        "@rollup/rollup-linux-arm64-gnu": "4.17.2",
+        "@rollup/rollup-linux-arm64-musl": "4.17.2",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
+        "@rollup/rollup-linux-riscv64-gnu": "4.17.2",
+        "@rollup/rollup-linux-s390x-gnu": "4.17.2",
+        "@rollup/rollup-linux-x64-gnu": "4.17.2",
+        "@rollup/rollup-linux-x64-musl": "4.17.2",
+        "@rollup/rollup-win32-arm64-msvc": "4.17.2",
+        "@rollup/rollup-win32-ia32-msvc": "4.17.2",
+        "@rollup/rollup-win32-x64-msvc": "4.17.2",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.8.0-beta.0",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+      "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+      "dev": true,
+      "dependencies": {
+        "whatwg-url": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "dev": true,
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/string-width-cjs/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
+    },
+    "node_modules/string-width-cjs/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/sucrase": {
+      "version": "3.35.0",
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "commander": "^4.0.0",
+        "glob": "^10.3.10",
+        "lines-and-columns": "^1.1.6",
+        "mz": "^2.7.0",
+        "pirates": "^4.0.1",
+        "ts-interface-checker": "^0.1.9"
+      },
+      "bin": {
+        "sucrase": "bin/sucrase",
+        "sucrase-node": "bin/sucrase-node"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dev": true,
+      "dependencies": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "node_modules/thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+      "dev": true,
+      "dependencies": {
+        "thenify": ">= 3.1.0 < 4"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true,
+      "bin": {
+        "tree-kill": "cli.js"
+      }
+    },
+    "node_modules/ts-interface-checker": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+      "dev": true
+    },
+    "node_modules/tsup": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.2.tgz",
+      "integrity": "sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==",
+      "dev": true,
+      "dependencies": {
+        "bundle-require": "^4.0.0",
+        "cac": "^6.7.12",
+        "chokidar": "^3.5.1",
+        "debug": "^4.3.1",
+        "esbuild": "^0.19.2",
+        "execa": "^5.0.0",
+        "globby": "^11.0.3",
+        "joycon": "^3.0.1",
+        "postcss-load-config": "^4.0.1",
+        "resolve-from": "^5.0.0",
+        "rollup": "^4.0.2",
+        "source-map": "0.8.0-beta.0",
+        "sucrase": "^3.20.3",
+        "tree-kill": "^1.2.2"
+      },
+      "bin": {
+        "tsup": "dist/cli-default.js",
+        "tsup-node": "dist/cli-node.js"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@microsoft/api-extractor": "^7.36.0",
+        "@swc/core": "^1",
+        "postcss": "^8.4.12",
+        "typescript": ">=4.5.0"
+      },
+      "peerDependenciesMeta": {
+        "@microsoft/api-extractor": {
+          "optional": true
+        },
+        "@swc/core": {
+          "optional": true
+        },
+        "postcss": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.4.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+      "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "dev": true
+    },
+    "node_modules/whatwg-url": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+      "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+      "dev": true,
+      "dependencies": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yaml": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
+      "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
+      "dev": true,
+      "bin": {
+        "yaml": "bin.mjs"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/zod": {
+      "version": "3.23.5",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.5.tgz",
+      "integrity": "sha512-fkwiq0VIQTksNNA131rDOsVJcns0pfVUjHzLrNBiF/O/Xxb5lQyEXkhZWcJ7npWsYlvs+h0jFWXXy4X46Em1JA==",
+      "funding": {
+        "url": "https://github.com/sponsors/colinhacks"
+      }
+    }
+  }
+}
diff --git a/oxide-api/package.json b/oxide-api/package.json
new file mode 100644
index 0000000..65901ec
--- /dev/null
+++ b/oxide-api/package.json
@@ -0,0 +1,57 @@
+{
+  "name": "@oxide/api",
+  "version": "0.1.0-alpha.3",
+  "description": "TypeScript client for the Oxide API",
+  "engines": {
+    "node": ">=18"
+  },
+  "type": "module",
+  "main": "./dist/Api.js",
+  "exports": {
+    ".": {
+      "import": "./dist/Api.js",
+      "require": "./dist/Api.cjs"
+    },
+    "./validate": {
+      "import": "./dist/validate.js",
+      "require": "./dist/validate.cjs"
+    }
+  },
+  "scripts": {
+    "build": "tsup --dts",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/oxidecomputer/oxide.ts.git"
+  },
+  "keywords": [
+    "oxide",
+    "oxide.ts",
+    "oxide sdk"
+  ],
+  "author": "Oxide Computer Company",
+  "license": "MPL-2.0",
+  "bugs": {
+    "url": "https://github.com/oxidecomputer/oxide.ts/issues"
+  },
+  "homepage": "https://github.com/oxidecomputer/oxide.ts#readme",
+  "devDependencies": {
+    "tsup": "^8.0.2",
+    "typescript": "^5.4.5"
+  },
+  "tsup": {
+    "clean": true,
+    "entry": [
+      "src/Api.ts",
+      "src/validate.ts"
+    ],
+    "format": [
+      "cjs",
+      "esm"
+    ]
+  },
+  "dependencies": {
+    "zod": "^3.23.5"
+  }
+}
diff --git a/client/Api.ts b/oxide-api/src/Api.ts
similarity index 97%
rename from client/Api.ts
rename to oxide-api/src/Api.ts
index 31aa560..3d6f327 100644
--- a/client/Api.ts
+++ b/oxide-api/src/Api.ts
@@ -4192,7 +4192,7 @@ export class Api extends HttpClient {
      */
     deviceAuthConfirm: (
       { body }: { body: DeviceAuthVerify },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/device/confirm`,
@@ -4216,7 +4216,7 @@ export class Api extends HttpClient {
      */
     probeList: (
       { query = {} }: { query?: ProbeListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ProbeInfoResultsPage>({
         path: `/experimental/v1/probes`,
@@ -4230,7 +4230,7 @@ export class Api extends HttpClient {
      */
     probeCreate: (
       { query, body }: { query?: ProbeCreateQueryParams; body: ProbeCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Probe>({
         path: `/experimental/v1/probes`,
@@ -4248,7 +4248,7 @@ export class Api extends HttpClient {
         path,
         query,
       }: { path: ProbeViewPathParams; query?: ProbeViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ProbeInfo>({
         path: `/experimental/v1/probes/${path.probe}`,
@@ -4265,7 +4265,7 @@ export class Api extends HttpClient {
         path,
         query,
       }: { path: ProbeDeletePathParams; query?: ProbeDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/experimental/v1/probes/${path.probe}`,
@@ -4279,7 +4279,7 @@ export class Api extends HttpClient {
      */
     loginSaml: (
       { path }: { path: LoginSamlPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/login/${path.siloName}/saml/${path.providerName}`,
@@ -4292,7 +4292,7 @@ export class Api extends HttpClient {
      */
     certificateList: (
       { query = {} }: { query?: CertificateListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<CertificateResultsPage>({
         path: `/v1/certificates`,
@@ -4306,7 +4306,7 @@ export class Api extends HttpClient {
      */
     certificateCreate: (
       { body }: { body: CertificateCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Certificate>({
         path: `/v1/certificates`,
@@ -4320,7 +4320,7 @@ export class Api extends HttpClient {
      */
     certificateView: (
       { path }: { path: CertificateViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Certificate>({
         path: `/v1/certificates/${path.certificate}`,
@@ -4333,7 +4333,7 @@ export class Api extends HttpClient {
      */
     certificateDelete: (
       { path }: { path: CertificateDeletePathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/certificates/${path.certificate}`,
@@ -4346,7 +4346,7 @@ export class Api extends HttpClient {
      */
     diskList: (
       { query = {} }: { query?: DiskListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<DiskResultsPage>({
         path: `/v1/disks`,
@@ -4360,7 +4360,7 @@ export class Api extends HttpClient {
      */
     diskCreate: (
       { query, body }: { query?: DiskCreateQueryParams; body: DiskCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Disk>({
         path: `/v1/disks`,
@@ -4378,7 +4378,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: DiskViewPathParams; query?: DiskViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Disk>({
         path: `/v1/disks/${path.disk}`,
@@ -4395,7 +4395,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: DiskDeletePathParams; query?: DiskDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/disks/${path.disk}`,
@@ -4417,7 +4417,7 @@ export class Api extends HttpClient {
         query?: DiskBulkWriteImportQueryParams;
         body: ImportBlocksBulkWrite;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/disks/${path.disk}/bulk-write`,
@@ -4438,7 +4438,7 @@ export class Api extends HttpClient {
         path: DiskBulkWriteImportStartPathParams;
         query?: DiskBulkWriteImportStartQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/disks/${path.disk}/bulk-write-start`,
@@ -4458,7 +4458,7 @@ export class Api extends HttpClient {
         path: DiskBulkWriteImportStopPathParams;
         query?: DiskBulkWriteImportStopQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/disks/${path.disk}/bulk-write-stop`,
@@ -4480,7 +4480,7 @@ export class Api extends HttpClient {
         query?: DiskFinalizeImportQueryParams;
         body: FinalizeDisk;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/disks/${path.disk}/finalize`,
@@ -4501,7 +4501,7 @@ export class Api extends HttpClient {
         path: DiskMetricsListPathParams;
         query?: DiskMetricsListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<MeasurementResultsPage>({
         path: `/v1/disks/${path.disk}/metrics/${path.metric}`,
@@ -4515,7 +4515,7 @@ export class Api extends HttpClient {
      */
     floatingIpList: (
       { query = {} }: { query?: FloatingIpListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<FloatingIpResultsPage>({
         path: `/v1/floating-ips`,
@@ -4532,7 +4532,7 @@ export class Api extends HttpClient {
         query,
         body,
       }: { query?: FloatingIpCreateQueryParams; body: FloatingIpCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<FloatingIp>({
         path: `/v1/floating-ips`,
@@ -4550,7 +4550,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: FloatingIpViewPathParams; query?: FloatingIpViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<FloatingIp>({
         path: `/v1/floating-ips/${path.floatingIp}`,
@@ -4572,7 +4572,7 @@ export class Api extends HttpClient {
         query?: FloatingIpUpdateQueryParams;
         body: FloatingIpUpdate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<FloatingIp>({
         path: `/v1/floating-ips/${path.floatingIp}`,
@@ -4593,7 +4593,7 @@ export class Api extends HttpClient {
         path: FloatingIpDeletePathParams;
         query?: FloatingIpDeleteQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/floating-ips/${path.floatingIp}`,
@@ -4615,7 +4615,7 @@ export class Api extends HttpClient {
         query?: FloatingIpAttachQueryParams;
         body: FloatingIpAttach;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<FloatingIp>({
         path: `/v1/floating-ips/${path.floatingIp}/attach`,
@@ -4636,7 +4636,7 @@ export class Api extends HttpClient {
         path: FloatingIpDetachPathParams;
         query?: FloatingIpDetachQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<FloatingIp>({
         path: `/v1/floating-ips/${path.floatingIp}/detach`,
@@ -4650,7 +4650,7 @@ export class Api extends HttpClient {
      */
     groupList: (
       { query = {} }: { query?: GroupListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<GroupResultsPage>({
         path: `/v1/groups`,
@@ -4664,7 +4664,7 @@ export class Api extends HttpClient {
      */
     groupView: (
       { path }: { path: GroupViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Group>({
         path: `/v1/groups/${path.groupId}`,
@@ -4677,7 +4677,7 @@ export class Api extends HttpClient {
      */
     imageList: (
       { query = {} }: { query?: ImageListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ImageResultsPage>({
         path: `/v1/images`,
@@ -4694,7 +4694,7 @@ export class Api extends HttpClient {
         query = {},
         body,
       }: { query?: ImageCreateQueryParams; body: ImageCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Image>({
         path: `/v1/images`,
@@ -4712,7 +4712,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: ImageViewPathParams; query?: ImageViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Image>({
         path: `/v1/images/${path.image}`,
@@ -4729,7 +4729,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: ImageDeletePathParams; query?: ImageDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/images/${path.image}`,
@@ -4746,7 +4746,7 @@ export class Api extends HttpClient {
         path,
         query,
       }: { path: ImageDemotePathParams; query?: ImageDemoteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Image>({
         path: `/v1/images/${path.image}/demote`,
@@ -4763,7 +4763,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: ImagePromotePathParams; query?: ImagePromoteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Image>({
         path: `/v1/images/${path.image}/promote`,
@@ -4777,7 +4777,7 @@ export class Api extends HttpClient {
      */
     instanceList: (
       { query = {} }: { query?: InstanceListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<InstanceResultsPage>({
         path: `/v1/instances`,
@@ -4794,7 +4794,7 @@ export class Api extends HttpClient {
         query,
         body,
       }: { query?: InstanceCreateQueryParams; body: InstanceCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Instance>({
         path: `/v1/instances`,
@@ -4812,7 +4812,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: InstanceViewPathParams; query?: InstanceViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Instance>({
         path: `/v1/instances/${path.instance}`,
@@ -4829,7 +4829,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: InstanceDeletePathParams; query?: InstanceDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/instances/${path.instance}`,
@@ -4849,7 +4849,7 @@ export class Api extends HttpClient {
         path: InstanceDiskListPathParams;
         query?: InstanceDiskListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<DiskResultsPage>({
         path: `/v1/instances/${path.instance}/disks`,
@@ -4871,7 +4871,7 @@ export class Api extends HttpClient {
         query?: InstanceDiskAttachQueryParams;
         body: DiskPath;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Disk>({
         path: `/v1/instances/${path.instance}/disks/attach`,
@@ -4894,7 +4894,7 @@ export class Api extends HttpClient {
         query?: InstanceDiskDetachQueryParams;
         body: DiskPath;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Disk>({
         path: `/v1/instances/${path.instance}/disks/detach`,
@@ -4915,7 +4915,7 @@ export class Api extends HttpClient {
         path: InstanceExternalIpListPathParams;
         query?: InstanceExternalIpListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ExternalIpResultsPage>({
         path: `/v1/instances/${path.instance}/external-ips`,
@@ -4937,7 +4937,7 @@ export class Api extends HttpClient {
         query?: InstanceEphemeralIpAttachQueryParams;
         body: EphemeralIpCreate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ExternalIp>({
         path: `/v1/instances/${path.instance}/external-ips/ephemeral`,
@@ -4958,7 +4958,7 @@ export class Api extends HttpClient {
         path: InstanceEphemeralIpDetachPathParams;
         query?: InstanceEphemeralIpDetachQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/instances/${path.instance}/external-ips/ephemeral`,
@@ -4980,7 +4980,7 @@ export class Api extends HttpClient {
         query?: InstanceMigrateQueryParams;
         body: InstanceMigrate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Instance>({
         path: `/v1/instances/${path.instance}/migrate`,
@@ -4998,7 +4998,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: InstanceRebootPathParams; query?: InstanceRebootQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Instance>({
         path: `/v1/instances/${path.instance}/reboot`,
@@ -5018,7 +5018,7 @@ export class Api extends HttpClient {
         path: InstanceSerialConsolePathParams;
         query?: InstanceSerialConsoleQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<InstanceSerialConsoleData>({
         path: `/v1/instances/${path.instance}/serial-console`,
@@ -5038,7 +5038,7 @@ export class Api extends HttpClient {
         path: InstanceSshPublicKeyListPathParams;
         query?: InstanceSshPublicKeyListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SshKeyResultsPage>({
         path: `/v1/instances/${path.instance}/ssh-public-keys`,
@@ -5055,7 +5055,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: InstanceStartPathParams; query?: InstanceStartQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Instance>({
         path: `/v1/instances/${path.instance}/start`,
@@ -5072,7 +5072,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: InstanceStopPathParams; query?: InstanceStopQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Instance>({
         path: `/v1/instances/${path.instance}/stop`,
@@ -5086,7 +5086,7 @@ export class Api extends HttpClient {
      */
     projectIpPoolList: (
       { query = {} }: { query?: ProjectIpPoolListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloIpPoolResultsPage>({
         path: `/v1/ip-pools`,
@@ -5100,7 +5100,7 @@ export class Api extends HttpClient {
      */
     projectIpPoolView: (
       { path }: { path: ProjectIpPoolViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloIpPool>({
         path: `/v1/ip-pools/${path.pool}`,
@@ -5116,7 +5116,7 @@ export class Api extends HttpClient {
         path,
         body,
       }: { path: LoginLocalPathParams; body: UsernamePasswordCredentials },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/login/${path.siloName}/local`,
@@ -5150,7 +5150,7 @@ export class Api extends HttpClient {
      */
     currentUserGroups: (
       { query = {} }: { query?: CurrentUserGroupsQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<GroupResultsPage>({
         path: `/v1/me/groups`,
@@ -5164,7 +5164,7 @@ export class Api extends HttpClient {
      */
     currentUserSshKeyList: (
       { query = {} }: { query?: CurrentUserSshKeyListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SshKeyResultsPage>({
         path: `/v1/me/ssh-keys`,
@@ -5178,7 +5178,7 @@ export class Api extends HttpClient {
      */
     currentUserSshKeyCreate: (
       { body }: { body: SshKeyCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SshKey>({
         path: `/v1/me/ssh-keys`,
@@ -5192,7 +5192,7 @@ export class Api extends HttpClient {
      */
     currentUserSshKeyView: (
       { path }: { path: CurrentUserSshKeyViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SshKey>({
         path: `/v1/me/ssh-keys/${path.sshKey}`,
@@ -5205,7 +5205,7 @@ export class Api extends HttpClient {
      */
     currentUserSshKeyDelete: (
       { path }: { path: CurrentUserSshKeyDeletePathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/me/ssh-keys/${path.sshKey}`,
@@ -5221,7 +5221,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: SiloMetricPathParams; query?: SiloMetricQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<MeasurementResultsPage>({
         path: `/v1/metrics/${path.metricName}`,
@@ -5235,7 +5235,7 @@ export class Api extends HttpClient {
      */
     instanceNetworkInterfaceList: (
       { query = {} }: { query?: InstanceNetworkInterfaceListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<InstanceNetworkInterfaceResultsPage>({
         path: `/v1/network-interfaces`,
@@ -5255,7 +5255,7 @@ export class Api extends HttpClient {
         query?: InstanceNetworkInterfaceCreateQueryParams;
         body: InstanceNetworkInterfaceCreate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<InstanceNetworkInterface>({
         path: `/v1/network-interfaces`,
@@ -5276,7 +5276,7 @@ export class Api extends HttpClient {
         path: InstanceNetworkInterfaceViewPathParams;
         query?: InstanceNetworkInterfaceViewQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<InstanceNetworkInterface>({
         path: `/v1/network-interfaces/${path.interface}`,
@@ -5298,7 +5298,7 @@ export class Api extends HttpClient {
         query?: InstanceNetworkInterfaceUpdateQueryParams;
         body: InstanceNetworkInterfaceUpdate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<InstanceNetworkInterface>({
         path: `/v1/network-interfaces/${path.interface}`,
@@ -5319,7 +5319,7 @@ export class Api extends HttpClient {
         path: InstanceNetworkInterfaceDeletePathParams;
         query?: InstanceNetworkInterfaceDeleteQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/network-interfaces/${path.interface}`,
@@ -5353,7 +5353,7 @@ export class Api extends HttpClient {
      */
     policyUpdate: (
       { body }: { body: SiloRolePolicy },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloRolePolicy>({
         path: `/v1/policy`,
@@ -5367,7 +5367,7 @@ export class Api extends HttpClient {
      */
     projectList: (
       { query = {} }: { query?: ProjectListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ProjectResultsPage>({
         path: `/v1/projects`,
@@ -5381,7 +5381,7 @@ export class Api extends HttpClient {
      */
     projectCreate: (
       { body }: { body: ProjectCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Project>({
         path: `/v1/projects`,
@@ -5395,7 +5395,7 @@ export class Api extends HttpClient {
      */
     projectView: (
       { path }: { path: ProjectViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Project>({
         path: `/v1/projects/${path.project}`,
@@ -5408,7 +5408,7 @@ export class Api extends HttpClient {
      */
     projectUpdate: (
       { path, body }: { path: ProjectUpdatePathParams; body: ProjectUpdate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Project>({
         path: `/v1/projects/${path.project}`,
@@ -5422,7 +5422,7 @@ export class Api extends HttpClient {
      */
     projectDelete: (
       { path }: { path: ProjectDeletePathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/projects/${path.project}`,
@@ -5435,7 +5435,7 @@ export class Api extends HttpClient {
      */
     projectPolicyView: (
       { path }: { path: ProjectPolicyViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ProjectRolePolicy>({
         path: `/v1/projects/${path.project}/policy`,
@@ -5451,7 +5451,7 @@ export class Api extends HttpClient {
         path,
         body,
       }: { path: ProjectPolicyUpdatePathParams; body: ProjectRolePolicy },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<ProjectRolePolicy>({
         path: `/v1/projects/${path.project}/policy`,
@@ -5465,7 +5465,7 @@ export class Api extends HttpClient {
      */
     snapshotList: (
       { query = {} }: { query?: SnapshotListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SnapshotResultsPage>({
         path: `/v1/snapshots`,
@@ -5482,7 +5482,7 @@ export class Api extends HttpClient {
         query,
         body,
       }: { query?: SnapshotCreateQueryParams; body: SnapshotCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Snapshot>({
         path: `/v1/snapshots`,
@@ -5500,7 +5500,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: SnapshotViewPathParams; query?: SnapshotViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Snapshot>({
         path: `/v1/snapshots/${path.snapshot}`,
@@ -5517,7 +5517,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: SnapshotDeletePathParams; query?: SnapshotDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/snapshots/${path.snapshot}`,
@@ -5531,7 +5531,7 @@ export class Api extends HttpClient {
      */
     physicalDiskList: (
       { query = {} }: { query?: PhysicalDiskListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<PhysicalDiskResultsPage>({
         path: `/v1/system/hardware/disks`,
@@ -5545,7 +5545,7 @@ export class Api extends HttpClient {
      */
     rackList: (
       { query = {} }: { query?: RackListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<RackResultsPage>({
         path: `/v1/system/hardware/racks`,
@@ -5559,7 +5559,7 @@ export class Api extends HttpClient {
      */
     rackView: (
       { path }: { path: RackViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Rack>({
         path: `/v1/system/hardware/racks/${path.rackId}`,
@@ -5572,7 +5572,7 @@ export class Api extends HttpClient {
      */
     sledList: (
       { query = {} }: { query?: SledListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SledResultsPage>({
         path: `/v1/system/hardware/sleds`,
@@ -5586,7 +5586,7 @@ export class Api extends HttpClient {
      */
     sledAdd: (
       { body }: { body: UninitializedSledId },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/hardware/sleds`,
@@ -5600,7 +5600,7 @@ export class Api extends HttpClient {
      */
     sledView: (
       { path }: { path: SledViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Sled>({
         path: `/v1/system/hardware/sleds/${path.sledId}`,
@@ -5619,7 +5619,7 @@ export class Api extends HttpClient {
         path: SledPhysicalDiskListPathParams;
         query?: SledPhysicalDiskListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<PhysicalDiskResultsPage>({
         path: `/v1/system/hardware/sleds/${path.sledId}/disks`,
@@ -5639,7 +5639,7 @@ export class Api extends HttpClient {
         path: SledInstanceListPathParams;
         query?: SledInstanceListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SledInstanceResultsPage>({
         path: `/v1/system/hardware/sleds/${path.sledId}/instances`,
@@ -5659,7 +5659,7 @@ export class Api extends HttpClient {
         path: SledSetProvisionPolicyPathParams;
         body: SledProvisionPolicyParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SledProvisionPolicyResponse>({
         path: `/v1/system/hardware/sleds/${path.sledId}/provision-policy`,
@@ -5673,7 +5673,7 @@ export class Api extends HttpClient {
      */
     sledListUninitialized: (
       { query = {} }: { query?: SledListUninitializedQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<UninitializedSledResultsPage>({
         path: `/v1/system/hardware/sleds-uninitialized`,
@@ -5687,7 +5687,7 @@ export class Api extends HttpClient {
      */
     networkingSwitchPortList: (
       { query = {} }: { query?: NetworkingSwitchPortListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SwitchPortResultsPage>({
         path: `/v1/system/hardware/switch-port`,
@@ -5709,7 +5709,7 @@ export class Api extends HttpClient {
         query?: NetworkingSwitchPortApplySettingsQueryParams;
         body: SwitchPortApplySettings;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/hardware/switch-port/${path.port}/settings`,
@@ -5730,7 +5730,7 @@ export class Api extends HttpClient {
         path: NetworkingSwitchPortClearSettingsPathParams;
         query?: NetworkingSwitchPortClearSettingsQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/hardware/switch-port/${path.port}/settings`,
@@ -5744,7 +5744,7 @@ export class Api extends HttpClient {
      */
     switchList: (
       { query = {} }: { query?: SwitchListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SwitchResultsPage>({
         path: `/v1/system/hardware/switches`,
@@ -5758,7 +5758,7 @@ export class Api extends HttpClient {
      */
     switchView: (
       { path }: { path: SwitchViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Switch>({
         path: `/v1/system/hardware/switches/${path.switchId}`,
@@ -5771,7 +5771,7 @@ export class Api extends HttpClient {
      */
     siloIdentityProviderList: (
       { query = {} }: { query?: SiloIdentityProviderListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IdentityProviderResultsPage>({
         path: `/v1/system/identity-providers`,
@@ -5788,7 +5788,7 @@ export class Api extends HttpClient {
         query,
         body,
       }: { query?: LocalIdpUserCreateQueryParams; body: UserCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<User>({
         path: `/v1/system/identity-providers/local/users`,
@@ -5809,7 +5809,7 @@ export class Api extends HttpClient {
         path: LocalIdpUserDeletePathParams;
         query?: LocalIdpUserDeleteQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/identity-providers/local/users/${path.userId}`,
@@ -5831,7 +5831,7 @@ export class Api extends HttpClient {
         query?: LocalIdpUserSetPasswordQueryParams;
         body: UserPassword;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/identity-providers/local/users/${path.userId}/set-password`,
@@ -5852,7 +5852,7 @@ export class Api extends HttpClient {
         query?: SamlIdentityProviderCreateQueryParams;
         body: SamlIdentityProviderCreate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SamlIdentityProvider>({
         path: `/v1/system/identity-providers/saml`,
@@ -5873,7 +5873,7 @@ export class Api extends HttpClient {
         path: SamlIdentityProviderViewPathParams;
         query?: SamlIdentityProviderViewQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SamlIdentityProvider>({
         path: `/v1/system/identity-providers/saml/${path.provider}`,
@@ -5887,7 +5887,7 @@ export class Api extends HttpClient {
      */
     ipPoolList: (
       { query = {} }: { query?: IpPoolListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolResultsPage>({
         path: `/v1/system/ip-pools`,
@@ -5901,7 +5901,7 @@ export class Api extends HttpClient {
      */
     ipPoolCreate: (
       { body }: { body: IpPoolCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPool>({
         path: `/v1/system/ip-pools`,
@@ -5915,7 +5915,7 @@ export class Api extends HttpClient {
      */
     ipPoolView: (
       { path }: { path: IpPoolViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPool>({
         path: `/v1/system/ip-pools/${path.pool}`,
@@ -5928,7 +5928,7 @@ export class Api extends HttpClient {
      */
     ipPoolUpdate: (
       { path, body }: { path: IpPoolUpdatePathParams; body: IpPoolUpdate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPool>({
         path: `/v1/system/ip-pools/${path.pool}`,
@@ -5942,7 +5942,7 @@ export class Api extends HttpClient {
      */
     ipPoolDelete: (
       { path }: { path: IpPoolDeletePathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/ip-pools/${path.pool}`,
@@ -5961,7 +5961,7 @@ export class Api extends HttpClient {
         path: IpPoolRangeListPathParams;
         query?: IpPoolRangeListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolRangeResultsPage>({
         path: `/v1/system/ip-pools/${path.pool}/ranges`,
@@ -5975,7 +5975,7 @@ export class Api extends HttpClient {
      */
     ipPoolRangeAdd: (
       { path, body }: { path: IpPoolRangeAddPathParams; body: IpRange },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolRange>({
         path: `/v1/system/ip-pools/${path.pool}/ranges/add`,
@@ -5989,7 +5989,7 @@ export class Api extends HttpClient {
      */
     ipPoolRangeRemove: (
       { path, body }: { path: IpPoolRangeRemovePathParams; body: IpRange },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/ip-pools/${path.pool}/ranges/remove`,
@@ -6006,7 +6006,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: IpPoolSiloListPathParams; query?: IpPoolSiloListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolSiloLinkResultsPage>({
         path: `/v1/system/ip-pools/${path.pool}/silos`,
@@ -6020,7 +6020,7 @@ export class Api extends HttpClient {
      */
     ipPoolSiloLink: (
       { path, body }: { path: IpPoolSiloLinkPathParams; body: IpPoolLinkSilo },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolSiloLink>({
         path: `/v1/system/ip-pools/${path.pool}/silos`,
@@ -6037,7 +6037,7 @@ export class Api extends HttpClient {
         path,
         body,
       }: { path: IpPoolSiloUpdatePathParams; body: IpPoolSiloUpdate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolSiloLink>({
         path: `/v1/system/ip-pools/${path.pool}/silos/${path.silo}`,
@@ -6051,7 +6051,7 @@ export class Api extends HttpClient {
      */
     ipPoolSiloUnlink: (
       { path }: { path: IpPoolSiloUnlinkPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/ip-pools/${path.pool}/silos/${path.silo}`,
@@ -6074,7 +6074,7 @@ export class Api extends HttpClient {
      */
     ipPoolServiceRangeList: (
       { query = {} }: { query?: IpPoolServiceRangeListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolRangeResultsPage>({
         path: `/v1/system/ip-pools-service/ranges`,
@@ -6088,7 +6088,7 @@ export class Api extends HttpClient {
      */
     ipPoolServiceRangeAdd: (
       { body }: { body: IpRange },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<IpPoolRange>({
         path: `/v1/system/ip-pools-service/ranges/add`,
@@ -6102,7 +6102,7 @@ export class Api extends HttpClient {
      */
     ipPoolServiceRangeRemove: (
       { body }: { body: IpRange },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/ip-pools-service/ranges/remove`,
@@ -6119,7 +6119,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: SystemMetricPathParams; query?: SystemMetricQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<MeasurementResultsPage>({
         path: `/v1/system/metrics/${path.metricName}`,
@@ -6133,7 +6133,7 @@ export class Api extends HttpClient {
      */
     networkingAddressLotList: (
       { query = {} }: { query?: NetworkingAddressLotListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<AddressLotResultsPage>({
         path: `/v1/system/networking/address-lot`,
@@ -6147,7 +6147,7 @@ export class Api extends HttpClient {
      */
     networkingAddressLotCreate: (
       { body }: { body: AddressLotCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<AddressLotCreateResponse>({
         path: `/v1/system/networking/address-lot`,
@@ -6161,7 +6161,7 @@ export class Api extends HttpClient {
      */
     networkingAddressLotDelete: (
       { path }: { path: NetworkingAddressLotDeletePathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/networking/address-lot/${path.addressLot}`,
@@ -6180,7 +6180,7 @@ export class Api extends HttpClient {
         path: NetworkingAddressLotBlockListPathParams;
         query?: NetworkingAddressLotBlockListQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<AddressLotBlockResultsPage>({
         path: `/v1/system/networking/address-lot/${path.addressLot}/blocks`,
@@ -6194,7 +6194,7 @@ export class Api extends HttpClient {
      */
     networkingBfdDisable: (
       { body }: { body: BfdSessionDisable },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/networking/bfd-disable`,
@@ -6208,7 +6208,7 @@ export class Api extends HttpClient {
      */
     networkingBfdEnable: (
       { body }: { body: BfdSessionEnable },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/networking/bfd-enable`,
@@ -6232,7 +6232,7 @@ export class Api extends HttpClient {
      */
     networkingBgpConfigList: (
       { query = {} }: { query?: NetworkingBgpConfigListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<BgpConfigResultsPage>({
         path: `/v1/system/networking/bgp`,
@@ -6246,7 +6246,7 @@ export class Api extends HttpClient {
      */
     networkingBgpConfigCreate: (
       { body }: { body: BgpConfigCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<BgpConfig>({
         path: `/v1/system/networking/bgp`,
@@ -6260,7 +6260,7 @@ export class Api extends HttpClient {
      */
     networkingBgpConfigDelete: (
       { query }: { query?: NetworkingBgpConfigDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/networking/bgp`,
@@ -6274,7 +6274,7 @@ export class Api extends HttpClient {
      */
     networkingBgpAnnounceSetList: (
       { query }: { query?: NetworkingBgpAnnounceSetListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<BgpAnnouncement[]>({
         path: `/v1/system/networking/bgp-announce`,
@@ -6288,7 +6288,7 @@ export class Api extends HttpClient {
      */
     networkingBgpAnnounceSetCreate: (
       { body }: { body: BgpAnnounceSetCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<BgpAnnounceSet>({
         path: `/v1/system/networking/bgp-announce`,
@@ -6302,7 +6302,7 @@ export class Api extends HttpClient {
      */
     networkingBgpAnnounceSetDelete: (
       { query }: { query?: NetworkingBgpAnnounceSetDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/networking/bgp-announce`,
@@ -6316,7 +6316,7 @@ export class Api extends HttpClient {
      */
     networkingBgpImportedRoutesIpv4: (
       { query }: { query?: NetworkingBgpImportedRoutesIpv4QueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<BgpImportedRouteIpv4[]>({
         path: `/v1/system/networking/bgp-routes-ipv4`,
@@ -6340,7 +6340,7 @@ export class Api extends HttpClient {
      */
     networkingLoopbackAddressList: (
       { query = {} }: { query?: NetworkingLoopbackAddressListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<LoopbackAddressResultsPage>({
         path: `/v1/system/networking/loopback-address`,
@@ -6354,7 +6354,7 @@ export class Api extends HttpClient {
      */
     networkingLoopbackAddressCreate: (
       { body }: { body: LoopbackAddressCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<LoopbackAddress>({
         path: `/v1/system/networking/loopback-address`,
@@ -6368,7 +6368,7 @@ export class Api extends HttpClient {
      */
     networkingLoopbackAddressDelete: (
       { path }: { path: NetworkingLoopbackAddressDeletePathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/networking/loopback-address/${path.rackId}/${path.switchLocation}/${path.address}/${path.subnetMask}`,
@@ -6381,7 +6381,7 @@ export class Api extends HttpClient {
      */
     networkingSwitchPortSettingsList: (
       { query = {} }: { query?: NetworkingSwitchPortSettingsListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SwitchPortSettingsResultsPage>({
         path: `/v1/system/networking/switch-port-settings`,
@@ -6395,7 +6395,7 @@ export class Api extends HttpClient {
      */
     networkingSwitchPortSettingsCreate: (
       { body }: { body: SwitchPortSettingsCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SwitchPortSettingsView>({
         path: `/v1/system/networking/switch-port-settings`,
@@ -6409,7 +6409,7 @@ export class Api extends HttpClient {
      */
     networkingSwitchPortSettingsDelete: (
       { query = {} }: { query?: NetworkingSwitchPortSettingsDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/networking/switch-port-settings`,
@@ -6423,7 +6423,7 @@ export class Api extends HttpClient {
      */
     networkingSwitchPortSettingsView: (
       { path }: { path: NetworkingSwitchPortSettingsViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SwitchPortSettingsView>({
         path: `/v1/system/networking/switch-port-settings/${path.port}`,
@@ -6446,7 +6446,7 @@ export class Api extends HttpClient {
      */
     systemPolicyUpdate: (
       { body }: { body: FleetRolePolicy },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<FleetRolePolicy>({
         path: `/v1/system/policy`,
@@ -6460,7 +6460,7 @@ export class Api extends HttpClient {
      */
     roleList: (
       { query = {} }: { query?: RoleListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<RoleResultsPage>({
         path: `/v1/system/roles`,
@@ -6474,7 +6474,7 @@ export class Api extends HttpClient {
      */
     roleView: (
       { path }: { path: RoleViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Role>({
         path: `/v1/system/roles/${path.roleName}`,
@@ -6487,7 +6487,7 @@ export class Api extends HttpClient {
      */
     systemQuotasList: (
       { query = {} }: { query?: SystemQuotasListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloQuotasResultsPage>({
         path: `/v1/system/silo-quotas`,
@@ -6501,7 +6501,7 @@ export class Api extends HttpClient {
      */
     siloList: (
       { query = {} }: { query?: SiloListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloResultsPage>({
         path: `/v1/system/silos`,
@@ -6526,7 +6526,7 @@ export class Api extends HttpClient {
      */
     siloView: (
       { path }: { path: SiloViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Silo>({
         path: `/v1/system/silos/${path.silo}`,
@@ -6539,7 +6539,7 @@ export class Api extends HttpClient {
      */
     siloDelete: (
       { path }: { path: SiloDeletePathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/system/silos/${path.silo}`,
@@ -6555,7 +6555,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: SiloIpPoolListPathParams; query?: SiloIpPoolListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloIpPoolResultsPage>({
         path: `/v1/system/silos/${path.silo}/ip-pools`,
@@ -6569,7 +6569,7 @@ export class Api extends HttpClient {
      */
     siloPolicyView: (
       { path }: { path: SiloPolicyViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloRolePolicy>({
         path: `/v1/system/silos/${path.silo}/policy`,
@@ -6585,7 +6585,7 @@ export class Api extends HttpClient {
         path,
         body,
       }: { path: SiloPolicyUpdatePathParams; body: SiloRolePolicy },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloRolePolicy>({
         path: `/v1/system/silos/${path.silo}/policy`,
@@ -6599,7 +6599,7 @@ export class Api extends HttpClient {
      */
     siloQuotasView: (
       { path }: { path: SiloQuotasViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloQuotas>({
         path: `/v1/system/silos/${path.silo}/quotas`,
@@ -6615,7 +6615,7 @@ export class Api extends HttpClient {
         path,
         body,
       }: { path: SiloQuotasUpdatePathParams; body: SiloQuotasUpdate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloQuotas>({
         path: `/v1/system/silos/${path.silo}/quotas`,
@@ -6629,7 +6629,7 @@ export class Api extends HttpClient {
      */
     siloUserList: (
       { query = {} }: { query?: SiloUserListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<UserResultsPage>({
         path: `/v1/system/users`,
@@ -6646,7 +6646,7 @@ export class Api extends HttpClient {
         path,
         query,
       }: { path: SiloUserViewPathParams; query?: SiloUserViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<User>({
         path: `/v1/system/users/${path.userId}`,
@@ -6660,7 +6660,7 @@ export class Api extends HttpClient {
      */
     userBuiltinList: (
       { query = {} }: { query?: UserBuiltinListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<UserBuiltinResultsPage>({
         path: `/v1/system/users-builtin`,
@@ -6674,7 +6674,7 @@ export class Api extends HttpClient {
      */
     userBuiltinView: (
       { path }: { path: UserBuiltinViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<UserBuiltin>({
         path: `/v1/system/users-builtin/${path.user}`,
@@ -6687,7 +6687,7 @@ export class Api extends HttpClient {
      */
     siloUtilizationList: (
       { query = {} }: { query?: SiloUtilizationListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloUtilizationResultsPage>({
         path: `/v1/system/utilization/silos`,
@@ -6701,7 +6701,7 @@ export class Api extends HttpClient {
      */
     siloUtilizationView: (
       { path }: { path: SiloUtilizationViewPathParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<SiloUtilization>({
         path: `/v1/system/utilization/silos/${path.silo}`,
@@ -6714,7 +6714,7 @@ export class Api extends HttpClient {
      */
     userList: (
       { query = {} }: { query?: UserListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<UserResultsPage>({
         path: `/v1/users`,
@@ -6738,7 +6738,7 @@ export class Api extends HttpClient {
      */
     vpcFirewallRulesView: (
       { query }: { query?: VpcFirewallRulesViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<VpcFirewallRules>({
         path: `/v1/vpc-firewall-rules`,
@@ -6758,7 +6758,7 @@ export class Api extends HttpClient {
         query?: VpcFirewallRulesUpdateQueryParams;
         body: VpcFirewallRuleUpdateParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<VpcFirewallRules>({
         path: `/v1/vpc-firewall-rules`,
@@ -6773,7 +6773,7 @@ export class Api extends HttpClient {
      */
     vpcSubnetList: (
       { query = {} }: { query?: VpcSubnetListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<VpcSubnetResultsPage>({
         path: `/v1/vpc-subnets`,
@@ -6790,7 +6790,7 @@ export class Api extends HttpClient {
         query,
         body,
       }: { query?: VpcSubnetCreateQueryParams; body: VpcSubnetCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<VpcSubnet>({
         path: `/v1/vpc-subnets`,
@@ -6808,7 +6808,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: VpcSubnetViewPathParams; query?: VpcSubnetViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<VpcSubnet>({
         path: `/v1/vpc-subnets/${path.subnet}`,
@@ -6830,7 +6830,7 @@ export class Api extends HttpClient {
         query?: VpcSubnetUpdateQueryParams;
         body: VpcSubnetUpdate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<VpcSubnet>({
         path: `/v1/vpc-subnets/${path.subnet}`,
@@ -6851,7 +6851,7 @@ export class Api extends HttpClient {
         path: VpcSubnetDeletePathParams;
         query?: VpcSubnetDeleteQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/vpc-subnets/${path.subnet}`,
@@ -6871,7 +6871,7 @@ export class Api extends HttpClient {
         path: VpcSubnetListNetworkInterfacesPathParams;
         query?: VpcSubnetListNetworkInterfacesQueryParams;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<InstanceNetworkInterfaceResultsPage>({
         path: `/v1/vpc-subnets/${path.subnet}/network-interfaces`,
@@ -6885,7 +6885,7 @@ export class Api extends HttpClient {
      */
     vpcList: (
       { query = {} }: { query?: VpcListQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<VpcResultsPage>({
         path: `/v1/vpcs`,
@@ -6899,7 +6899,7 @@ export class Api extends HttpClient {
      */
     vpcCreate: (
       { query, body }: { query?: VpcCreateQueryParams; body: VpcCreate },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Vpc>({
         path: `/v1/vpcs`,
@@ -6917,7 +6917,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: VpcViewPathParams; query?: VpcViewQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Vpc>({
         path: `/v1/vpcs/${path.vpc}`,
@@ -6939,7 +6939,7 @@ export class Api extends HttpClient {
         query?: VpcUpdateQueryParams;
         body: VpcUpdate;
       },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<Vpc>({
         path: `/v1/vpcs/${path.vpc}`,
@@ -6957,7 +6957,7 @@ export class Api extends HttpClient {
         path,
         query = {},
       }: { path: VpcDeletePathParams; query?: VpcDeleteQueryParams },
-      params: FetchParams = {}
+      params: FetchParams = {},
     ) => {
       return this.request<void>({
         path: `/v1/vpcs/${path.vpc}`,
@@ -6985,7 +6985,7 @@ export class Api extends HttpClient {
       const protocol = secure ? "wss:" : "ws:";
       const route = `/v1/instances/${path.instance}/serial-console/stream`;
       return new WebSocket(
-        protocol + "//" + host + route + toQueryString(query)
+        protocol + "//" + host + route + toQueryString(query),
       );
     },
   };
diff --git a/static/http-client.ts b/oxide-api/src/http-client.ts
similarity index 98%
rename from static/http-client.ts
rename to oxide-api/src/http-client.ts
index 4cf3a72..b820c3b 100644
--- a/static/http-client.ts
+++ b/oxide-api/src/http-client.ts
@@ -56,12 +56,12 @@ function replacer(_key: string, value: any) {
 
 function encodeQueryParam(key: string, value: unknown) {
   return `${encodeURIComponent(camelToSnake(key))}=${encodeURIComponent(
-    replacer(key, value)
+    replacer(key, value),
   )}`;
 }
 
 export async function handleResponse<Data>(
-  response: Response
+  response: Response,
 ): Promise<ApiResult<Data>> {
   const respText = await response.text();
 
@@ -176,7 +176,7 @@ export function toQueryString(rawQuery?: QueryParams): string {
     .map(([key, value]) =>
       Array.isArray(value)
         ? value.map((item) => encodeQueryParam(key, item)).join("&")
-        : encodeQueryParam(key, value)
+        : encodeQueryParam(key, value),
     )
     .join("&");
   return qs ? "?" + qs : "";
diff --git a/client/msw-handlers.ts b/oxide-api/src/msw-handlers.ts
similarity index 93%
rename from client/msw-handlers.ts
rename to oxide-api/src/msw-handlers.ts
index f3801c1..5de6227 100644
--- a/client/msw-handlers.ts
+++ b/oxide-api/src/msw-handlers.ts
@@ -1204,7 +1204,7 @@ export interface MSWHandlers {
 function validateParams<S extends ZodSchema>(
   schema: S,
   req: Request,
-  pathParams: PathParams
+  pathParams: PathParams,
 ) {
   const rawParams = new URLSearchParams(new URL(req.url).search);
   const params: [string, unknown][] = [];
@@ -1234,7 +1234,7 @@ const handler =
   (
     handler: MSWHandlers[keyof MSWHandlers],
     paramSchema: ZodSchema | null,
-    bodySchema: ZodSchema | null
+    bodySchema: ZodSchema | null,
   ) =>
   async ({
     request: req,
@@ -1300,323 +1300,335 @@ export function makeHandlers(handlers: MSWHandlers): HttpHandler[] {
   return [
     http.post(
       "/device/auth",
-      handler(handlers["deviceAuthRequest"], null, null)
+      handler(handlers["deviceAuthRequest"], null, null),
     ),
     http.post(
       "/device/confirm",
-      handler(handlers["deviceAuthConfirm"], null, schema.DeviceAuthVerify)
+      handler(handlers["deviceAuthConfirm"], null, schema.DeviceAuthVerify),
     ),
     http.post(
       "/device/token",
-      handler(handlers["deviceAccessToken"], null, null)
+      handler(handlers["deviceAccessToken"], null, null),
     ),
     http.get(
       "/experimental/v1/probes",
-      handler(handlers["probeList"], schema.ProbeListParams, null)
+      handler(handlers["probeList"], schema.ProbeListParams, null),
     ),
     http.post(
       "/experimental/v1/probes",
       handler(
         handlers["probeCreate"],
         schema.ProbeCreateParams,
-        schema.ProbeCreate
-      )
+        schema.ProbeCreate,
+      ),
     ),
     http.get(
       "/experimental/v1/probes/:probe",
-      handler(handlers["probeView"], schema.ProbeViewParams, null)
+      handler(handlers["probeView"], schema.ProbeViewParams, null),
     ),
     http.delete(
       "/experimental/v1/probes/:probe",
-      handler(handlers["probeDelete"], schema.ProbeDeleteParams, null)
+      handler(handlers["probeDelete"], schema.ProbeDeleteParams, null),
     ),
     http.post(
       "/login/:siloName/saml/:providerName",
-      handler(handlers["loginSaml"], schema.LoginSamlParams, null)
+      handler(handlers["loginSaml"], schema.LoginSamlParams, null),
     ),
     http.get(
       "/v1/certificates",
-      handler(handlers["certificateList"], schema.CertificateListParams, null)
+      handler(handlers["certificateList"], schema.CertificateListParams, null),
     ),
     http.post(
       "/v1/certificates",
-      handler(handlers["certificateCreate"], null, schema.CertificateCreate)
+      handler(handlers["certificateCreate"], null, schema.CertificateCreate),
     ),
     http.get(
       "/v1/certificates/:certificate",
-      handler(handlers["certificateView"], schema.CertificateViewParams, null)
+      handler(handlers["certificateView"], schema.CertificateViewParams, null),
     ),
     http.delete(
       "/v1/certificates/:certificate",
       handler(
         handlers["certificateDelete"],
         schema.CertificateDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/disks",
-      handler(handlers["diskList"], schema.DiskListParams, null)
+      handler(handlers["diskList"], schema.DiskListParams, null),
     ),
     http.post(
       "/v1/disks",
       handler(
         handlers["diskCreate"],
         schema.DiskCreateParams,
-        schema.DiskCreate
-      )
+        schema.DiskCreate,
+      ),
     ),
     http.get(
       "/v1/disks/:disk",
-      handler(handlers["diskView"], schema.DiskViewParams, null)
+      handler(handlers["diskView"], schema.DiskViewParams, null),
     ),
     http.delete(
       "/v1/disks/:disk",
-      handler(handlers["diskDelete"], schema.DiskDeleteParams, null)
+      handler(handlers["diskDelete"], schema.DiskDeleteParams, null),
     ),
     http.post(
       "/v1/disks/:disk/bulk-write",
       handler(
         handlers["diskBulkWriteImport"],
         schema.DiskBulkWriteImportParams,
-        schema.ImportBlocksBulkWrite
-      )
+        schema.ImportBlocksBulkWrite,
+      ),
     ),
     http.post(
       "/v1/disks/:disk/bulk-write-start",
       handler(
         handlers["diskBulkWriteImportStart"],
         schema.DiskBulkWriteImportStartParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/disks/:disk/bulk-write-stop",
       handler(
         handlers["diskBulkWriteImportStop"],
         schema.DiskBulkWriteImportStopParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/disks/:disk/finalize",
       handler(
         handlers["diskFinalizeImport"],
         schema.DiskFinalizeImportParams,
-        schema.FinalizeDisk
-      )
+        schema.FinalizeDisk,
+      ),
     ),
     http.get(
       "/v1/disks/:disk/metrics/:metric",
-      handler(handlers["diskMetricsList"], schema.DiskMetricsListParams, null)
+      handler(handlers["diskMetricsList"], schema.DiskMetricsListParams, null),
     ),
     http.get(
       "/v1/floating-ips",
-      handler(handlers["floatingIpList"], schema.FloatingIpListParams, null)
+      handler(handlers["floatingIpList"], schema.FloatingIpListParams, null),
     ),
     http.post(
       "/v1/floating-ips",
       handler(
         handlers["floatingIpCreate"],
         schema.FloatingIpCreateParams,
-        schema.FloatingIpCreate
-      )
+        schema.FloatingIpCreate,
+      ),
     ),
     http.get(
       "/v1/floating-ips/:floatingIp",
-      handler(handlers["floatingIpView"], schema.FloatingIpViewParams, null)
+      handler(handlers["floatingIpView"], schema.FloatingIpViewParams, null),
     ),
     http.put(
       "/v1/floating-ips/:floatingIp",
       handler(
         handlers["floatingIpUpdate"],
         schema.FloatingIpUpdateParams,
-        schema.FloatingIpUpdate
-      )
+        schema.FloatingIpUpdate,
+      ),
     ),
     http.delete(
       "/v1/floating-ips/:floatingIp",
-      handler(handlers["floatingIpDelete"], schema.FloatingIpDeleteParams, null)
+      handler(
+        handlers["floatingIpDelete"],
+        schema.FloatingIpDeleteParams,
+        null,
+      ),
     ),
     http.post(
       "/v1/floating-ips/:floatingIp/attach",
       handler(
         handlers["floatingIpAttach"],
         schema.FloatingIpAttachParams,
-        schema.FloatingIpAttach
-      )
+        schema.FloatingIpAttach,
+      ),
     ),
     http.post(
       "/v1/floating-ips/:floatingIp/detach",
-      handler(handlers["floatingIpDetach"], schema.FloatingIpDetachParams, null)
+      handler(
+        handlers["floatingIpDetach"],
+        schema.FloatingIpDetachParams,
+        null,
+      ),
     ),
     http.get(
       "/v1/groups",
-      handler(handlers["groupList"], schema.GroupListParams, null)
+      handler(handlers["groupList"], schema.GroupListParams, null),
     ),
     http.get(
       "/v1/groups/:groupId",
-      handler(handlers["groupView"], schema.GroupViewParams, null)
+      handler(handlers["groupView"], schema.GroupViewParams, null),
     ),
     http.get(
       "/v1/images",
-      handler(handlers["imageList"], schema.ImageListParams, null)
+      handler(handlers["imageList"], schema.ImageListParams, null),
     ),
     http.post(
       "/v1/images",
       handler(
         handlers["imageCreate"],
         schema.ImageCreateParams,
-        schema.ImageCreate
-      )
+        schema.ImageCreate,
+      ),
     ),
     http.get(
       "/v1/images/:image",
-      handler(handlers["imageView"], schema.ImageViewParams, null)
+      handler(handlers["imageView"], schema.ImageViewParams, null),
     ),
     http.delete(
       "/v1/images/:image",
-      handler(handlers["imageDelete"], schema.ImageDeleteParams, null)
+      handler(handlers["imageDelete"], schema.ImageDeleteParams, null),
     ),
     http.post(
       "/v1/images/:image/demote",
-      handler(handlers["imageDemote"], schema.ImageDemoteParams, null)
+      handler(handlers["imageDemote"], schema.ImageDemoteParams, null),
     ),
     http.post(
       "/v1/images/:image/promote",
-      handler(handlers["imagePromote"], schema.ImagePromoteParams, null)
+      handler(handlers["imagePromote"], schema.ImagePromoteParams, null),
     ),
     http.get(
       "/v1/instances",
-      handler(handlers["instanceList"], schema.InstanceListParams, null)
+      handler(handlers["instanceList"], schema.InstanceListParams, null),
     ),
     http.post(
       "/v1/instances",
       handler(
         handlers["instanceCreate"],
         schema.InstanceCreateParams,
-        schema.InstanceCreate
-      )
+        schema.InstanceCreate,
+      ),
     ),
     http.get(
       "/v1/instances/:instance",
-      handler(handlers["instanceView"], schema.InstanceViewParams, null)
+      handler(handlers["instanceView"], schema.InstanceViewParams, null),
     ),
     http.delete(
       "/v1/instances/:instance",
-      handler(handlers["instanceDelete"], schema.InstanceDeleteParams, null)
+      handler(handlers["instanceDelete"], schema.InstanceDeleteParams, null),
     ),
     http.get(
       "/v1/instances/:instance/disks",
-      handler(handlers["instanceDiskList"], schema.InstanceDiskListParams, null)
+      handler(
+        handlers["instanceDiskList"],
+        schema.InstanceDiskListParams,
+        null,
+      ),
     ),
     http.post(
       "/v1/instances/:instance/disks/attach",
       handler(
         handlers["instanceDiskAttach"],
         schema.InstanceDiskAttachParams,
-        schema.DiskPath
-      )
+        schema.DiskPath,
+      ),
     ),
     http.post(
       "/v1/instances/:instance/disks/detach",
       handler(
         handlers["instanceDiskDetach"],
         schema.InstanceDiskDetachParams,
-        schema.DiskPath
-      )
+        schema.DiskPath,
+      ),
     ),
     http.get(
       "/v1/instances/:instance/external-ips",
       handler(
         handlers["instanceExternalIpList"],
         schema.InstanceExternalIpListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/instances/:instance/external-ips/ephemeral",
       handler(
         handlers["instanceEphemeralIpAttach"],
         schema.InstanceEphemeralIpAttachParams,
-        schema.EphemeralIpCreate
-      )
+        schema.EphemeralIpCreate,
+      ),
     ),
     http.delete(
       "/v1/instances/:instance/external-ips/ephemeral",
       handler(
         handlers["instanceEphemeralIpDetach"],
         schema.InstanceEphemeralIpDetachParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/instances/:instance/migrate",
       handler(
         handlers["instanceMigrate"],
         schema.InstanceMigrateParams,
-        schema.InstanceMigrate
-      )
+        schema.InstanceMigrate,
+      ),
     ),
     http.post(
       "/v1/instances/:instance/reboot",
-      handler(handlers["instanceReboot"], schema.InstanceRebootParams, null)
+      handler(handlers["instanceReboot"], schema.InstanceRebootParams, null),
     ),
     http.get(
       "/v1/instances/:instance/serial-console",
       handler(
         handlers["instanceSerialConsole"],
         schema.InstanceSerialConsoleParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/instances/:instance/serial-console/stream",
       handler(
         handlers["instanceSerialConsoleStream"],
         schema.InstanceSerialConsoleStreamParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/instances/:instance/ssh-public-keys",
       handler(
         handlers["instanceSshPublicKeyList"],
         schema.InstanceSshPublicKeyListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/instances/:instance/start",
-      handler(handlers["instanceStart"], schema.InstanceStartParams, null)
+      handler(handlers["instanceStart"], schema.InstanceStartParams, null),
     ),
     http.post(
       "/v1/instances/:instance/stop",
-      handler(handlers["instanceStop"], schema.InstanceStopParams, null)
+      handler(handlers["instanceStop"], schema.InstanceStopParams, null),
     ),
     http.get(
       "/v1/ip-pools",
       handler(
         handlers["projectIpPoolList"],
         schema.ProjectIpPoolListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/ip-pools/:pool",
       handler(
         handlers["projectIpPoolView"],
         schema.ProjectIpPoolViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/login/:siloName/local",
       handler(
         handlers["loginLocal"],
         schema.LoginLocalParams,
-        schema.UsernamePasswordCredentials
-      )
+        schema.UsernamePasswordCredentials,
+      ),
     ),
     http.post("/v1/logout", handler(handlers["logout"], null, null)),
     http.get("/v1/me", handler(handlers["currentUserView"], null, null)),
@@ -1625,706 +1637,722 @@ export function makeHandlers(handlers: MSWHandlers): HttpHandler[] {
       handler(
         handlers["currentUserGroups"],
         schema.CurrentUserGroupsParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/me/ssh-keys",
       handler(
         handlers["currentUserSshKeyList"],
         schema.CurrentUserSshKeyListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/me/ssh-keys",
-      handler(handlers["currentUserSshKeyCreate"], null, schema.SshKeyCreate)
+      handler(handlers["currentUserSshKeyCreate"], null, schema.SshKeyCreate),
     ),
     http.get(
       "/v1/me/ssh-keys/:sshKey",
       handler(
         handlers["currentUserSshKeyView"],
         schema.CurrentUserSshKeyViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.delete(
       "/v1/me/ssh-keys/:sshKey",
       handler(
         handlers["currentUserSshKeyDelete"],
         schema.CurrentUserSshKeyDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/metrics/:metricName",
-      handler(handlers["siloMetric"], schema.SiloMetricParams, null)
+      handler(handlers["siloMetric"], schema.SiloMetricParams, null),
     ),
     http.get(
       "/v1/network-interfaces",
       handler(
         handlers["instanceNetworkInterfaceList"],
         schema.InstanceNetworkInterfaceListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/network-interfaces",
       handler(
         handlers["instanceNetworkInterfaceCreate"],
         schema.InstanceNetworkInterfaceCreateParams,
-        schema.InstanceNetworkInterfaceCreate
-      )
+        schema.InstanceNetworkInterfaceCreate,
+      ),
     ),
     http.get(
       "/v1/network-interfaces/:interface",
       handler(
         handlers["instanceNetworkInterfaceView"],
         schema.InstanceNetworkInterfaceViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.put(
       "/v1/network-interfaces/:interface",
       handler(
         handlers["instanceNetworkInterfaceUpdate"],
         schema.InstanceNetworkInterfaceUpdateParams,
-        schema.InstanceNetworkInterfaceUpdate
-      )
+        schema.InstanceNetworkInterfaceUpdate,
+      ),
     ),
     http.delete(
       "/v1/network-interfaces/:interface",
       handler(
         handlers["instanceNetworkInterfaceDelete"],
         schema.InstanceNetworkInterfaceDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get("/v1/ping", handler(handlers["ping"], null, null)),
     http.get("/v1/policy", handler(handlers["policyView"], null, null)),
     http.put(
       "/v1/policy",
-      handler(handlers["policyUpdate"], null, schema.SiloRolePolicy)
+      handler(handlers["policyUpdate"], null, schema.SiloRolePolicy),
     ),
     http.get(
       "/v1/projects",
-      handler(handlers["projectList"], schema.ProjectListParams, null)
+      handler(handlers["projectList"], schema.ProjectListParams, null),
     ),
     http.post(
       "/v1/projects",
-      handler(handlers["projectCreate"], null, schema.ProjectCreate)
+      handler(handlers["projectCreate"], null, schema.ProjectCreate),
     ),
     http.get(
       "/v1/projects/:project",
-      handler(handlers["projectView"], schema.ProjectViewParams, null)
+      handler(handlers["projectView"], schema.ProjectViewParams, null),
     ),
     http.put(
       "/v1/projects/:project",
       handler(
         handlers["projectUpdate"],
         schema.ProjectUpdateParams,
-        schema.ProjectUpdate
-      )
+        schema.ProjectUpdate,
+      ),
     ),
     http.delete(
       "/v1/projects/:project",
-      handler(handlers["projectDelete"], schema.ProjectDeleteParams, null)
+      handler(handlers["projectDelete"], schema.ProjectDeleteParams, null),
     ),
     http.get(
       "/v1/projects/:project/policy",
       handler(
         handlers["projectPolicyView"],
         schema.ProjectPolicyViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.put(
       "/v1/projects/:project/policy",
       handler(
         handlers["projectPolicyUpdate"],
         schema.ProjectPolicyUpdateParams,
-        schema.ProjectRolePolicy
-      )
+        schema.ProjectRolePolicy,
+      ),
     ),
     http.get(
       "/v1/snapshots",
-      handler(handlers["snapshotList"], schema.SnapshotListParams, null)
+      handler(handlers["snapshotList"], schema.SnapshotListParams, null),
     ),
     http.post(
       "/v1/snapshots",
       handler(
         handlers["snapshotCreate"],
         schema.SnapshotCreateParams,
-        schema.SnapshotCreate
-      )
+        schema.SnapshotCreate,
+      ),
     ),
     http.get(
       "/v1/snapshots/:snapshot",
-      handler(handlers["snapshotView"], schema.SnapshotViewParams, null)
+      handler(handlers["snapshotView"], schema.SnapshotViewParams, null),
     ),
     http.delete(
       "/v1/snapshots/:snapshot",
-      handler(handlers["snapshotDelete"], schema.SnapshotDeleteParams, null)
+      handler(handlers["snapshotDelete"], schema.SnapshotDeleteParams, null),
     ),
     http.get(
       "/v1/system/hardware/disks",
-      handler(handlers["physicalDiskList"], schema.PhysicalDiskListParams, null)
+      handler(
+        handlers["physicalDiskList"],
+        schema.PhysicalDiskListParams,
+        null,
+      ),
     ),
     http.get(
       "/v1/system/hardware/racks",
-      handler(handlers["rackList"], schema.RackListParams, null)
+      handler(handlers["rackList"], schema.RackListParams, null),
     ),
     http.get(
       "/v1/system/hardware/racks/:rackId",
-      handler(handlers["rackView"], schema.RackViewParams, null)
+      handler(handlers["rackView"], schema.RackViewParams, null),
     ),
     http.get(
       "/v1/system/hardware/sleds",
-      handler(handlers["sledList"], schema.SledListParams, null)
+      handler(handlers["sledList"], schema.SledListParams, null),
     ),
     http.post(
       "/v1/system/hardware/sleds",
-      handler(handlers["sledAdd"], null, schema.UninitializedSledId)
+      handler(handlers["sledAdd"], null, schema.UninitializedSledId),
     ),
     http.get(
       "/v1/system/hardware/sleds/:sledId",
-      handler(handlers["sledView"], schema.SledViewParams, null)
+      handler(handlers["sledView"], schema.SledViewParams, null),
     ),
     http.get(
       "/v1/system/hardware/sleds/:sledId/disks",
       handler(
         handlers["sledPhysicalDiskList"],
         schema.SledPhysicalDiskListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/hardware/sleds/:sledId/instances",
-      handler(handlers["sledInstanceList"], schema.SledInstanceListParams, null)
+      handler(
+        handlers["sledInstanceList"],
+        schema.SledInstanceListParams,
+        null,
+      ),
     ),
     http.put(
       "/v1/system/hardware/sleds/:sledId/provision-policy",
       handler(
         handlers["sledSetProvisionPolicy"],
         schema.SledSetProvisionPolicyParams,
-        schema.SledProvisionPolicyParams
-      )
+        schema.SledProvisionPolicyParams,
+      ),
     ),
     http.get(
       "/v1/system/hardware/sleds-uninitialized",
       handler(
         handlers["sledListUninitialized"],
         schema.SledListUninitializedParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/hardware/switch-port",
       handler(
         handlers["networkingSwitchPortList"],
         schema.NetworkingSwitchPortListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/hardware/switch-port/:port/settings",
       handler(
         handlers["networkingSwitchPortApplySettings"],
         schema.NetworkingSwitchPortApplySettingsParams,
-        schema.SwitchPortApplySettings
-      )
+        schema.SwitchPortApplySettings,
+      ),
     ),
     http.delete(
       "/v1/system/hardware/switch-port/:port/settings",
       handler(
         handlers["networkingSwitchPortClearSettings"],
         schema.NetworkingSwitchPortClearSettingsParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/hardware/switches",
-      handler(handlers["switchList"], schema.SwitchListParams, null)
+      handler(handlers["switchList"], schema.SwitchListParams, null),
     ),
     http.get(
       "/v1/system/hardware/switches/:switchId",
-      handler(handlers["switchView"], schema.SwitchViewParams, null)
+      handler(handlers["switchView"], schema.SwitchViewParams, null),
     ),
     http.get(
       "/v1/system/identity-providers",
       handler(
         handlers["siloIdentityProviderList"],
         schema.SiloIdentityProviderListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/identity-providers/local/users",
       handler(
         handlers["localIdpUserCreate"],
         schema.LocalIdpUserCreateParams,
-        schema.UserCreate
-      )
+        schema.UserCreate,
+      ),
     ),
     http.delete(
       "/v1/system/identity-providers/local/users/:userId",
       handler(
         handlers["localIdpUserDelete"],
         schema.LocalIdpUserDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/identity-providers/local/users/:userId/set-password",
       handler(
         handlers["localIdpUserSetPassword"],
         schema.LocalIdpUserSetPasswordParams,
-        schema.UserPassword
-      )
+        schema.UserPassword,
+      ),
     ),
     http.post(
       "/v1/system/identity-providers/saml",
       handler(
         handlers["samlIdentityProviderCreate"],
         schema.SamlIdentityProviderCreateParams,
-        schema.SamlIdentityProviderCreate
-      )
+        schema.SamlIdentityProviderCreate,
+      ),
     ),
     http.get(
       "/v1/system/identity-providers/saml/:provider",
       handler(
         handlers["samlIdentityProviderView"],
         schema.SamlIdentityProviderViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/ip-pools",
-      handler(handlers["ipPoolList"], schema.IpPoolListParams, null)
+      handler(handlers["ipPoolList"], schema.IpPoolListParams, null),
     ),
     http.post(
       "/v1/system/ip-pools",
-      handler(handlers["ipPoolCreate"], null, schema.IpPoolCreate)
+      handler(handlers["ipPoolCreate"], null, schema.IpPoolCreate),
     ),
     http.get(
       "/v1/system/ip-pools/:pool",
-      handler(handlers["ipPoolView"], schema.IpPoolViewParams, null)
+      handler(handlers["ipPoolView"], schema.IpPoolViewParams, null),
     ),
     http.put(
       "/v1/system/ip-pools/:pool",
       handler(
         handlers["ipPoolUpdate"],
         schema.IpPoolUpdateParams,
-        schema.IpPoolUpdate
-      )
+        schema.IpPoolUpdate,
+      ),
     ),
     http.delete(
       "/v1/system/ip-pools/:pool",
-      handler(handlers["ipPoolDelete"], schema.IpPoolDeleteParams, null)
+      handler(handlers["ipPoolDelete"], schema.IpPoolDeleteParams, null),
     ),
     http.get(
       "/v1/system/ip-pools/:pool/ranges",
-      handler(handlers["ipPoolRangeList"], schema.IpPoolRangeListParams, null)
+      handler(handlers["ipPoolRangeList"], schema.IpPoolRangeListParams, null),
     ),
     http.post(
       "/v1/system/ip-pools/:pool/ranges/add",
       handler(
         handlers["ipPoolRangeAdd"],
         schema.IpPoolRangeAddParams,
-        schema.IpRange
-      )
+        schema.IpRange,
+      ),
     ),
     http.post(
       "/v1/system/ip-pools/:pool/ranges/remove",
       handler(
         handlers["ipPoolRangeRemove"],
         schema.IpPoolRangeRemoveParams,
-        schema.IpRange
-      )
+        schema.IpRange,
+      ),
     ),
     http.get(
       "/v1/system/ip-pools/:pool/silos",
-      handler(handlers["ipPoolSiloList"], schema.IpPoolSiloListParams, null)
+      handler(handlers["ipPoolSiloList"], schema.IpPoolSiloListParams, null),
     ),
     http.post(
       "/v1/system/ip-pools/:pool/silos",
       handler(
         handlers["ipPoolSiloLink"],
         schema.IpPoolSiloLinkParams,
-        schema.IpPoolLinkSilo
-      )
+        schema.IpPoolLinkSilo,
+      ),
     ),
     http.put(
       "/v1/system/ip-pools/:pool/silos/:silo",
       handler(
         handlers["ipPoolSiloUpdate"],
         schema.IpPoolSiloUpdateParams,
-        schema.IpPoolSiloUpdate
-      )
+        schema.IpPoolSiloUpdate,
+      ),
     ),
     http.delete(
       "/v1/system/ip-pools/:pool/silos/:silo",
-      handler(handlers["ipPoolSiloUnlink"], schema.IpPoolSiloUnlinkParams, null)
+      handler(
+        handlers["ipPoolSiloUnlink"],
+        schema.IpPoolSiloUnlinkParams,
+        null,
+      ),
     ),
     http.get(
       "/v1/system/ip-pools-service",
-      handler(handlers["ipPoolServiceView"], null, null)
+      handler(handlers["ipPoolServiceView"], null, null),
     ),
     http.get(
       "/v1/system/ip-pools-service/ranges",
       handler(
         handlers["ipPoolServiceRangeList"],
         schema.IpPoolServiceRangeListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/ip-pools-service/ranges/add",
-      handler(handlers["ipPoolServiceRangeAdd"], null, schema.IpRange)
+      handler(handlers["ipPoolServiceRangeAdd"], null, schema.IpRange),
     ),
     http.post(
       "/v1/system/ip-pools-service/ranges/remove",
-      handler(handlers["ipPoolServiceRangeRemove"], null, schema.IpRange)
+      handler(handlers["ipPoolServiceRangeRemove"], null, schema.IpRange),
     ),
     http.get(
       "/v1/system/metrics/:metricName",
-      handler(handlers["systemMetric"], schema.SystemMetricParams, null)
+      handler(handlers["systemMetric"], schema.SystemMetricParams, null),
     ),
     http.get(
       "/v1/system/networking/address-lot",
       handler(
         handlers["networkingAddressLotList"],
         schema.NetworkingAddressLotListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/networking/address-lot",
       handler(
         handlers["networkingAddressLotCreate"],
         null,
-        schema.AddressLotCreate
-      )
+        schema.AddressLotCreate,
+      ),
     ),
     http.delete(
       "/v1/system/networking/address-lot/:addressLot",
       handler(
         handlers["networkingAddressLotDelete"],
         schema.NetworkingAddressLotDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/networking/address-lot/:addressLot/blocks",
       handler(
         handlers["networkingAddressLotBlockList"],
         schema.NetworkingAddressLotBlockListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/networking/bfd-disable",
-      handler(handlers["networkingBfdDisable"], null, schema.BfdSessionDisable)
+      handler(handlers["networkingBfdDisable"], null, schema.BfdSessionDisable),
     ),
     http.post(
       "/v1/system/networking/bfd-enable",
-      handler(handlers["networkingBfdEnable"], null, schema.BfdSessionEnable)
+      handler(handlers["networkingBfdEnable"], null, schema.BfdSessionEnable),
     ),
     http.get(
       "/v1/system/networking/bfd-status",
-      handler(handlers["networkingBfdStatus"], null, null)
+      handler(handlers["networkingBfdStatus"], null, null),
     ),
     http.get(
       "/v1/system/networking/bgp",
       handler(
         handlers["networkingBgpConfigList"],
         schema.NetworkingBgpConfigListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/networking/bgp",
       handler(
         handlers["networkingBgpConfigCreate"],
         null,
-        schema.BgpConfigCreate
-      )
+        schema.BgpConfigCreate,
+      ),
     ),
     http.delete(
       "/v1/system/networking/bgp",
       handler(
         handlers["networkingBgpConfigDelete"],
         schema.NetworkingBgpConfigDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/networking/bgp-announce",
       handler(
         handlers["networkingBgpAnnounceSetList"],
         schema.NetworkingBgpAnnounceSetListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/networking/bgp-announce",
       handler(
         handlers["networkingBgpAnnounceSetCreate"],
         null,
-        schema.BgpAnnounceSetCreate
-      )
+        schema.BgpAnnounceSetCreate,
+      ),
     ),
     http.delete(
       "/v1/system/networking/bgp-announce",
       handler(
         handlers["networkingBgpAnnounceSetDelete"],
         schema.NetworkingBgpAnnounceSetDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/networking/bgp-routes-ipv4",
       handler(
         handlers["networkingBgpImportedRoutesIpv4"],
         schema.NetworkingBgpImportedRoutesIpv4Params,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/networking/bgp-status",
-      handler(handlers["networkingBgpStatus"], null, null)
+      handler(handlers["networkingBgpStatus"], null, null),
     ),
     http.get(
       "/v1/system/networking/loopback-address",
       handler(
         handlers["networkingLoopbackAddressList"],
         schema.NetworkingLoopbackAddressListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/networking/loopback-address",
       handler(
         handlers["networkingLoopbackAddressCreate"],
         null,
-        schema.LoopbackAddressCreate
-      )
+        schema.LoopbackAddressCreate,
+      ),
     ),
     http.delete(
       "/v1/system/networking/loopback-address/:rackId/:switchLocation/:address/:subnetMask",
       handler(
         handlers["networkingLoopbackAddressDelete"],
         schema.NetworkingLoopbackAddressDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/networking/switch-port-settings",
       handler(
         handlers["networkingSwitchPortSettingsList"],
         schema.NetworkingSwitchPortSettingsListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.post(
       "/v1/system/networking/switch-port-settings",
       handler(
         handlers["networkingSwitchPortSettingsCreate"],
         null,
-        schema.SwitchPortSettingsCreate
-      )
+        schema.SwitchPortSettingsCreate,
+      ),
     ),
     http.delete(
       "/v1/system/networking/switch-port-settings",
       handler(
         handlers["networkingSwitchPortSettingsDelete"],
         schema.NetworkingSwitchPortSettingsDeleteParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/networking/switch-port-settings/:port",
       handler(
         handlers["networkingSwitchPortSettingsView"],
         schema.NetworkingSwitchPortSettingsViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/policy",
-      handler(handlers["systemPolicyView"], null, null)
+      handler(handlers["systemPolicyView"], null, null),
     ),
     http.put(
       "/v1/system/policy",
-      handler(handlers["systemPolicyUpdate"], null, schema.FleetRolePolicy)
+      handler(handlers["systemPolicyUpdate"], null, schema.FleetRolePolicy),
     ),
     http.get(
       "/v1/system/roles",
-      handler(handlers["roleList"], schema.RoleListParams, null)
+      handler(handlers["roleList"], schema.RoleListParams, null),
     ),
     http.get(
       "/v1/system/roles/:roleName",
-      handler(handlers["roleView"], schema.RoleViewParams, null)
+      handler(handlers["roleView"], schema.RoleViewParams, null),
     ),
     http.get(
       "/v1/system/silo-quotas",
-      handler(handlers["systemQuotasList"], schema.SystemQuotasListParams, null)
+      handler(
+        handlers["systemQuotasList"],
+        schema.SystemQuotasListParams,
+        null,
+      ),
     ),
     http.get(
       "/v1/system/silos",
-      handler(handlers["siloList"], schema.SiloListParams, null)
+      handler(handlers["siloList"], schema.SiloListParams, null),
     ),
     http.post(
       "/v1/system/silos",
-      handler(handlers["siloCreate"], null, schema.SiloCreate)
+      handler(handlers["siloCreate"], null, schema.SiloCreate),
     ),
     http.get(
       "/v1/system/silos/:silo",
-      handler(handlers["siloView"], schema.SiloViewParams, null)
+      handler(handlers["siloView"], schema.SiloViewParams, null),
     ),
     http.delete(
       "/v1/system/silos/:silo",
-      handler(handlers["siloDelete"], schema.SiloDeleteParams, null)
+      handler(handlers["siloDelete"], schema.SiloDeleteParams, null),
     ),
     http.get(
       "/v1/system/silos/:silo/ip-pools",
-      handler(handlers["siloIpPoolList"], schema.SiloIpPoolListParams, null)
+      handler(handlers["siloIpPoolList"], schema.SiloIpPoolListParams, null),
     ),
     http.get(
       "/v1/system/silos/:silo/policy",
-      handler(handlers["siloPolicyView"], schema.SiloPolicyViewParams, null)
+      handler(handlers["siloPolicyView"], schema.SiloPolicyViewParams, null),
     ),
     http.put(
       "/v1/system/silos/:silo/policy",
       handler(
         handlers["siloPolicyUpdate"],
         schema.SiloPolicyUpdateParams,
-        schema.SiloRolePolicy
-      )
+        schema.SiloRolePolicy,
+      ),
     ),
     http.get(
       "/v1/system/silos/:silo/quotas",
-      handler(handlers["siloQuotasView"], schema.SiloQuotasViewParams, null)
+      handler(handlers["siloQuotasView"], schema.SiloQuotasViewParams, null),
     ),
     http.put(
       "/v1/system/silos/:silo/quotas",
       handler(
         handlers["siloQuotasUpdate"],
         schema.SiloQuotasUpdateParams,
-        schema.SiloQuotasUpdate
-      )
+        schema.SiloQuotasUpdate,
+      ),
     ),
     http.get(
       "/v1/system/users",
-      handler(handlers["siloUserList"], schema.SiloUserListParams, null)
+      handler(handlers["siloUserList"], schema.SiloUserListParams, null),
     ),
     http.get(
       "/v1/system/users/:userId",
-      handler(handlers["siloUserView"], schema.SiloUserViewParams, null)
+      handler(handlers["siloUserView"], schema.SiloUserViewParams, null),
     ),
     http.get(
       "/v1/system/users-builtin",
-      handler(handlers["userBuiltinList"], schema.UserBuiltinListParams, null)
+      handler(handlers["userBuiltinList"], schema.UserBuiltinListParams, null),
     ),
     http.get(
       "/v1/system/users-builtin/:user",
-      handler(handlers["userBuiltinView"], schema.UserBuiltinViewParams, null)
+      handler(handlers["userBuiltinView"], schema.UserBuiltinViewParams, null),
     ),
     http.get(
       "/v1/system/utilization/silos",
       handler(
         handlers["siloUtilizationList"],
         schema.SiloUtilizationListParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/system/utilization/silos/:silo",
       handler(
         handlers["siloUtilizationView"],
         schema.SiloUtilizationViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/users",
-      handler(handlers["userList"], schema.UserListParams, null)
+      handler(handlers["userList"], schema.UserListParams, null),
     ),
     http.get(
       "/v1/utilization",
-      handler(handlers["utilizationView"], null, null)
+      handler(handlers["utilizationView"], null, null),
     ),
     http.get(
       "/v1/vpc-firewall-rules",
       handler(
         handlers["vpcFirewallRulesView"],
         schema.VpcFirewallRulesViewParams,
-        null
-      )
+        null,
+      ),
     ),
     http.put(
       "/v1/vpc-firewall-rules",
       handler(
         handlers["vpcFirewallRulesUpdate"],
         schema.VpcFirewallRulesUpdateParams,
-        schema.VpcFirewallRuleUpdateParams
-      )
+        schema.VpcFirewallRuleUpdateParams,
+      ),
     ),
     http.get(
       "/v1/vpc-subnets",
-      handler(handlers["vpcSubnetList"], schema.VpcSubnetListParams, null)
+      handler(handlers["vpcSubnetList"], schema.VpcSubnetListParams, null),
     ),
     http.post(
       "/v1/vpc-subnets",
       handler(
         handlers["vpcSubnetCreate"],
         schema.VpcSubnetCreateParams,
-        schema.VpcSubnetCreate
-      )
+        schema.VpcSubnetCreate,
+      ),
     ),
     http.get(
       "/v1/vpc-subnets/:subnet",
-      handler(handlers["vpcSubnetView"], schema.VpcSubnetViewParams, null)
+      handler(handlers["vpcSubnetView"], schema.VpcSubnetViewParams, null),
     ),
     http.put(
       "/v1/vpc-subnets/:subnet",
       handler(
         handlers["vpcSubnetUpdate"],
         schema.VpcSubnetUpdateParams,
-        schema.VpcSubnetUpdate
-      )
+        schema.VpcSubnetUpdate,
+      ),
     ),
     http.delete(
       "/v1/vpc-subnets/:subnet",
-      handler(handlers["vpcSubnetDelete"], schema.VpcSubnetDeleteParams, null)
+      handler(handlers["vpcSubnetDelete"], schema.VpcSubnetDeleteParams, null),
     ),
     http.get(
       "/v1/vpc-subnets/:subnet/network-interfaces",
       handler(
         handlers["vpcSubnetListNetworkInterfaces"],
         schema.VpcSubnetListNetworkInterfacesParams,
-        null
-      )
+        null,
+      ),
     ),
     http.get(
       "/v1/vpcs",
-      handler(handlers["vpcList"], schema.VpcListParams, null)
+      handler(handlers["vpcList"], schema.VpcListParams, null),
     ),
     http.post(
       "/v1/vpcs",
-      handler(handlers["vpcCreate"], schema.VpcCreateParams, schema.VpcCreate)
+      handler(handlers["vpcCreate"], schema.VpcCreateParams, schema.VpcCreate),
     ),
     http.get(
       "/v1/vpcs/:vpc",
-      handler(handlers["vpcView"], schema.VpcViewParams, null)
+      handler(handlers["vpcView"], schema.VpcViewParams, null),
     ),
     http.put(
       "/v1/vpcs/:vpc",
-      handler(handlers["vpcUpdate"], schema.VpcUpdateParams, schema.VpcUpdate)
+      handler(handlers["vpcUpdate"], schema.VpcUpdateParams, schema.VpcUpdate),
     ),
     http.delete(
       "/v1/vpcs/:vpc",
-      handler(handlers["vpcDelete"], schema.VpcDeleteParams, null)
+      handler(handlers["vpcDelete"], schema.VpcDeleteParams, null),
     ),
   ];
 }
diff --git a/client/type-test.ts b/oxide-api/src/type-test.ts
similarity index 100%
rename from client/type-test.ts
rename to oxide-api/src/type-test.ts
diff --git a/static/util.ts b/oxide-api/src/util.ts
similarity index 99%
rename from static/util.ts
rename to oxide-api/src/util.ts
index 21cf097..a4438bd 100644
--- a/static/util.ts
+++ b/oxide-api/src/util.ts
@@ -31,7 +31,7 @@ export const isObjectOrArray = (o: unknown) =>
 export const mapObj =
   (
     kf: (k: string) => string,
-    vf: (k: string | undefined, v: unknown) => unknown = (k, v) => v
+    vf: (k: string | undefined, v: unknown) => unknown = (k, v) => v,
   ) =>
   (o: unknown): unknown => {
     if (!isObjectOrArray(o)) return o;
diff --git a/client/validate.ts b/oxide-api/src/validate.ts
similarity index 94%
rename from client/validate.ts
rename to oxide-api/src/validate.ts
index e832055..bb4ad1f 100644
--- a/client/validate.ts
+++ b/oxide-api/src/validate.ts
@@ -24,7 +24,7 @@ const IntEnum = <T extends readonly number[]>(values: T) =>
 /** Helper to ensure booleans provided as strings end up with the correct value */
 const SafeBoolean = z.preprocess(
   (v) => (v === "false" ? false : v),
-  z.coerce.boolean()
+  z.coerce.boolean(),
 );
 
 /**
@@ -37,8 +37,8 @@ export const Ipv4Net = z.preprocess(
   z
     .string()
     .regex(
-      /^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\/([0-9]|1[0-9]|2[0-9]|3[0-2])$/
-    )
+      /^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\/([0-9]|1[0-9]|2[0-9]|3[0-2])$/,
+    ),
 );
 
 /**
@@ -51,13 +51,13 @@ export const Ipv6Net = z.preprocess(
   z
     .string()
     .regex(
-      /^([fF][dD])[0-9a-fA-F]{2}:(([0-9a-fA-F]{1,4}:){6}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,6}:)([0-9a-fA-F]{1,4})?\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])$/
-    )
+      /^([fF][dD])[0-9a-fA-F]{2}:(([0-9a-fA-F]{1,4}:){6}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,6}:)([0-9a-fA-F]{1,4})?\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])$/,
+    ),
 );
 
 export const IpNet = z.preprocess(
   processResponseBody,
-  z.union([Ipv4Net, Ipv6Net])
+  z.union([Ipv4Net, Ipv6Net]),
 );
 
 /**
@@ -72,13 +72,13 @@ export const Name = z.preprocess(
     .min(1)
     .max(63)
     .regex(
-      /^(?![0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)^[a-z]([a-zA-Z0-9-]*[a-zA-Z0-9]+)?$/
-    )
+      /^(?![0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)^[a-z]([a-zA-Z0-9-]*[a-zA-Z0-9]+)?$/,
+    ),
 );
 
 export const NameOrId = z.preprocess(
   processResponseBody,
-  z.union([z.string().uuid(), Name])
+  z.union([z.string().uuid(), Name]),
 );
 
 /**
@@ -86,7 +86,7 @@ export const NameOrId = z.preprocess(
  */
 export const Address = z.preprocess(
   processResponseBody,
-  z.object({ address: IpNet, addressLot: NameOrId })
+  z.object({ address: IpNet, addressLot: NameOrId }),
 );
 
 /**
@@ -94,7 +94,7 @@ export const Address = z.preprocess(
  */
 export const AddressConfig = z.preprocess(
   processResponseBody,
-  z.object({ addresses: Address.array() })
+  z.object({ addresses: Address.array() }),
 );
 
 /**
@@ -102,7 +102,7 @@ export const AddressConfig = z.preprocess(
  */
 export const AddressLotKind = z.preprocess(
   processResponseBody,
-  z.enum(["infra", "pool"])
+  z.enum(["infra", "pool"]),
 );
 
 /**
@@ -117,7 +117,7 @@ export const AddressLot = z.preprocess(
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -129,7 +129,7 @@ export const AddressLotBlock = z.preprocess(
     firstAddress: z.string().ip(),
     id: z.string().uuid(),
     lastAddress: z.string().ip(),
-  })
+  }),
 );
 
 /**
@@ -137,7 +137,7 @@ export const AddressLotBlock = z.preprocess(
  */
 export const AddressLotBlockCreate = z.preprocess(
   processResponseBody,
-  z.object({ firstAddress: z.string().ip(), lastAddress: z.string().ip() })
+  z.object({ firstAddress: z.string().ip(), lastAddress: z.string().ip() }),
 );
 
 /**
@@ -145,7 +145,7 @@ export const AddressLotBlockCreate = z.preprocess(
  */
 export const AddressLotBlockResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: AddressLotBlock.array(), nextPage: z.string().optional() })
+  z.object({ items: AddressLotBlock.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -158,7 +158,7 @@ export const AddressLotCreate = z.preprocess(
     description: z.string(),
     kind: AddressLotKind,
     name: Name,
-  })
+  }),
 );
 
 /**
@@ -166,7 +166,7 @@ export const AddressLotCreate = z.preprocess(
  */
 export const AddressLotCreateResponse = z.preprocess(
   processResponseBody,
-  z.object({ blocks: AddressLotBlock.array(), lot: AddressLot })
+  z.object({ blocks: AddressLotBlock.array(), lot: AddressLot }),
 );
 
 /**
@@ -174,7 +174,7 @@ export const AddressLotCreateResponse = z.preprocess(
  */
 export const AddressLotResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: AddressLot.array(), nextPage: z.string().optional() })
+  z.object({ items: AddressLot.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -182,12 +182,12 @@ export const AddressLotResultsPage = z.preprocess(
  */
 export const Baseboard = z.preprocess(
   processResponseBody,
-  z.object({ part: z.string(), revision: z.number(), serial: z.string() })
+  z.object({ part: z.string(), revision: z.number(), serial: z.string() }),
 );
 
 export const BfdMode = z.preprocess(
   processResponseBody,
-  z.enum(["single_hop", "multi_hop"])
+  z.enum(["single_hop", "multi_hop"]),
 );
 
 /**
@@ -195,7 +195,7 @@ export const BfdMode = z.preprocess(
  */
 export const BfdSessionDisable = z.preprocess(
   processResponseBody,
-  z.object({ remote: z.string().ip(), switch: Name })
+  z.object({ remote: z.string().ip(), switch: Name }),
 );
 
 /**
@@ -210,12 +210,12 @@ export const BfdSessionEnable = z.preprocess(
     remote: z.string().ip(),
     requiredRx: z.number().min(0),
     switch: Name,
-  })
+  }),
 );
 
 export const BfdState = z.preprocess(
   processResponseBody,
-  z.enum(["admin_down", "down", "init", "up"])
+  z.enum(["admin_down", "down", "init", "up"]),
 );
 
 export const BfdStatus = z.preprocess(
@@ -228,7 +228,7 @@ export const BfdStatus = z.preprocess(
     requiredRx: z.number().min(0),
     state: BfdState,
     switch: Name,
-  })
+  }),
 );
 
 /**
@@ -242,7 +242,7 @@ export const BgpAnnounceSet = z.preprocess(
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -250,7 +250,7 @@ export const BgpAnnounceSet = z.preprocess(
  */
 export const BgpAnnouncementCreate = z.preprocess(
   processResponseBody,
-  z.object({ addressLotBlock: NameOrId, network: IpNet })
+  z.object({ addressLotBlock: NameOrId, network: IpNet }),
 );
 
 /**
@@ -262,7 +262,7 @@ export const BgpAnnounceSetCreate = z.preprocess(
     announcement: BgpAnnouncementCreate.array(),
     description: z.string(),
     name: Name,
-  })
+  }),
 );
 
 /**
@@ -274,7 +274,7 @@ export const BgpAnnouncement = z.preprocess(
     addressLotBlockId: z.string().uuid(),
     announceSetId: z.string().uuid(),
     network: IpNet,
-  })
+  }),
 );
 
 /**
@@ -290,7 +290,7 @@ export const BgpConfig = z.preprocess(
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
     vrf: z.string().optional(),
-  })
+  }),
 );
 
 /**
@@ -304,7 +304,7 @@ export const BgpConfigCreate = z.preprocess(
     description: z.string(),
     name: Name,
     vrf: Name.optional(),
-  })
+  }),
 );
 
 /**
@@ -312,7 +312,7 @@ export const BgpConfigCreate = z.preprocess(
  */
 export const BgpConfigResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: BgpConfig.array(), nextPage: z.string().optional() })
+  z.object({ items: BgpConfig.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -320,7 +320,7 @@ export const BgpConfigResultsPage = z.preprocess(
  */
 export const SwitchLocation = z.preprocess(
   processResponseBody,
-  z.enum(["switch0", "switch1"])
+  z.enum(["switch0", "switch1"]),
 );
 
 /**
@@ -333,7 +333,7 @@ export const BgpImportedRouteIpv4 = z.preprocess(
     nexthop: z.string().ip({ version: "v4" }),
     prefix: Ipv4Net,
     switch: SwitchLocation,
-  })
+  }),
 );
 
 /**
@@ -351,12 +351,12 @@ export const BgpPeer = z.preprocess(
     idleHoldTime: z.number().min(0).max(4294967295),
     interfaceName: z.string(),
     keepalive: z.number().min(0).max(4294967295),
-  })
+  }),
 );
 
 export const BgpPeerConfig = z.preprocess(
   processResponseBody,
-  z.object({ peers: BgpPeer.array() })
+  z.object({ peers: BgpPeer.array() }),
 );
 
 /**
@@ -372,7 +372,7 @@ export const BgpPeerState = z.preprocess(
     "open_confirm",
     "session_setup",
     "established",
-  ])
+  ]),
 );
 
 /**
@@ -387,7 +387,7 @@ export const BgpPeerStatus = z.preprocess(
     state: BgpPeerState,
     stateDurationMillis: z.number().min(0),
     switch: SwitchLocation,
-  })
+  }),
 );
 
 /**
@@ -401,7 +401,7 @@ export const BinRangedouble = z.preprocess(
     z.object({ end: z.number(), type: z.enum(["range_to"]) }),
     z.object({ end: z.number(), start: z.number(), type: z.enum(["range"]) }),
     z.object({ start: z.number(), type: z.enum(["range_from"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -415,7 +415,7 @@ export const BinRangefloat = z.preprocess(
     z.object({ end: z.number(), type: z.enum(["range_to"]) }),
     z.object({ end: z.number(), start: z.number(), type: z.enum(["range"]) }),
     z.object({ start: z.number(), type: z.enum(["range_from"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -439,7 +439,7 @@ export const BinRangeint16 = z.preprocess(
       start: z.number().min(-32767).max(32767),
       type: z.enum(["range_from"]),
     }),
-  ])
+  ]),
 );
 
 /**
@@ -463,7 +463,7 @@ export const BinRangeint32 = z.preprocess(
       start: z.number().min(-2147483647).max(2147483647),
       type: z.enum(["range_from"]),
     }),
-  ])
+  ]),
 );
 
 /**
@@ -477,7 +477,7 @@ export const BinRangeint64 = z.preprocess(
     z.object({ end: z.number(), type: z.enum(["range_to"]) }),
     z.object({ end: z.number(), start: z.number(), type: z.enum(["range"]) }),
     z.object({ start: z.number(), type: z.enum(["range_from"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -501,7 +501,7 @@ export const BinRangeint8 = z.preprocess(
       start: z.number().min(-127).max(127),
       type: z.enum(["range_from"]),
     }),
-  ])
+  ]),
 );
 
 /**
@@ -522,7 +522,7 @@ export const BinRangeuint16 = z.preprocess(
       start: z.number().min(0).max(65535),
       type: z.enum(["range_from"]),
     }),
-  ])
+  ]),
 );
 
 /**
@@ -546,7 +546,7 @@ export const BinRangeuint32 = z.preprocess(
       start: z.number().min(0).max(4294967295),
       type: z.enum(["range_from"]),
     }),
-  ])
+  ]),
 );
 
 /**
@@ -564,7 +564,7 @@ export const BinRangeuint64 = z.preprocess(
       type: z.enum(["range"]),
     }),
     z.object({ start: z.number().min(0), type: z.enum(["range_from"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -585,7 +585,7 @@ export const BinRangeuint8 = z.preprocess(
       start: z.number().min(0).max(255),
       type: z.enum(["range_from"]),
     }),
-  ])
+  ]),
 );
 
 /**
@@ -593,7 +593,7 @@ export const BinRangeuint8 = z.preprocess(
  */
 export const Bindouble = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangedouble })
+  z.object({ count: z.number().min(0), range: BinRangedouble }),
 );
 
 /**
@@ -601,7 +601,7 @@ export const Bindouble = z.preprocess(
  */
 export const Binfloat = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangefloat })
+  z.object({ count: z.number().min(0), range: BinRangefloat }),
 );
 
 /**
@@ -609,7 +609,7 @@ export const Binfloat = z.preprocess(
  */
 export const Binint16 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeint16 })
+  z.object({ count: z.number().min(0), range: BinRangeint16 }),
 );
 
 /**
@@ -617,7 +617,7 @@ export const Binint16 = z.preprocess(
  */
 export const Binint32 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeint32 })
+  z.object({ count: z.number().min(0), range: BinRangeint32 }),
 );
 
 /**
@@ -625,7 +625,7 @@ export const Binint32 = z.preprocess(
  */
 export const Binint64 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeint64 })
+  z.object({ count: z.number().min(0), range: BinRangeint64 }),
 );
 
 /**
@@ -633,7 +633,7 @@ export const Binint64 = z.preprocess(
  */
 export const Binint8 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeint8 })
+  z.object({ count: z.number().min(0), range: BinRangeint8 }),
 );
 
 /**
@@ -641,7 +641,7 @@ export const Binint8 = z.preprocess(
  */
 export const Binuint16 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeuint16 })
+  z.object({ count: z.number().min(0), range: BinRangeuint16 }),
 );
 
 /**
@@ -649,7 +649,7 @@ export const Binuint16 = z.preprocess(
  */
 export const Binuint32 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeuint32 })
+  z.object({ count: z.number().min(0), range: BinRangeuint32 }),
 );
 
 /**
@@ -657,7 +657,7 @@ export const Binuint32 = z.preprocess(
  */
 export const Binuint64 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeuint64 })
+  z.object({ count: z.number().min(0), range: BinRangeuint64 }),
 );
 
 /**
@@ -665,7 +665,7 @@ export const Binuint64 = z.preprocess(
  */
 export const Binuint8 = z.preprocess(
   processResponseBody,
-  z.object({ count: z.number().min(0), range: BinRangeuint8 })
+  z.object({ count: z.number().min(0), range: BinRangeuint8 }),
 );
 
 /**
@@ -673,7 +673,7 @@ export const Binuint8 = z.preprocess(
  */
 export const BlockSize = z.preprocess(
   processResponseBody,
-  IntEnum([512, 2048, 4096] as const)
+  IntEnum([512, 2048, 4096] as const),
 );
 
 /**
@@ -686,7 +686,7 @@ export const ByteCount = z.preprocess(processResponseBody, z.number().min(0));
  */
 export const ServiceUsingCertificate = z.preprocess(
   processResponseBody,
-  z.enum(["external_api"])
+  z.enum(["external_api"]),
 );
 
 /**
@@ -701,7 +701,7 @@ export const Certificate = z.preprocess(
     service: ServiceUsingCertificate,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -715,7 +715,7 @@ export const CertificateCreate = z.preprocess(
     key: z.string(),
     name: Name,
     service: ServiceUsingCertificate,
-  })
+  }),
 );
 
 /**
@@ -723,7 +723,7 @@ export const CertificateCreate = z.preprocess(
  */
 export const CertificateResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Certificate.array(), nextPage: z.string().optional() })
+  z.object({ items: Certificate.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -731,7 +731,7 @@ export const CertificateResultsPage = z.preprocess(
  */
 export const Cumulativedouble = z.preprocess(
   processResponseBody,
-  z.object({ startTime: z.coerce.date(), value: z.number() })
+  z.object({ startTime: z.coerce.date(), value: z.number() }),
 );
 
 /**
@@ -739,7 +739,7 @@ export const Cumulativedouble = z.preprocess(
  */
 export const Cumulativefloat = z.preprocess(
   processResponseBody,
-  z.object({ startTime: z.coerce.date(), value: z.number() })
+  z.object({ startTime: z.coerce.date(), value: z.number() }),
 );
 
 /**
@@ -747,7 +747,7 @@ export const Cumulativefloat = z.preprocess(
  */
 export const Cumulativeint64 = z.preprocess(
   processResponseBody,
-  z.object({ startTime: z.coerce.date(), value: z.number() })
+  z.object({ startTime: z.coerce.date(), value: z.number() }),
 );
 
 /**
@@ -755,7 +755,7 @@ export const Cumulativeint64 = z.preprocess(
  */
 export const Cumulativeuint64 = z.preprocess(
   processResponseBody,
-  z.object({ startTime: z.coerce.date(), value: z.number().min(0) })
+  z.object({ startTime: z.coerce.date(), value: z.number().min(0) }),
 );
 
 /**
@@ -768,7 +768,7 @@ export const CurrentUser = z.preprocess(
     id: z.string().uuid(),
     siloId: z.string().uuid(),
     siloName: Name,
-  })
+  }),
 );
 
 /**
@@ -784,7 +784,7 @@ export const Histogramint8 = z.preprocess(
     bins: Binint8.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -800,7 +800,7 @@ export const Histogramuint8 = z.preprocess(
     bins: Binuint8.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -816,7 +816,7 @@ export const Histogramint16 = z.preprocess(
     bins: Binint16.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -832,7 +832,7 @@ export const Histogramuint16 = z.preprocess(
     bins: Binuint16.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -848,7 +848,7 @@ export const Histogramint32 = z.preprocess(
     bins: Binint32.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -864,7 +864,7 @@ export const Histogramuint32 = z.preprocess(
     bins: Binuint32.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -880,7 +880,7 @@ export const Histogramint64 = z.preprocess(
     bins: Binint64.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -896,7 +896,7 @@ export const Histogramuint64 = z.preprocess(
     bins: Binuint64.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -912,7 +912,7 @@ export const Histogramfloat = z.preprocess(
     bins: Binfloat.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -928,7 +928,7 @@ export const Histogramdouble = z.preprocess(
     bins: Bindouble.array(),
     nSamples: z.number().min(0),
     startTime: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -964,12 +964,12 @@ export const DatumType = z.preprocess(
     "histogram_u64",
     "histogram_f32",
     "histogram_f64",
-  ])
+  ]),
 );
 
 export const MissingDatum = z.preprocess(
   processResponseBody,
-  z.object({ datumType: DatumType, startTime: z.coerce.date().optional() })
+  z.object({ datumType: DatumType, startTime: z.coerce.date().optional() }),
 );
 
 /**
@@ -1018,12 +1018,12 @@ export const Datum = z.preprocess(
     z.object({ datum: Histogramfloat, type: z.enum(["histogram_f32"]) }),
     z.object({ datum: Histogramdouble, type: z.enum(["histogram_f64"]) }),
     z.object({ datum: MissingDatum, type: z.enum(["missing"]) }),
-  ])
+  ]),
 );
 
 export const DerEncodedKeyPair = z.preprocess(
   processResponseBody,
-  z.object({ privateKey: z.string(), publicCert: z.string() })
+  z.object({ privateKey: z.string(), publicCert: z.string() }),
 );
 
 export const DeviceAccessTokenRequest = z.preprocess(
@@ -1032,22 +1032,22 @@ export const DeviceAccessTokenRequest = z.preprocess(
     clientId: z.string().uuid(),
     deviceCode: z.string(),
     grantType: z.string(),
-  })
+  }),
 );
 
 export const DeviceAuthRequest = z.preprocess(
   processResponseBody,
-  z.object({ clientId: z.string().uuid() })
+  z.object({ clientId: z.string().uuid() }),
 );
 
 export const DeviceAuthVerify = z.preprocess(
   processResponseBody,
-  z.object({ userCode: z.string() })
+  z.object({ userCode: z.string() }),
 );
 
 export const Digest = z.preprocess(
   processResponseBody,
-  z.object({ type: z.enum(["sha256"]), value: z.string() })
+  z.object({ type: z.enum(["sha256"]), value: z.string() }),
 );
 
 /**
@@ -1068,7 +1068,7 @@ export const DiskState = z.preprocess(
     z.object({ instance: z.string().uuid(), state: z.enum(["detaching"]) }),
     z.object({ state: z.enum(["destroyed"]) }),
     z.object({ state: z.enum(["faulted"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1089,7 +1089,7 @@ export const Disk = z.preprocess(
     state: DiskState,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -1102,7 +1102,7 @@ export const DiskSource = z.preprocess(
     z.object({ snapshotId: z.string().uuid(), type: z.enum(["snapshot"]) }),
     z.object({ imageId: z.string().uuid(), type: z.enum(["image"]) }),
     z.object({ blockSize: BlockSize, type: z.enum(["importing_blocks"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1115,12 +1115,12 @@ export const DiskCreate = z.preprocess(
     diskSource: DiskSource,
     name: Name,
     size: ByteCount,
-  })
+  }),
 );
 
 export const DiskPath = z.preprocess(
   processResponseBody,
-  z.object({ disk: NameOrId })
+  z.object({ disk: NameOrId }),
 );
 
 /**
@@ -1128,7 +1128,7 @@ export const DiskPath = z.preprocess(
  */
 export const DiskResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Disk.array(), nextPage: z.string().optional() })
+  z.object({ items: Disk.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1136,7 +1136,7 @@ export const DiskResultsPage = z.preprocess(
  */
 export const EphemeralIpCreate = z.preprocess(
   processResponseBody,
-  z.object({ pool: NameOrId.optional() })
+  z.object({ pool: NameOrId.optional() }),
 );
 
 /**
@@ -1148,7 +1148,7 @@ export const Error = z.preprocess(
     errorCode: z.string().optional(),
     message: z.string(),
     requestId: z.string(),
-  })
+  }),
 );
 
 export const ExternalIp = z.preprocess(
@@ -1166,7 +1166,7 @@ export const ExternalIp = z.preprocess(
       timeCreated: z.coerce.date(),
       timeModified: z.coerce.date(),
     }),
-  ])
+  ]),
 );
 
 /**
@@ -1177,7 +1177,7 @@ export const ExternalIpCreate = z.preprocess(
   z.union([
     z.object({ pool: NameOrId.optional(), type: z.enum(["ephemeral"]) }),
     z.object({ floatingIp: NameOrId, type: z.enum(["floating"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1185,7 +1185,7 @@ export const ExternalIpCreate = z.preprocess(
  */
 export const ExternalIpResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: ExternalIp.array(), nextPage: z.string().optional() })
+  z.object({ items: ExternalIp.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1193,12 +1193,12 @@ export const ExternalIpResultsPage = z.preprocess(
  */
 export const FinalizeDisk = z.preprocess(
   processResponseBody,
-  z.object({ snapshotName: Name.optional() })
+  z.object({ snapshotName: Name.optional() }),
 );
 
 export const FleetRole = z.preprocess(
   processResponseBody,
-  z.enum(["admin", "collaborator", "viewer"])
+  z.enum(["admin", "collaborator", "viewer"]),
 );
 
 /**
@@ -1206,7 +1206,7 @@ export const FleetRole = z.preprocess(
  */
 export const IdentityType = z.preprocess(
   processResponseBody,
-  z.enum(["silo_user", "silo_group"])
+  z.enum(["silo_user", "silo_group"]),
 );
 
 /**
@@ -1220,7 +1220,7 @@ export const FleetRoleRoleAssignment = z.preprocess(
     identityId: z.string().uuid(),
     identityType: IdentityType,
     roleName: FleetRole,
-  })
+  }),
 );
 
 /**
@@ -1230,7 +1230,7 @@ export const FleetRoleRoleAssignment = z.preprocess(
  */
 export const FleetRolePolicy = z.preprocess(
   processResponseBody,
-  z.object({ roleAssignments: FleetRoleRoleAssignment.array() })
+  z.object({ roleAssignments: FleetRoleRoleAssignment.array() }),
 );
 
 /**
@@ -1247,7 +1247,7 @@ export const FloatingIp = z.preprocess(
     projectId: z.string().uuid(),
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -1255,7 +1255,7 @@ export const FloatingIp = z.preprocess(
  */
 export const FloatingIpParentKind = z.preprocess(
   processResponseBody,
-  z.enum(["instance"])
+  z.enum(["instance"]),
 );
 
 /**
@@ -1263,7 +1263,7 @@ export const FloatingIpParentKind = z.preprocess(
  */
 export const FloatingIpAttach = z.preprocess(
   processResponseBody,
-  z.object({ kind: FloatingIpParentKind, parent: NameOrId })
+  z.object({ kind: FloatingIpParentKind, parent: NameOrId }),
 );
 
 /**
@@ -1276,7 +1276,7 @@ export const FloatingIpCreate = z.preprocess(
     ip: z.string().ip().optional(),
     name: Name,
     pool: NameOrId.optional(),
-  })
+  }),
 );
 
 /**
@@ -1284,7 +1284,7 @@ export const FloatingIpCreate = z.preprocess(
  */
 export const FloatingIpResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: FloatingIp.array(), nextPage: z.string().optional() })
+  z.object({ items: FloatingIp.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1292,7 +1292,7 @@ export const FloatingIpResultsPage = z.preprocess(
  */
 export const FloatingIpUpdate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string().optional(), name: Name.optional() })
+  z.object({ description: z.string().optional(), name: Name.optional() }),
 );
 
 /**
@@ -1304,7 +1304,7 @@ export const Group = z.preprocess(
     displayName: z.string(),
     id: z.string().uuid(),
     siloId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -1312,7 +1312,7 @@ export const Group = z.preprocess(
  */
 export const GroupResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Group.array(), nextPage: z.string().optional() })
+  z.object({ items: Group.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1327,13 +1327,13 @@ export const Hostname = z.preprocess(
     .min(1)
     .max(253)
     .regex(
-      /^([a-zA-Z0-9]+[a-zA-Z0-9\-]*(?<!-))(\.[a-zA-Z0-9]+[a-zA-Z0-9\-]*(?<!-))*$/
-    )
+      /^([a-zA-Z0-9]+[a-zA-Z0-9\-]*(?<!-))(\.[a-zA-Z0-9]+[a-zA-Z0-9\-]*(?<!-))*$/,
+    ),
 );
 
 export const IdentityProviderType = z.preprocess(
   processResponseBody,
-  z.enum(["saml"])
+  z.enum(["saml"]),
 );
 
 /**
@@ -1348,7 +1348,7 @@ export const IdentityProvider = z.preprocess(
     providerType: IdentityProviderType,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -1356,7 +1356,10 @@ export const IdentityProvider = z.preprocess(
  */
 export const IdentityProviderResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: IdentityProvider.array(), nextPage: z.string().optional() })
+  z.object({
+    items: IdentityProvider.array(),
+    nextPage: z.string().optional(),
+  }),
 );
 
 export const IdpMetadataSource = z.preprocess(
@@ -1364,7 +1367,7 @@ export const IdpMetadataSource = z.preprocess(
   z.union([
     z.object({ type: z.enum(["url"]), url: z.string() }),
     z.object({ data: z.string(), type: z.enum(["base64_encoded_xml"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1386,7 +1389,7 @@ export const Image = z.preprocess(
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
     version: z.string(),
-  })
+  }),
 );
 
 /**
@@ -1397,7 +1400,7 @@ export const ImageSource = z.preprocess(
   z.union([
     z.object({ id: z.string().uuid(), type: z.enum(["snapshot"]) }),
     z.object({ type: z.enum(["you_can_boot_anything_as_long_as_its_alpine"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1411,7 +1414,7 @@ export const ImageCreate = z.preprocess(
     os: z.string(),
     source: ImageSource,
     version: z.string(),
-  })
+  }),
 );
 
 /**
@@ -1419,7 +1422,7 @@ export const ImageCreate = z.preprocess(
  */
 export const ImageResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Image.array(), nextPage: z.string().optional() })
+  z.object({ items: Image.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1427,7 +1430,7 @@ export const ImageResultsPage = z.preprocess(
  */
 export const ImportBlocksBulkWrite = z.preprocess(
   processResponseBody,
-  z.object({ base64EncodedData: z.string(), offset: z.number().min(0) })
+  z.object({ base64EncodedData: z.string(), offset: z.number().min(0) }),
 );
 
 /**
@@ -1435,7 +1438,7 @@ export const ImportBlocksBulkWrite = z.preprocess(
  */
 export const InstanceCpuCount = z.preprocess(
   processResponseBody,
-  z.number().min(0).max(65535)
+  z.number().min(0).max(65535),
 );
 
 /**
@@ -1456,7 +1459,7 @@ export const InstanceState = z.preprocess(
     "repairing",
     "failed",
     "destroyed",
-  ])
+  ]),
 );
 
 /**
@@ -1476,7 +1479,7 @@ export const Instance = z.preprocess(
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
     timeRunStateUpdated: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -1493,7 +1496,7 @@ export const InstanceDiskAttachment = z.preprocess(
       type: z.enum(["create"]),
     }),
     z.object({ name: Name, type: z.enum(["attach"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1507,7 +1510,7 @@ export const InstanceNetworkInterfaceCreate = z.preprocess(
     name: Name,
     subnetName: Name,
     vpcName: Name,
-  })
+  }),
 );
 
 /**
@@ -1522,7 +1525,7 @@ export const InstanceNetworkInterfaceAttachment = z.preprocess(
     }),
     z.object({ type: z.enum(["default"]) }),
     z.object({ type: z.enum(["none"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1544,7 +1547,7 @@ export const InstanceCreate = z.preprocess(
     sshPublicKeys: NameOrId.array().optional(),
     start: SafeBoolean.default(true).optional(),
     userData: z.string().default("").optional(),
-  })
+  }),
 );
 
 /**
@@ -1552,7 +1555,7 @@ export const InstanceCreate = z.preprocess(
  */
 export const InstanceMigrate = z.preprocess(
   processResponseBody,
-  z.object({ dstSledId: z.string().uuid() })
+  z.object({ dstSledId: z.string().uuid() }),
 );
 
 /**
@@ -1566,7 +1569,7 @@ export const MacAddr = z.preprocess(
     .string()
     .min(5)
     .max(17)
-    .regex(/^([0-9a-fA-F]{0,2}:){5}[0-9a-fA-F]{0,2}$/)
+    .regex(/^([0-9a-fA-F]{0,2}:){5}[0-9a-fA-F]{0,2}$/),
 );
 
 /**
@@ -1586,7 +1589,7 @@ export const InstanceNetworkInterface = z.preprocess(
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
     vpcId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -1597,7 +1600,7 @@ export const InstanceNetworkInterfaceResultsPage = z.preprocess(
   z.object({
     items: InstanceNetworkInterface.array(),
     nextPage: z.string().optional(),
-  })
+  }),
 );
 
 /**
@@ -1611,7 +1614,7 @@ export const InstanceNetworkInterfaceUpdate = z.preprocess(
     description: z.string().optional(),
     name: Name.optional(),
     primary: SafeBoolean.default(false).optional(),
-  })
+  }),
 );
 
 /**
@@ -1619,7 +1622,7 @@ export const InstanceNetworkInterfaceUpdate = z.preprocess(
  */
 export const InstanceResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Instance.array(), nextPage: z.string().optional() })
+  z.object({ items: Instance.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1630,12 +1633,12 @@ export const InstanceSerialConsoleData = z.preprocess(
   z.object({
     data: z.number().min(0).max(255).array(),
     lastByteOffset: z.number().min(0),
-  })
+  }),
 );
 
 export const IpKind = z.preprocess(
   processResponseBody,
-  z.enum(["snat", "floating", "ephemeral"])
+  z.enum(["snat", "floating", "ephemeral"]),
 );
 
 /**
@@ -1649,7 +1652,7 @@ export const IpPool = z.preprocess(
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -1657,12 +1660,12 @@ export const IpPool = z.preprocess(
  */
 export const IpPoolCreate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string(), name: Name })
+  z.object({ description: z.string(), name: Name }),
 );
 
 export const IpPoolLinkSilo = z.preprocess(
   processResponseBody,
-  z.object({ isDefault: SafeBoolean, silo: NameOrId })
+  z.object({ isDefault: SafeBoolean, silo: NameOrId }),
 );
 
 /**
@@ -1675,7 +1678,7 @@ export const Ipv4Range = z.preprocess(
   z.object({
     first: z.string().ip({ version: "v4" }),
     last: z.string().ip({ version: "v4" }),
-  })
+  }),
 );
 
 /**
@@ -1688,12 +1691,12 @@ export const Ipv6Range = z.preprocess(
   z.object({
     first: z.string().ip({ version: "v6" }),
     last: z.string().ip({ version: "v6" }),
-  })
+  }),
 );
 
 export const IpRange = z.preprocess(
   processResponseBody,
-  z.union([Ipv4Range, Ipv6Range])
+  z.union([Ipv4Range, Ipv6Range]),
 );
 
 export const IpPoolRange = z.preprocess(
@@ -1703,7 +1706,7 @@ export const IpPoolRange = z.preprocess(
     ipPoolId: z.string().uuid(),
     range: IpRange,
     timeCreated: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -1711,7 +1714,7 @@ export const IpPoolRange = z.preprocess(
  */
 export const IpPoolRangeResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: IpPoolRange.array(), nextPage: z.string().optional() })
+  z.object({ items: IpPoolRange.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1719,7 +1722,7 @@ export const IpPoolRangeResultsPage = z.preprocess(
  */
 export const IpPoolResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: IpPool.array(), nextPage: z.string().optional() })
+  z.object({ items: IpPool.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1731,7 +1734,7 @@ export const IpPoolSiloLink = z.preprocess(
     ipPoolId: z.string().uuid(),
     isDefault: SafeBoolean,
     siloId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -1739,12 +1742,12 @@ export const IpPoolSiloLink = z.preprocess(
  */
 export const IpPoolSiloLinkResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: IpPoolSiloLink.array(), nextPage: z.string().optional() })
+  z.object({ items: IpPoolSiloLink.array(), nextPage: z.string().optional() }),
 );
 
 export const IpPoolSiloUpdate = z.preprocess(
   processResponseBody,
-  z.object({ isDefault: SafeBoolean })
+  z.object({ isDefault: SafeBoolean }),
 );
 
 /**
@@ -1752,7 +1755,7 @@ export const IpPoolSiloUpdate = z.preprocess(
  */
 export const IpPoolUpdate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string().optional(), name: Name.optional() })
+  z.object({ description: z.string().optional(), name: Name.optional() }),
 );
 
 /**
@@ -1766,7 +1769,7 @@ export const L4PortRange = z.preprocess(
     .string()
     .min(1)
     .max(11)
-    .regex(/^[0-9]{1,5}(-[0-9]{1,5})?$/)
+    .regex(/^[0-9]{1,5}(-[0-9]{1,5})?$/),
 );
 
 /**
@@ -1774,7 +1777,7 @@ export const L4PortRange = z.preprocess(
  */
 export const LinkFec = z.preprocess(
   processResponseBody,
-  z.enum(["firecode", "none", "rs"])
+  z.enum(["firecode", "none", "rs"]),
 );
 
 /**
@@ -1782,7 +1785,7 @@ export const LinkFec = z.preprocess(
  */
 export const LldpServiceConfigCreate = z.preprocess(
   processResponseBody,
-  z.object({ enabled: SafeBoolean, lldpConfig: NameOrId.optional() })
+  z.object({ enabled: SafeBoolean, lldpConfig: NameOrId.optional() }),
 );
 
 /**
@@ -1800,7 +1803,7 @@ export const LinkSpeed = z.preprocess(
     "speed100_g",
     "speed200_g",
     "speed400_g",
-  ])
+  ]),
 );
 
 /**
@@ -1814,7 +1817,7 @@ export const LinkConfigCreate = z.preprocess(
     lldp: LldpServiceConfigCreate,
     mtu: z.number().min(0).max(65535),
     speed: LinkSpeed,
-  })
+  }),
 );
 
 /**
@@ -1826,7 +1829,7 @@ export const LldpServiceConfig = z.preprocess(
     enabled: SafeBoolean,
     id: z.string().uuid(),
     lldpConfigId: z.string().uuid().optional(),
-  })
+  }),
 );
 
 /**
@@ -1840,7 +1843,7 @@ export const LoopbackAddress = z.preprocess(
     id: z.string().uuid(),
     rackId: z.string().uuid(),
     switchLocation: z.string(),
-  })
+  }),
 );
 
 /**
@@ -1855,7 +1858,7 @@ export const LoopbackAddressCreate = z.preprocess(
     mask: z.number().min(0).max(255),
     rackId: z.string().uuid(),
     switchLocation: Name,
-  })
+  }),
 );
 
 /**
@@ -1863,7 +1866,7 @@ export const LoopbackAddressCreate = z.preprocess(
  */
 export const LoopbackAddressResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: LoopbackAddress.array(), nextPage: z.string().optional() })
+  z.object({ items: LoopbackAddress.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1871,7 +1874,7 @@ export const LoopbackAddressResultsPage = z.preprocess(
  */
 export const Measurement = z.preprocess(
   processResponseBody,
-  z.object({ datum: Datum, timestamp: z.coerce.date() })
+  z.object({ datum: Datum, timestamp: z.coerce.date() }),
 );
 
 /**
@@ -1879,7 +1882,7 @@ export const Measurement = z.preprocess(
  */
 export const MeasurementResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Measurement.array(), nextPage: z.string().optional() })
+  z.object({ items: Measurement.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -1891,7 +1894,7 @@ export const NetworkInterfaceKind = z.preprocess(
     z.object({ id: z.string().uuid(), type: z.enum(["instance"]) }),
     z.object({ id: z.string().uuid(), type: z.enum(["service"]) }),
     z.object({ id: z.string().uuid(), type: z.enum(["probe"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -1899,7 +1902,7 @@ export const NetworkInterfaceKind = z.preprocess(
  */
 export const Vni = z.preprocess(
   processResponseBody,
-  z.number().min(0).max(4294967295)
+  z.number().min(0).max(4294967295),
 );
 
 /**
@@ -1917,7 +1920,7 @@ export const NetworkInterface = z.preprocess(
     slot: z.number().min(0).max(255),
     subnet: IpNet,
     vni: Vni,
-  })
+  }),
 );
 
 /**
@@ -1932,7 +1935,7 @@ export const Password = z.preprocess(processResponseBody, z.string().max(512));
  */
 export const PhysicalDiskKind = z.preprocess(
   processResponseBody,
-  z.enum(["m2", "u2"])
+  z.enum(["m2", "u2"]),
 );
 
 /**
@@ -1951,7 +1954,7 @@ export const PhysicalDisk = z.preprocess(
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
     vendor: z.string(),
-  })
+  }),
 );
 
 /**
@@ -1959,14 +1962,14 @@ export const PhysicalDisk = z.preprocess(
  */
 export const PhysicalDiskResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: PhysicalDisk.array(), nextPage: z.string().optional() })
+  z.object({ items: PhysicalDisk.array(), nextPage: z.string().optional() }),
 );
 
 export const PingStatus = z.preprocess(processResponseBody, z.enum(["ok"]));
 
 export const Ping = z.preprocess(
   processResponseBody,
-  z.object({ status: PingStatus })
+  z.object({ status: PingStatus }),
 );
 
 /**
@@ -1981,7 +1984,7 @@ export const Probe = z.preprocess(
     sled: z.string().uuid(),
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -1994,7 +1997,7 @@ export const ProbeCreate = z.preprocess(
     ipPool: NameOrId.optional(),
     name: Name,
     sled: z.string().uuid(),
-  })
+  }),
 );
 
 export const ProbeExternalIp = z.preprocess(
@@ -2004,7 +2007,7 @@ export const ProbeExternalIp = z.preprocess(
     ip: z.string().ip(),
     kind: IpKind,
     lastPort: z.number().min(0).max(65535),
-  })
+  }),
 );
 
 export const ProbeInfo = z.preprocess(
@@ -2015,7 +2018,7 @@ export const ProbeInfo = z.preprocess(
     interface: NetworkInterface,
     name: Name,
     sled: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -2023,7 +2026,7 @@ export const ProbeInfo = z.preprocess(
  */
 export const ProbeInfoResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: ProbeInfo.array(), nextPage: z.string().optional() })
+  z.object({ items: ProbeInfo.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2037,7 +2040,7 @@ export const Project = z.preprocess(
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2045,7 +2048,7 @@ export const Project = z.preprocess(
  */
 export const ProjectCreate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string(), name: Name })
+  z.object({ description: z.string(), name: Name }),
 );
 
 /**
@@ -2053,12 +2056,12 @@ export const ProjectCreate = z.preprocess(
  */
 export const ProjectResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Project.array(), nextPage: z.string().optional() })
+  z.object({ items: Project.array(), nextPage: z.string().optional() }),
 );
 
 export const ProjectRole = z.preprocess(
   processResponseBody,
-  z.enum(["admin", "collaborator", "viewer"])
+  z.enum(["admin", "collaborator", "viewer"]),
 );
 
 /**
@@ -2072,7 +2075,7 @@ export const ProjectRoleRoleAssignment = z.preprocess(
     identityId: z.string().uuid(),
     identityType: IdentityType,
     roleName: ProjectRole,
-  })
+  }),
 );
 
 /**
@@ -2082,7 +2085,7 @@ export const ProjectRoleRoleAssignment = z.preprocess(
  */
 export const ProjectRolePolicy = z.preprocess(
   processResponseBody,
-  z.object({ roleAssignments: ProjectRoleRoleAssignment.array() })
+  z.object({ roleAssignments: ProjectRoleRoleAssignment.array() }),
 );
 
 /**
@@ -2090,7 +2093,7 @@ export const ProjectRolePolicy = z.preprocess(
  */
 export const ProjectUpdate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string().optional(), name: Name.optional() })
+  z.object({ description: z.string().optional(), name: Name.optional() }),
 );
 
 /**
@@ -2102,7 +2105,7 @@ export const Rack = z.preprocess(
     id: z.string().uuid(),
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2110,7 +2113,7 @@ export const Rack = z.preprocess(
  */
 export const RackResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Rack.array(), nextPage: z.string().optional() })
+  z.object({ items: Rack.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2123,7 +2126,7 @@ export const RoleName = z.preprocess(
   z
     .string()
     .max(63)
-    .regex(/[a-z-]+\.[a-z-]+/)
+    .regex(/[a-z-]+\.[a-z-]+/),
 );
 
 /**
@@ -2131,7 +2134,7 @@ export const RoleName = z.preprocess(
  */
 export const Role = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string(), name: RoleName })
+  z.object({ description: z.string(), name: RoleName }),
 );
 
 /**
@@ -2139,7 +2142,7 @@ export const Role = z.preprocess(
  */
 export const RoleResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Role.array(), nextPage: z.string().optional() })
+  z.object({ items: Role.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2151,7 +2154,7 @@ export const Route = z.preprocess(
     dst: IpNet,
     gw: z.string().ip(),
     vid: z.number().min(0).max(65535).optional(),
-  })
+  }),
 );
 
 /**
@@ -2159,7 +2162,7 @@ export const Route = z.preprocess(
  */
 export const RouteConfig = z.preprocess(
   processResponseBody,
-  z.object({ routes: Route.array() })
+  z.object({ routes: Route.array() }),
 );
 
 /**
@@ -2180,7 +2183,7 @@ export const SamlIdentityProvider = z.preprocess(
     technicalContactEmail: z.string(),
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2199,7 +2202,7 @@ export const SamlIdentityProviderCreate = z.preprocess(
     sloUrl: z.string(),
     spClientId: z.string(),
     technicalContactEmail: z.string(),
-  })
+  }),
 );
 
 /**
@@ -2207,7 +2210,7 @@ export const SamlIdentityProviderCreate = z.preprocess(
  */
 export const SiloIdentityMode = z.preprocess(
   processResponseBody,
-  z.enum(["saml_jit", "local_only"])
+  z.enum(["saml_jit", "local_only"]),
 );
 
 /**
@@ -2224,12 +2227,12 @@ export const Silo = z.preprocess(
     identityMode: SiloIdentityMode,
     mappedFleetRoles: z.record(
       z.string().min(1),
-      FleetRole.array().refine(...uniqueItems)
+      FleetRole.array().refine(...uniqueItems),
     ),
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2237,7 +2240,7 @@ export const Silo = z.preprocess(
  */
 export const SiloQuotasCreate = z.preprocess(
   processResponseBody,
-  z.object({ cpus: z.number(), memory: ByteCount, storage: ByteCount })
+  z.object({ cpus: z.number(), memory: ByteCount, storage: ByteCount }),
 );
 
 /**
@@ -2256,7 +2259,7 @@ export const SiloCreate = z.preprocess(
     name: Name,
     quotas: SiloQuotasCreate,
     tlsCertificates: CertificateCreate.array(),
-  })
+  }),
 );
 
 /**
@@ -2271,7 +2274,7 @@ export const SiloIpPool = z.preprocess(
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2279,7 +2282,7 @@ export const SiloIpPool = z.preprocess(
  */
 export const SiloIpPoolResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: SiloIpPool.array(), nextPage: z.string().optional() })
+  z.object({ items: SiloIpPool.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2292,7 +2295,7 @@ export const SiloQuotas = z.preprocess(
     memory: ByteCount,
     siloId: z.string().uuid(),
     storage: ByteCount,
-  })
+  }),
 );
 
 /**
@@ -2300,7 +2303,7 @@ export const SiloQuotas = z.preprocess(
  */
 export const SiloQuotasResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: SiloQuotas.array(), nextPage: z.string().optional() })
+  z.object({ items: SiloQuotas.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2312,7 +2315,7 @@ export const SiloQuotasUpdate = z.preprocess(
     cpus: z.number().optional(),
     memory: ByteCount.optional(),
     storage: ByteCount.optional(),
-  })
+  }),
 );
 
 /**
@@ -2320,12 +2323,12 @@ export const SiloQuotasUpdate = z.preprocess(
  */
 export const SiloResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Silo.array(), nextPage: z.string().optional() })
+  z.object({ items: Silo.array(), nextPage: z.string().optional() }),
 );
 
 export const SiloRole = z.preprocess(
   processResponseBody,
-  z.enum(["admin", "collaborator", "viewer"])
+  z.enum(["admin", "collaborator", "viewer"]),
 );
 
 /**
@@ -2339,7 +2342,7 @@ export const SiloRoleRoleAssignment = z.preprocess(
     identityId: z.string().uuid(),
     identityType: IdentityType,
     roleName: SiloRole,
-  })
+  }),
 );
 
 /**
@@ -2349,7 +2352,7 @@ export const SiloRoleRoleAssignment = z.preprocess(
  */
 export const SiloRolePolicy = z.preprocess(
   processResponseBody,
-  z.object({ roleAssignments: SiloRoleRoleAssignment.array() })
+  z.object({ roleAssignments: SiloRoleRoleAssignment.array() }),
 );
 
 /**
@@ -2357,7 +2360,7 @@ export const SiloRolePolicy = z.preprocess(
  */
 export const VirtualResourceCounts = z.preprocess(
   processResponseBody,
-  z.object({ cpus: z.number(), memory: ByteCount, storage: ByteCount })
+  z.object({ cpus: z.number(), memory: ByteCount, storage: ByteCount }),
 );
 
 /**
@@ -2370,7 +2373,7 @@ export const SiloUtilization = z.preprocess(
     provisioned: VirtualResourceCounts,
     siloId: z.string().uuid(),
     siloName: Name,
-  })
+  }),
 );
 
 /**
@@ -2378,7 +2381,7 @@ export const SiloUtilization = z.preprocess(
  */
 export const SiloUtilizationResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: SiloUtilization.array(), nextPage: z.string().optional() })
+  z.object({ items: SiloUtilization.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2388,7 +2391,7 @@ export const SiloUtilizationResultsPage = z.preprocess(
  */
 export const SledProvisionPolicy = z.preprocess(
   processResponseBody,
-  z.enum(["provisionable", "non_provisionable"])
+  z.enum(["provisionable", "non_provisionable"]),
 );
 
 /**
@@ -2402,7 +2405,7 @@ export const SledPolicy = z.preprocess(
       provisionPolicy: SledProvisionPolicy,
     }),
     z.object({ kind: z.enum(["expunged"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -2410,7 +2413,7 @@ export const SledPolicy = z.preprocess(
  */
 export const SledState = z.preprocess(
   processResponseBody,
-  z.enum(["active", "decommissioned"])
+  z.enum(["active", "decommissioned"]),
 );
 
 /**
@@ -2428,7 +2431,7 @@ export const Sled = z.preprocess(
     timeModified: z.coerce.date(),
     usableHardwareThreads: z.number().min(0).max(4294967295),
     usablePhysicalRam: ByteCount,
-  })
+  }),
 );
 
 /**
@@ -2448,7 +2451,7 @@ export const SledInstance = z.preprocess(
     state: InstanceState,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2456,7 +2459,7 @@ export const SledInstance = z.preprocess(
  */
 export const SledInstanceResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: SledInstance.array(), nextPage: z.string().optional() })
+  z.object({ items: SledInstance.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2464,7 +2467,7 @@ export const SledInstanceResultsPage = z.preprocess(
  */
 export const SledProvisionPolicyParams = z.preprocess(
   processResponseBody,
-  z.object({ state: SledProvisionPolicy })
+  z.object({ state: SledProvisionPolicy }),
 );
 
 /**
@@ -2472,7 +2475,7 @@ export const SledProvisionPolicyParams = z.preprocess(
  */
 export const SledProvisionPolicyResponse = z.preprocess(
   processResponseBody,
-  z.object({ newState: SledProvisionPolicy, oldState: SledProvisionPolicy })
+  z.object({ newState: SledProvisionPolicy, oldState: SledProvisionPolicy }),
 );
 
 /**
@@ -2480,12 +2483,12 @@ export const SledProvisionPolicyResponse = z.preprocess(
  */
 export const SledResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Sled.array(), nextPage: z.string().optional() })
+  z.object({ items: Sled.array(), nextPage: z.string().optional() }),
 );
 
 export const SnapshotState = z.preprocess(
   processResponseBody,
-  z.enum(["creating", "ready", "faulted", "destroyed"])
+  z.enum(["creating", "ready", "faulted", "destroyed"]),
 );
 
 /**
@@ -2503,7 +2506,7 @@ export const Snapshot = z.preprocess(
     state: SnapshotState,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2511,7 +2514,7 @@ export const Snapshot = z.preprocess(
  */
 export const SnapshotCreate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string(), disk: NameOrId, name: Name })
+  z.object({ description: z.string(), disk: NameOrId, name: Name }),
 );
 
 /**
@@ -2519,7 +2522,7 @@ export const SnapshotCreate = z.preprocess(
  */
 export const SnapshotResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Snapshot.array(), nextPage: z.string().optional() })
+  z.object({ items: Snapshot.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2535,7 +2538,7 @@ export const SshKey = z.preprocess(
     siloUserId: z.string().uuid(),
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2543,7 +2546,7 @@ export const SshKey = z.preprocess(
  */
 export const SshKeyCreate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string(), name: Name, publicKey: z.string() })
+  z.object({ description: z.string(), name: Name, publicKey: z.string() }),
 );
 
 /**
@@ -2551,7 +2554,7 @@ export const SshKeyCreate = z.preprocess(
  */
 export const SshKeyResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: SshKey.array(), nextPage: z.string().optional() })
+  z.object({ items: SshKey.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2565,7 +2568,7 @@ export const Switch = z.preprocess(
     rackId: z.string().uuid(),
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2573,7 +2576,7 @@ export const Switch = z.preprocess(
  */
 export const SwitchInterfaceKind2 = z.preprocess(
   processResponseBody,
-  z.enum(["primary", "vlan", "loopback"])
+  z.enum(["primary", "vlan", "loopback"]),
 );
 
 /**
@@ -2587,7 +2590,7 @@ export const SwitchInterfaceConfig = z.preprocess(
     kind: SwitchInterfaceKind2,
     portSettingsId: z.string().uuid(),
     v6Enabled: SafeBoolean,
-  })
+  }),
 );
 
 /**
@@ -2599,7 +2602,7 @@ export const SwitchInterfaceKind = z.preprocess(
     z.object({ type: z.enum(["primary"]) }),
     z.object({ type: z.enum(["vlan"]), vid: z.number().min(0).max(65535) }),
     z.object({ type: z.enum(["loopback"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -2607,7 +2610,7 @@ export const SwitchInterfaceKind = z.preprocess(
  */
 export const SwitchInterfaceConfigCreate = z.preprocess(
   processResponseBody,
-  z.object({ kind: SwitchInterfaceKind, v6Enabled: SafeBoolean })
+  z.object({ kind: SwitchInterfaceKind, v6Enabled: SafeBoolean }),
 );
 
 /**
@@ -2621,7 +2624,7 @@ export const SwitchPort = z.preprocess(
     portSettingsId: z.string().uuid().optional(),
     rackId: z.string().uuid(),
     switchLocation: z.string(),
-  })
+  }),
 );
 
 /**
@@ -2634,7 +2637,7 @@ export const SwitchPortAddressConfig = z.preprocess(
     addressLotBlockId: z.string().uuid(),
     interfaceName: z.string(),
     portSettingsId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -2642,7 +2645,7 @@ export const SwitchPortAddressConfig = z.preprocess(
  */
 export const SwitchPortApplySettings = z.preprocess(
   processResponseBody,
-  z.object({ portSettings: NameOrId })
+  z.object({ portSettings: NameOrId }),
 );
 
 /**
@@ -2655,7 +2658,7 @@ export const SwitchPortBgpPeerConfig = z.preprocess(
     bgpConfigId: z.string().uuid(),
     interfaceName: z.string(),
     portSettingsId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -2663,7 +2666,7 @@ export const SwitchPortBgpPeerConfig = z.preprocess(
  */
 export const SwitchPortGeometry2 = z.preprocess(
   processResponseBody,
-  z.enum(["qsfp28x1", "qsfp28x2", "sfp28x4"])
+  z.enum(["qsfp28x1", "qsfp28x2", "sfp28x4"]),
 );
 
 /**
@@ -2671,7 +2674,10 @@ export const SwitchPortGeometry2 = z.preprocess(
  */
 export const SwitchPortConfig = z.preprocess(
   processResponseBody,
-  z.object({ geometry: SwitchPortGeometry2, portSettingsId: z.string().uuid() })
+  z.object({
+    geometry: SwitchPortGeometry2,
+    portSettingsId: z.string().uuid(),
+  }),
 );
 
 /**
@@ -2679,7 +2685,7 @@ export const SwitchPortConfig = z.preprocess(
  */
 export const SwitchPortGeometry = z.preprocess(
   processResponseBody,
-  z.enum(["qsfp28x1", "qsfp28x2", "sfp28x4"])
+  z.enum(["qsfp28x1", "qsfp28x2", "sfp28x4"]),
 );
 
 /**
@@ -2687,7 +2693,7 @@ export const SwitchPortGeometry = z.preprocess(
  */
 export const SwitchPortConfigCreate = z.preprocess(
   processResponseBody,
-  z.object({ geometry: SwitchPortGeometry })
+  z.object({ geometry: SwitchPortGeometry }),
 );
 
 /**
@@ -2700,7 +2706,7 @@ export const SwitchPortLinkConfig = z.preprocess(
     lldpServiceConfigId: z.string().uuid(),
     mtu: z.number().min(0).max(65535),
     portSettingsId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -2708,7 +2714,7 @@ export const SwitchPortLinkConfig = z.preprocess(
  */
 export const SwitchPortResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: SwitchPort.array(), nextPage: z.string().optional() })
+  z.object({ items: SwitchPort.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2722,7 +2728,7 @@ export const SwitchPortRouteConfig = z.preprocess(
     interfaceName: z.string(),
     portSettingsId: z.string().uuid(),
     vlanId: z.number().min(0).max(65535).optional(),
-  })
+  }),
 );
 
 /**
@@ -2736,7 +2742,7 @@ export const SwitchPortSettings = z.preprocess(
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2754,7 +2760,7 @@ export const SwitchPortSettingsCreate = z.preprocess(
     name: Name,
     portConfig: SwitchPortConfigCreate,
     routes: z.record(z.string().min(1), RouteConfig),
-  })
+  }),
 );
 
 /**
@@ -2765,7 +2771,7 @@ export const SwitchPortSettingsGroups = z.preprocess(
   z.object({
     portSettingsGroupId: z.string().uuid(),
     portSettingsId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -2776,7 +2782,7 @@ export const SwitchPortSettingsResultsPage = z.preprocess(
   z.object({
     items: SwitchPortSettings.array(),
     nextPage: z.string().optional(),
-  })
+  }),
 );
 
 /**
@@ -2787,7 +2793,7 @@ export const SwitchVlanInterfaceConfig = z.preprocess(
   z.object({
     interfaceConfigId: z.string().uuid(),
     vlanId: z.number().min(0).max(65535),
-  })
+  }),
 );
 
 /**
@@ -2806,7 +2812,7 @@ export const SwitchPortSettingsView = z.preprocess(
     routes: SwitchPortRouteConfig.array(),
     settings: SwitchPortSettings,
     vlanInterfaces: SwitchVlanInterfaceConfig.array(),
-  })
+  }),
 );
 
 /**
@@ -2814,7 +2820,7 @@ export const SwitchPortSettingsView = z.preprocess(
  */
 export const SwitchResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Switch.array(), nextPage: z.string().optional() })
+  z.object({ items: Switch.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2826,7 +2832,7 @@ export const UninitializedSled = z.preprocess(
     baseboard: Baseboard,
     cubby: z.number().min(0).max(65535),
     rackId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -2834,7 +2840,7 @@ export const UninitializedSled = z.preprocess(
  */
 export const UninitializedSledId = z.preprocess(
   processResponseBody,
-  z.object({ part: z.string(), serial: z.string() })
+  z.object({ part: z.string(), serial: z.string() }),
 );
 
 /**
@@ -2845,7 +2851,7 @@ export const UninitializedSledResultsPage = z.preprocess(
   z.object({
     items: UninitializedSled.array(),
     nextPage: z.string().optional(),
-  })
+  }),
 );
 
 /**
@@ -2857,7 +2863,7 @@ export const User = z.preprocess(
     displayName: z.string(),
     id: z.string().uuid(),
     siloId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -2873,7 +2879,7 @@ export const UserBuiltin = z.preprocess(
     name: Name,
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2881,7 +2887,7 @@ export const UserBuiltin = z.preprocess(
  */
 export const UserBuiltinResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: UserBuiltin.array(), nextPage: z.string().optional() })
+  z.object({ items: UserBuiltin.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2896,8 +2902,8 @@ export const UserId = z.preprocess(
     .min(1)
     .max(63)
     .regex(
-      /^(?![0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)^[a-z]([a-zA-Z0-9-]*[a-zA-Z0-9]+)?$/
-    )
+      /^(?![0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)^[a-z]([a-zA-Z0-9-]*[a-zA-Z0-9]+)?$/,
+    ),
 );
 
 /**
@@ -2908,7 +2914,7 @@ export const UserPassword = z.preprocess(
   z.union([
     z.object({ mode: z.enum(["password"]), value: Password }),
     z.object({ mode: z.enum(["login_disallowed"]) }),
-  ])
+  ]),
 );
 
 /**
@@ -2916,7 +2922,7 @@ export const UserPassword = z.preprocess(
  */
 export const UserCreate = z.preprocess(
   processResponseBody,
-  z.object({ externalId: UserId, password: UserPassword })
+  z.object({ externalId: UserId, password: UserPassword }),
 );
 
 /**
@@ -2924,7 +2930,7 @@ export const UserCreate = z.preprocess(
  */
 export const UserResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: User.array(), nextPage: z.string().optional() })
+  z.object({ items: User.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -2932,7 +2938,7 @@ export const UserResultsPage = z.preprocess(
  */
 export const UsernamePasswordCredentials = z.preprocess(
   processResponseBody,
-  z.object({ password: Password, username: UserId })
+  z.object({ password: Password, username: UserId }),
 );
 
 /**
@@ -2943,7 +2949,7 @@ export const Utilization = z.preprocess(
   z.object({
     capacity: VirtualResourceCounts,
     provisioned: VirtualResourceCounts,
-  })
+  }),
 );
 
 /**
@@ -2961,7 +2967,7 @@ export const Vpc = z.preprocess(
     systemRouterId: z.string().uuid(),
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
-  })
+  }),
 );
 
 /**
@@ -2974,17 +2980,17 @@ export const VpcCreate = z.preprocess(
     dnsName: Name,
     ipv6Prefix: Ipv6Net.optional(),
     name: Name,
-  })
+  }),
 );
 
 export const VpcFirewallRuleAction = z.preprocess(
   processResponseBody,
-  z.enum(["allow", "deny"])
+  z.enum(["allow", "deny"]),
 );
 
 export const VpcFirewallRuleDirection = z.preprocess(
   processResponseBody,
-  z.enum(["inbound", "outbound"])
+  z.enum(["inbound", "outbound"]),
 );
 
 /**
@@ -2998,7 +3004,7 @@ export const VpcFirewallRuleHostFilter = z.preprocess(
     z.object({ type: z.enum(["instance"]), value: Name }),
     z.object({ type: z.enum(["ip"]), value: z.string().ip() }),
     z.object({ type: z.enum(["ip_net"]), value: IpNet }),
-  ])
+  ]),
 );
 
 /**
@@ -3006,7 +3012,7 @@ export const VpcFirewallRuleHostFilter = z.preprocess(
  */
 export const VpcFirewallRuleProtocol = z.preprocess(
   processResponseBody,
-  z.enum(["TCP", "UDP", "ICMP"])
+  z.enum(["TCP", "UDP", "ICMP"]),
 );
 
 /**
@@ -3018,12 +3024,12 @@ export const VpcFirewallRuleFilter = z.preprocess(
     hosts: VpcFirewallRuleHostFilter.array().optional(),
     ports: L4PortRange.array().optional(),
     protocols: VpcFirewallRuleProtocol.array().optional(),
-  })
+  }),
 );
 
 export const VpcFirewallRuleStatus = z.preprocess(
   processResponseBody,
-  z.enum(["disabled", "enabled"])
+  z.enum(["disabled", "enabled"]),
 );
 
 /**
@@ -3037,7 +3043,7 @@ export const VpcFirewallRuleTarget = z.preprocess(
     z.object({ type: z.enum(["instance"]), value: Name }),
     z.object({ type: z.enum(["ip"]), value: z.string().ip() }),
     z.object({ type: z.enum(["ip_net"]), value: IpNet }),
-  ])
+  ]),
 );
 
 /**
@@ -3058,7 +3064,7 @@ export const VpcFirewallRule = z.preprocess(
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
     vpcId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -3075,7 +3081,7 @@ export const VpcFirewallRuleUpdate = z.preprocess(
     priority: z.number().min(0).max(65535),
     status: VpcFirewallRuleStatus,
     targets: VpcFirewallRuleTarget.array(),
-  })
+  }),
 );
 
 /**
@@ -3083,7 +3089,7 @@ export const VpcFirewallRuleUpdate = z.preprocess(
  */
 export const VpcFirewallRuleUpdateParams = z.preprocess(
   processResponseBody,
-  z.object({ rules: VpcFirewallRuleUpdate.array() })
+  z.object({ rules: VpcFirewallRuleUpdate.array() }),
 );
 
 /**
@@ -3091,7 +3097,7 @@ export const VpcFirewallRuleUpdateParams = z.preprocess(
  */
 export const VpcFirewallRules = z.preprocess(
   processResponseBody,
-  z.object({ rules: VpcFirewallRule.array() })
+  z.object({ rules: VpcFirewallRule.array() }),
 );
 
 /**
@@ -3099,7 +3105,7 @@ export const VpcFirewallRules = z.preprocess(
  */
 export const VpcResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: Vpc.array(), nextPage: z.string().optional() })
+  z.object({ items: Vpc.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -3116,7 +3122,7 @@ export const VpcSubnet = z.preprocess(
     timeCreated: z.coerce.date(),
     timeModified: z.coerce.date(),
     vpcId: z.string().uuid(),
-  })
+  }),
 );
 
 /**
@@ -3129,7 +3135,7 @@ export const VpcSubnetCreate = z.preprocess(
     ipv4Block: Ipv4Net,
     ipv6Block: Ipv6Net.optional(),
     name: Name,
-  })
+  }),
 );
 
 /**
@@ -3137,7 +3143,7 @@ export const VpcSubnetCreate = z.preprocess(
  */
 export const VpcSubnetResultsPage = z.preprocess(
   processResponseBody,
-  z.object({ items: VpcSubnet.array(), nextPage: z.string().optional() })
+  z.object({ items: VpcSubnet.array(), nextPage: z.string().optional() }),
 );
 
 /**
@@ -3145,7 +3151,7 @@ export const VpcSubnetResultsPage = z.preprocess(
  */
 export const VpcSubnetUpdate = z.preprocess(
   processResponseBody,
-  z.object({ description: z.string().optional(), name: Name.optional() })
+  z.object({ description: z.string().optional(), name: Name.optional() }),
 );
 
 /**
@@ -3157,7 +3163,7 @@ export const VpcUpdate = z.preprocess(
     description: z.string().optional(),
     dnsName: Name.optional(),
     name: Name.optional(),
-  })
+  }),
 );
 
 /**
@@ -3165,12 +3171,12 @@ export const VpcUpdate = z.preprocess(
  */
 export const NameOrIdSortMode = z.preprocess(
   processResponseBody,
-  z.enum(["name_ascending", "name_descending", "id_ascending"])
+  z.enum(["name_ascending", "name_descending", "id_ascending"]),
 );
 
 export const DiskMetricName = z.preprocess(
   processResponseBody,
-  z.enum(["activated", "flush", "read", "read_bytes", "write", "write_bytes"])
+  z.enum(["activated", "flush", "read", "read_bytes", "write", "write_bytes"]),
 );
 
 /**
@@ -3178,7 +3184,7 @@ export const DiskMetricName = z.preprocess(
  */
 export const PaginationOrder = z.preprocess(
   processResponseBody,
-  z.enum(["ascending", "descending"])
+  z.enum(["ascending", "descending"]),
 );
 
 /**
@@ -3188,7 +3194,7 @@ export const PaginationOrder = z.preprocess(
  */
 export const IdSortMode = z.preprocess(
   processResponseBody,
-  z.enum(["id_ascending"])
+  z.enum(["id_ascending"]),
 );
 
 export const SystemMetricName = z.preprocess(
@@ -3197,7 +3203,7 @@ export const SystemMetricName = z.preprocess(
     "virtual_disk_space_provisioned",
     "cpus_provisioned",
     "ram_provisioned",
-  ])
+  ]),
 );
 
 /**
@@ -3207,7 +3213,7 @@ export const SystemMetricName = z.preprocess(
  */
 export const NameSortMode = z.preprocess(
   processResponseBody,
-  z.enum(["name_ascending"])
+  z.enum(["name_ascending"]),
 );
 
 export const DeviceAuthRequestParams = z.preprocess(
@@ -3215,7 +3221,7 @@ export const DeviceAuthRequestParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const DeviceAuthConfirmParams = z.preprocess(
@@ -3223,7 +3229,7 @@ export const DeviceAuthConfirmParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const DeviceAccessTokenParams = z.preprocess(
@@ -3231,7 +3237,7 @@ export const DeviceAccessTokenParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ProbeListParams = z.preprocess(
@@ -3244,7 +3250,7 @@ export const ProbeListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const ProbeCreateParams = z.preprocess(
@@ -3254,7 +3260,7 @@ export const ProbeCreateParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const ProbeViewParams = z.preprocess(
@@ -3266,7 +3272,7 @@ export const ProbeViewParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const ProbeDeleteParams = z.preprocess(
@@ -3278,7 +3284,7 @@ export const ProbeDeleteParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const LoginSamlParams = z.preprocess(
@@ -3289,7 +3295,7 @@ export const LoginSamlParams = z.preprocess(
       siloName: Name,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const CertificateListParams = z.preprocess(
@@ -3301,7 +3307,7 @@ export const CertificateListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const CertificateCreateParams = z.preprocess(
@@ -3309,7 +3315,7 @@ export const CertificateCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const CertificateViewParams = z.preprocess(
@@ -3319,7 +3325,7 @@ export const CertificateViewParams = z.preprocess(
       certificate: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const CertificateDeleteParams = z.preprocess(
@@ -3329,7 +3335,7 @@ export const CertificateDeleteParams = z.preprocess(
       certificate: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const DiskListParams = z.preprocess(
@@ -3342,7 +3348,7 @@ export const DiskListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const DiskCreateParams = z.preprocess(
@@ -3352,7 +3358,7 @@ export const DiskCreateParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const DiskViewParams = z.preprocess(
@@ -3364,7 +3370,7 @@ export const DiskViewParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const DiskDeleteParams = z.preprocess(
@@ -3376,7 +3382,7 @@ export const DiskDeleteParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const DiskBulkWriteImportParams = z.preprocess(
@@ -3388,7 +3394,7 @@ export const DiskBulkWriteImportParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const DiskBulkWriteImportStartParams = z.preprocess(
@@ -3400,7 +3406,7 @@ export const DiskBulkWriteImportStartParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const DiskBulkWriteImportStopParams = z.preprocess(
@@ -3412,7 +3418,7 @@ export const DiskBulkWriteImportStopParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const DiskFinalizeImportParams = z.preprocess(
@@ -3424,7 +3430,7 @@ export const DiskFinalizeImportParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const DiskMetricsListParams = z.preprocess(
@@ -3442,7 +3448,7 @@ export const DiskMetricsListParams = z.preprocess(
       startTime: z.coerce.date().optional(),
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const FloatingIpListParams = z.preprocess(
@@ -3455,7 +3461,7 @@ export const FloatingIpListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const FloatingIpCreateParams = z.preprocess(
@@ -3465,7 +3471,7 @@ export const FloatingIpCreateParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const FloatingIpViewParams = z.preprocess(
@@ -3477,7 +3483,7 @@ export const FloatingIpViewParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const FloatingIpUpdateParams = z.preprocess(
@@ -3489,7 +3495,7 @@ export const FloatingIpUpdateParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const FloatingIpDeleteParams = z.preprocess(
@@ -3501,7 +3507,7 @@ export const FloatingIpDeleteParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const FloatingIpAttachParams = z.preprocess(
@@ -3513,7 +3519,7 @@ export const FloatingIpAttachParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const FloatingIpDetachParams = z.preprocess(
@@ -3525,7 +3531,7 @@ export const FloatingIpDetachParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const GroupListParams = z.preprocess(
@@ -3537,7 +3543,7 @@ export const GroupListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const GroupViewParams = z.preprocess(
@@ -3547,7 +3553,7 @@ export const GroupViewParams = z.preprocess(
       groupId: z.string().uuid(),
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ImageListParams = z.preprocess(
@@ -3560,7 +3566,7 @@ export const ImageListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const ImageCreateParams = z.preprocess(
@@ -3570,7 +3576,7 @@ export const ImageCreateParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const ImageViewParams = z.preprocess(
@@ -3582,7 +3588,7 @@ export const ImageViewParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const ImageDeleteParams = z.preprocess(
@@ -3594,7 +3600,7 @@ export const ImageDeleteParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const ImageDemoteParams = z.preprocess(
@@ -3606,7 +3612,7 @@ export const ImageDemoteParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const ImagePromoteParams = z.preprocess(
@@ -3618,7 +3624,7 @@ export const ImagePromoteParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceListParams = z.preprocess(
@@ -3631,7 +3637,7 @@ export const InstanceListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceCreateParams = z.preprocess(
@@ -3641,7 +3647,7 @@ export const InstanceCreateParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const InstanceViewParams = z.preprocess(
@@ -3653,7 +3659,7 @@ export const InstanceViewParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceDeleteParams = z.preprocess(
@@ -3665,7 +3671,7 @@ export const InstanceDeleteParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceDiskListParams = z.preprocess(
@@ -3680,7 +3686,7 @@ export const InstanceDiskListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceDiskAttachParams = z.preprocess(
@@ -3692,7 +3698,7 @@ export const InstanceDiskAttachParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceDiskDetachParams = z.preprocess(
@@ -3704,7 +3710,7 @@ export const InstanceDiskDetachParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceExternalIpListParams = z.preprocess(
@@ -3716,7 +3722,7 @@ export const InstanceExternalIpListParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceEphemeralIpAttachParams = z.preprocess(
@@ -3728,7 +3734,7 @@ export const InstanceEphemeralIpAttachParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceEphemeralIpDetachParams = z.preprocess(
@@ -3740,7 +3746,7 @@ export const InstanceEphemeralIpDetachParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceMigrateParams = z.preprocess(
@@ -3752,7 +3758,7 @@ export const InstanceMigrateParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceRebootParams = z.preprocess(
@@ -3764,7 +3770,7 @@ export const InstanceRebootParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceSerialConsoleParams = z.preprocess(
@@ -3779,7 +3785,7 @@ export const InstanceSerialConsoleParams = z.preprocess(
       mostRecent: z.number().min(0).optional(),
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceSerialConsoleStreamParams = z.preprocess(
@@ -3792,7 +3798,7 @@ export const InstanceSerialConsoleStreamParams = z.preprocess(
       mostRecent: z.number().min(0).optional(),
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceSshPublicKeyListParams = z.preprocess(
@@ -3807,7 +3813,7 @@ export const InstanceSshPublicKeyListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceStartParams = z.preprocess(
@@ -3819,7 +3825,7 @@ export const InstanceStartParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceStopParams = z.preprocess(
@@ -3831,7 +3837,7 @@ export const InstanceStopParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const ProjectIpPoolListParams = z.preprocess(
@@ -3843,7 +3849,7 @@ export const ProjectIpPoolListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const ProjectIpPoolViewParams = z.preprocess(
@@ -3853,7 +3859,7 @@ export const ProjectIpPoolViewParams = z.preprocess(
       pool: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const LoginLocalParams = z.preprocess(
@@ -3863,7 +3869,7 @@ export const LoginLocalParams = z.preprocess(
       siloName: Name,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const LogoutParams = z.preprocess(
@@ -3871,7 +3877,7 @@ export const LogoutParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const CurrentUserViewParams = z.preprocess(
@@ -3879,7 +3885,7 @@ export const CurrentUserViewParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const CurrentUserGroupsParams = z.preprocess(
@@ -3891,7 +3897,7 @@ export const CurrentUserGroupsParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const CurrentUserSshKeyListParams = z.preprocess(
@@ -3903,7 +3909,7 @@ export const CurrentUserSshKeyListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const CurrentUserSshKeyCreateParams = z.preprocess(
@@ -3911,7 +3917,7 @@ export const CurrentUserSshKeyCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const CurrentUserSshKeyViewParams = z.preprocess(
@@ -3921,7 +3927,7 @@ export const CurrentUserSshKeyViewParams = z.preprocess(
       sshKey: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const CurrentUserSshKeyDeleteParams = z.preprocess(
@@ -3931,7 +3937,7 @@ export const CurrentUserSshKeyDeleteParams = z.preprocess(
       sshKey: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloMetricParams = z.preprocess(
@@ -3948,7 +3954,7 @@ export const SiloMetricParams = z.preprocess(
       startTime: z.coerce.date().optional(),
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceNetworkInterfaceListParams = z.preprocess(
@@ -3962,7 +3968,7 @@ export const InstanceNetworkInterfaceListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceNetworkInterfaceCreateParams = z.preprocess(
@@ -3973,7 +3979,7 @@ export const InstanceNetworkInterfaceCreateParams = z.preprocess(
       instance: NameOrId,
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceNetworkInterfaceViewParams = z.preprocess(
@@ -3986,7 +3992,7 @@ export const InstanceNetworkInterfaceViewParams = z.preprocess(
       instance: NameOrId.optional(),
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceNetworkInterfaceUpdateParams = z.preprocess(
@@ -3999,7 +4005,7 @@ export const InstanceNetworkInterfaceUpdateParams = z.preprocess(
       instance: NameOrId.optional(),
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const InstanceNetworkInterfaceDeleteParams = z.preprocess(
@@ -4012,7 +4018,7 @@ export const InstanceNetworkInterfaceDeleteParams = z.preprocess(
       instance: NameOrId.optional(),
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const PingParams = z.preprocess(
@@ -4020,7 +4026,7 @@ export const PingParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const PolicyViewParams = z.preprocess(
@@ -4028,7 +4034,7 @@ export const PolicyViewParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const PolicyUpdateParams = z.preprocess(
@@ -4036,7 +4042,7 @@ export const PolicyUpdateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ProjectListParams = z.preprocess(
@@ -4048,7 +4054,7 @@ export const ProjectListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const ProjectCreateParams = z.preprocess(
@@ -4056,7 +4062,7 @@ export const ProjectCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ProjectViewParams = z.preprocess(
@@ -4066,7 +4072,7 @@ export const ProjectViewParams = z.preprocess(
       project: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ProjectUpdateParams = z.preprocess(
@@ -4076,7 +4082,7 @@ export const ProjectUpdateParams = z.preprocess(
       project: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ProjectDeleteParams = z.preprocess(
@@ -4086,7 +4092,7 @@ export const ProjectDeleteParams = z.preprocess(
       project: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ProjectPolicyViewParams = z.preprocess(
@@ -4096,7 +4102,7 @@ export const ProjectPolicyViewParams = z.preprocess(
       project: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const ProjectPolicyUpdateParams = z.preprocess(
@@ -4106,7 +4112,7 @@ export const ProjectPolicyUpdateParams = z.preprocess(
       project: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SnapshotListParams = z.preprocess(
@@ -4119,7 +4125,7 @@ export const SnapshotListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SnapshotCreateParams = z.preprocess(
@@ -4129,7 +4135,7 @@ export const SnapshotCreateParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const SnapshotViewParams = z.preprocess(
@@ -4141,7 +4147,7 @@ export const SnapshotViewParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const SnapshotDeleteParams = z.preprocess(
@@ -4153,7 +4159,7 @@ export const SnapshotDeleteParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const PhysicalDiskListParams = z.preprocess(
@@ -4165,7 +4171,7 @@ export const PhysicalDiskListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const RackListParams = z.preprocess(
@@ -4177,7 +4183,7 @@ export const RackListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const RackViewParams = z.preprocess(
@@ -4187,7 +4193,7 @@ export const RackViewParams = z.preprocess(
       rackId: z.string().uuid(),
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SledListParams = z.preprocess(
@@ -4199,7 +4205,7 @@ export const SledListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SledAddParams = z.preprocess(
@@ -4207,7 +4213,7 @@ export const SledAddParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SledViewParams = z.preprocess(
@@ -4217,7 +4223,7 @@ export const SledViewParams = z.preprocess(
       sledId: z.string().uuid(),
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SledPhysicalDiskListParams = z.preprocess(
@@ -4231,7 +4237,7 @@ export const SledPhysicalDiskListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SledInstanceListParams = z.preprocess(
@@ -4245,7 +4251,7 @@ export const SledInstanceListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SledSetProvisionPolicyParams = z.preprocess(
@@ -4255,7 +4261,7 @@ export const SledSetProvisionPolicyParams = z.preprocess(
       sledId: z.string().uuid(),
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SledListUninitializedParams = z.preprocess(
@@ -4266,7 +4272,7 @@ export const SledListUninitializedParams = z.preprocess(
       limit: z.number().min(1).max(4294967295).optional(),
       pageToken: z.string().optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingSwitchPortListParams = z.preprocess(
@@ -4279,7 +4285,7 @@ export const NetworkingSwitchPortListParams = z.preprocess(
       sortBy: IdSortMode.optional(),
       switchPortId: z.string().uuid().optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingSwitchPortApplySettingsParams = z.preprocess(
@@ -4292,7 +4298,7 @@ export const NetworkingSwitchPortApplySettingsParams = z.preprocess(
       rackId: z.string().uuid(),
       switchLocation: Name,
     }),
-  })
+  }),
 );
 
 export const NetworkingSwitchPortClearSettingsParams = z.preprocess(
@@ -4305,7 +4311,7 @@ export const NetworkingSwitchPortClearSettingsParams = z.preprocess(
       rackId: z.string().uuid(),
       switchLocation: Name,
     }),
-  })
+  }),
 );
 
 export const SwitchListParams = z.preprocess(
@@ -4317,7 +4323,7 @@ export const SwitchListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SwitchViewParams = z.preprocess(
@@ -4327,7 +4333,7 @@ export const SwitchViewParams = z.preprocess(
       switchId: z.string().uuid(),
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloIdentityProviderListParams = z.preprocess(
@@ -4340,7 +4346,7 @@ export const SiloIdentityProviderListParams = z.preprocess(
       silo: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const LocalIdpUserCreateParams = z.preprocess(
@@ -4350,7 +4356,7 @@ export const LocalIdpUserCreateParams = z.preprocess(
     query: z.object({
       silo: NameOrId,
     }),
-  })
+  }),
 );
 
 export const LocalIdpUserDeleteParams = z.preprocess(
@@ -4362,7 +4368,7 @@ export const LocalIdpUserDeleteParams = z.preprocess(
     query: z.object({
       silo: NameOrId,
     }),
-  })
+  }),
 );
 
 export const LocalIdpUserSetPasswordParams = z.preprocess(
@@ -4374,7 +4380,7 @@ export const LocalIdpUserSetPasswordParams = z.preprocess(
     query: z.object({
       silo: NameOrId,
     }),
-  })
+  }),
 );
 
 export const SamlIdentityProviderCreateParams = z.preprocess(
@@ -4384,7 +4390,7 @@ export const SamlIdentityProviderCreateParams = z.preprocess(
     query: z.object({
       silo: NameOrId,
     }),
-  })
+  }),
 );
 
 export const SamlIdentityProviderViewParams = z.preprocess(
@@ -4396,7 +4402,7 @@ export const SamlIdentityProviderViewParams = z.preprocess(
     query: z.object({
       silo: NameOrId,
     }),
-  })
+  }),
 );
 
 export const IpPoolListParams = z.preprocess(
@@ -4408,7 +4414,7 @@ export const IpPoolListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const IpPoolCreateParams = z.preprocess(
@@ -4416,7 +4422,7 @@ export const IpPoolCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolViewParams = z.preprocess(
@@ -4426,7 +4432,7 @@ export const IpPoolViewParams = z.preprocess(
       pool: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolUpdateParams = z.preprocess(
@@ -4436,7 +4442,7 @@ export const IpPoolUpdateParams = z.preprocess(
       pool: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolDeleteParams = z.preprocess(
@@ -4446,7 +4452,7 @@ export const IpPoolDeleteParams = z.preprocess(
       pool: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolRangeListParams = z.preprocess(
@@ -4459,7 +4465,7 @@ export const IpPoolRangeListParams = z.preprocess(
       limit: z.number().min(1).max(4294967295).optional(),
       pageToken: z.string().optional(),
     }),
-  })
+  }),
 );
 
 export const IpPoolRangeAddParams = z.preprocess(
@@ -4469,7 +4475,7 @@ export const IpPoolRangeAddParams = z.preprocess(
       pool: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolRangeRemoveParams = z.preprocess(
@@ -4479,7 +4485,7 @@ export const IpPoolRangeRemoveParams = z.preprocess(
       pool: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolSiloListParams = z.preprocess(
@@ -4493,7 +4499,7 @@ export const IpPoolSiloListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const IpPoolSiloLinkParams = z.preprocess(
@@ -4503,7 +4509,7 @@ export const IpPoolSiloLinkParams = z.preprocess(
       pool: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolSiloUpdateParams = z.preprocess(
@@ -4514,7 +4520,7 @@ export const IpPoolSiloUpdateParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolSiloUnlinkParams = z.preprocess(
@@ -4525,7 +4531,7 @@ export const IpPoolSiloUnlinkParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolServiceViewParams = z.preprocess(
@@ -4533,7 +4539,7 @@ export const IpPoolServiceViewParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolServiceRangeListParams = z.preprocess(
@@ -4544,7 +4550,7 @@ export const IpPoolServiceRangeListParams = z.preprocess(
       limit: z.number().min(1).max(4294967295).optional(),
       pageToken: z.string().optional(),
     }),
-  })
+  }),
 );
 
 export const IpPoolServiceRangeAddParams = z.preprocess(
@@ -4552,7 +4558,7 @@ export const IpPoolServiceRangeAddParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const IpPoolServiceRangeRemoveParams = z.preprocess(
@@ -4560,7 +4566,7 @@ export const IpPoolServiceRangeRemoveParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SystemMetricParams = z.preprocess(
@@ -4577,7 +4583,7 @@ export const SystemMetricParams = z.preprocess(
       startTime: z.coerce.date().optional(),
       silo: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingAddressLotListParams = z.preprocess(
@@ -4589,7 +4595,7 @@ export const NetworkingAddressLotListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingAddressLotCreateParams = z.preprocess(
@@ -4597,7 +4603,7 @@ export const NetworkingAddressLotCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingAddressLotDeleteParams = z.preprocess(
@@ -4607,7 +4613,7 @@ export const NetworkingAddressLotDeleteParams = z.preprocess(
       addressLot: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingAddressLotBlockListParams = z.preprocess(
@@ -4621,7 +4627,7 @@ export const NetworkingAddressLotBlockListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingBfdDisableParams = z.preprocess(
@@ -4629,7 +4635,7 @@ export const NetworkingBfdDisableParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingBfdEnableParams = z.preprocess(
@@ -4637,7 +4643,7 @@ export const NetworkingBfdEnableParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingBfdStatusParams = z.preprocess(
@@ -4645,7 +4651,7 @@ export const NetworkingBfdStatusParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingBgpConfigListParams = z.preprocess(
@@ -4658,7 +4664,7 @@ export const NetworkingBgpConfigListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingBgpConfigCreateParams = z.preprocess(
@@ -4666,7 +4672,7 @@ export const NetworkingBgpConfigCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingBgpConfigDeleteParams = z.preprocess(
@@ -4676,7 +4682,7 @@ export const NetworkingBgpConfigDeleteParams = z.preprocess(
     query: z.object({
       nameOrId: NameOrId,
     }),
-  })
+  }),
 );
 
 export const NetworkingBgpAnnounceSetListParams = z.preprocess(
@@ -4686,7 +4692,7 @@ export const NetworkingBgpAnnounceSetListParams = z.preprocess(
     query: z.object({
       nameOrId: NameOrId,
     }),
-  })
+  }),
 );
 
 export const NetworkingBgpAnnounceSetCreateParams = z.preprocess(
@@ -4694,7 +4700,7 @@ export const NetworkingBgpAnnounceSetCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingBgpAnnounceSetDeleteParams = z.preprocess(
@@ -4704,7 +4710,7 @@ export const NetworkingBgpAnnounceSetDeleteParams = z.preprocess(
     query: z.object({
       nameOrId: NameOrId,
     }),
-  })
+  }),
 );
 
 export const NetworkingBgpImportedRoutesIpv4Params = z.preprocess(
@@ -4714,7 +4720,7 @@ export const NetworkingBgpImportedRoutesIpv4Params = z.preprocess(
     query: z.object({
       asn: z.number().min(0).max(4294967295),
     }),
-  })
+  }),
 );
 
 export const NetworkingBgpStatusParams = z.preprocess(
@@ -4722,7 +4728,7 @@ export const NetworkingBgpStatusParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingLoopbackAddressListParams = z.preprocess(
@@ -4734,7 +4740,7 @@ export const NetworkingLoopbackAddressListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingLoopbackAddressCreateParams = z.preprocess(
@@ -4742,7 +4748,7 @@ export const NetworkingLoopbackAddressCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingLoopbackAddressDeleteParams = z.preprocess(
@@ -4755,7 +4761,7 @@ export const NetworkingLoopbackAddressDeleteParams = z.preprocess(
       switchLocation: Name,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingSwitchPortSettingsListParams = z.preprocess(
@@ -4768,7 +4774,7 @@ export const NetworkingSwitchPortSettingsListParams = z.preprocess(
       portSettings: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingSwitchPortSettingsCreateParams = z.preprocess(
@@ -4776,7 +4782,7 @@ export const NetworkingSwitchPortSettingsCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const NetworkingSwitchPortSettingsDeleteParams = z.preprocess(
@@ -4786,7 +4792,7 @@ export const NetworkingSwitchPortSettingsDeleteParams = z.preprocess(
     query: z.object({
       portSettings: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const NetworkingSwitchPortSettingsViewParams = z.preprocess(
@@ -4796,7 +4802,7 @@ export const NetworkingSwitchPortSettingsViewParams = z.preprocess(
       port: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SystemPolicyViewParams = z.preprocess(
@@ -4804,7 +4810,7 @@ export const SystemPolicyViewParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SystemPolicyUpdateParams = z.preprocess(
@@ -4812,7 +4818,7 @@ export const SystemPolicyUpdateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const RoleListParams = z.preprocess(
@@ -4823,7 +4829,7 @@ export const RoleListParams = z.preprocess(
       limit: z.number().min(1).max(4294967295).optional(),
       pageToken: z.string().optional(),
     }),
-  })
+  }),
 );
 
 export const RoleViewParams = z.preprocess(
@@ -4833,7 +4839,7 @@ export const RoleViewParams = z.preprocess(
       roleName: z.string(),
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SystemQuotasListParams = z.preprocess(
@@ -4845,7 +4851,7 @@ export const SystemQuotasListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SiloListParams = z.preprocess(
@@ -4857,7 +4863,7 @@ export const SiloListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SiloCreateParams = z.preprocess(
@@ -4865,7 +4871,7 @@ export const SiloCreateParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloViewParams = z.preprocess(
@@ -4875,7 +4881,7 @@ export const SiloViewParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloDeleteParams = z.preprocess(
@@ -4885,7 +4891,7 @@ export const SiloDeleteParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloIpPoolListParams = z.preprocess(
@@ -4899,7 +4905,7 @@ export const SiloIpPoolListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SiloPolicyViewParams = z.preprocess(
@@ -4909,7 +4915,7 @@ export const SiloPolicyViewParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloPolicyUpdateParams = z.preprocess(
@@ -4919,7 +4925,7 @@ export const SiloPolicyUpdateParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloQuotasViewParams = z.preprocess(
@@ -4929,7 +4935,7 @@ export const SiloQuotasViewParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloQuotasUpdateParams = z.preprocess(
@@ -4939,7 +4945,7 @@ export const SiloQuotasUpdateParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloUserListParams = z.preprocess(
@@ -4952,7 +4958,7 @@ export const SiloUserListParams = z.preprocess(
       silo: NameOrId.optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SiloUserViewParams = z.preprocess(
@@ -4964,7 +4970,7 @@ export const SiloUserViewParams = z.preprocess(
     query: z.object({
       silo: NameOrId,
     }),
-  })
+  }),
 );
 
 export const UserBuiltinListParams = z.preprocess(
@@ -4976,7 +4982,7 @@ export const UserBuiltinListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const UserBuiltinViewParams = z.preprocess(
@@ -4986,7 +4992,7 @@ export const UserBuiltinViewParams = z.preprocess(
       user: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const SiloUtilizationListParams = z.preprocess(
@@ -4998,7 +5004,7 @@ export const SiloUtilizationListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const SiloUtilizationViewParams = z.preprocess(
@@ -5008,7 +5014,7 @@ export const SiloUtilizationViewParams = z.preprocess(
       silo: NameOrId,
     }),
     query: z.object({}),
-  })
+  }),
 );
 
 export const UserListParams = z.preprocess(
@@ -5021,7 +5027,7 @@ export const UserListParams = z.preprocess(
       pageToken: z.string().optional(),
       sortBy: IdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const UtilizationViewParams = z.preprocess(
@@ -5029,7 +5035,7 @@ export const UtilizationViewParams = z.preprocess(
   z.object({
     path: z.object({}),
     query: z.object({}),
-  })
+  }),
 );
 
 export const VpcFirewallRulesViewParams = z.preprocess(
@@ -5040,7 +5046,7 @@ export const VpcFirewallRulesViewParams = z.preprocess(
       project: NameOrId.optional(),
       vpc: NameOrId,
     }),
-  })
+  }),
 );
 
 export const VpcFirewallRulesUpdateParams = z.preprocess(
@@ -5051,7 +5057,7 @@ export const VpcFirewallRulesUpdateParams = z.preprocess(
       project: NameOrId.optional(),
       vpc: NameOrId,
     }),
-  })
+  }),
 );
 
 export const VpcSubnetListParams = z.preprocess(
@@ -5065,7 +5071,7 @@ export const VpcSubnetListParams = z.preprocess(
       sortBy: NameOrIdSortMode.optional(),
       vpc: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcSubnetCreateParams = z.preprocess(
@@ -5076,7 +5082,7 @@ export const VpcSubnetCreateParams = z.preprocess(
       project: NameOrId.optional(),
       vpc: NameOrId,
     }),
-  })
+  }),
 );
 
 export const VpcSubnetViewParams = z.preprocess(
@@ -5089,7 +5095,7 @@ export const VpcSubnetViewParams = z.preprocess(
       project: NameOrId.optional(),
       vpc: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcSubnetUpdateParams = z.preprocess(
@@ -5102,7 +5108,7 @@ export const VpcSubnetUpdateParams = z.preprocess(
       project: NameOrId.optional(),
       vpc: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcSubnetDeleteParams = z.preprocess(
@@ -5115,7 +5121,7 @@ export const VpcSubnetDeleteParams = z.preprocess(
       project: NameOrId.optional(),
       vpc: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcSubnetListNetworkInterfacesParams = z.preprocess(
@@ -5131,7 +5137,7 @@ export const VpcSubnetListNetworkInterfacesParams = z.preprocess(
       sortBy: NameOrIdSortMode.optional(),
       vpc: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcListParams = z.preprocess(
@@ -5144,7 +5150,7 @@ export const VpcListParams = z.preprocess(
       project: NameOrId.optional(),
       sortBy: NameOrIdSortMode.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcCreateParams = z.preprocess(
@@ -5154,7 +5160,7 @@ export const VpcCreateParams = z.preprocess(
     query: z.object({
       project: NameOrId,
     }),
-  })
+  }),
 );
 
 export const VpcViewParams = z.preprocess(
@@ -5166,7 +5172,7 @@ export const VpcViewParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcUpdateParams = z.preprocess(
@@ -5178,7 +5184,7 @@ export const VpcUpdateParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
 
 export const VpcDeleteParams = z.preprocess(
@@ -5190,5 +5196,5 @@ export const VpcDeleteParams = z.preprocess(
     query: z.object({
       project: NameOrId.optional(),
     }),
-  })
+  }),
 );
diff --git a/oxide-api/tsconfig.json b/oxide-api/tsconfig.json
new file mode 100644
index 0000000..da15fd8
--- /dev/null
+++ b/oxide-api/tsconfig.json
@@ -0,0 +1,17 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "noEmit": true,
+    "allowSyntheticDefaultImports": true,
+    "esModuleInterop": true,
+    "experimentalDecorators": true,
+    "lib": ["es2019", "dom", "DOM.Iterable"],
+    "module": "es2020",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "skipLibCheck": true,
+    "sourceMap": true,
+    "strict": true,
+    "target": "ES2020"
+  }
+}
diff --git a/.eslintrc.cjs b/oxide-openapi-gen-ts/.eslintrc.cjs
similarity index 100%
rename from .eslintrc.cjs
rename to oxide-openapi-gen-ts/.eslintrc.cjs
diff --git a/oxide-openapi-gen-ts/README.md b/oxide-openapi-gen-ts/README.md
new file mode 100644
index 0000000..079f703
--- /dev/null
+++ b/oxide-openapi-gen-ts/README.md
@@ -0,0 +1,58 @@
+# @oxide/openapi-gen-ts
+
+This is a TypeScript OpenAPI client generator built for use with
+schemas generated by [Dropshot](https://github.com/oxidecomputer/dropshot). It has
+not been tested on any other specs and is unlikely to handle them well.
+
+## Usage
+
+```sh
+npx @oxide/openapi-gen-ts@version <schema url or file> <output dir>
+```
+
+Note that fixing a version with `@0.1.0` is important because you don't want
+your generated output to between runs. See the Versioning section below for
+details.
+
+## Interesting files
+
+The core logic for looping over the spec and creating the methods is in
+[`src/client/api.ts`](./src/client/api.ts) and the mapping from
+OpenAPI schemas to TS types is in [`src/schema/types.ts`](./src/schema/types.ts). The mapping from OpenAPI schemas to Zod schemas is in
+[`src/schema/zod.ts`](./src/schema/zod.ts).
+
+The files in [`src/client/static/`](./src/client/static/) are copied over to
+the client as-is during generation. We generate several distinct pieces:
+
+| File                                            | Description                                                                                            |
+| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
+| [`Api.ts`](../api/src/Api.ts)                   | A [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)-based TS client to the Oxide API |
+| [`validate.ts`](../api/src/validate.ts)         | [Zod](https://github.com/colinhacks/zod) validators for API request and response types                 |
+| [`msw-handlers.ts`](../api/src/msw-handlers.ts) | Helpers used to build a mock API with [Mock Service Worker](https://mswjs.io/) in the console repo     |
+
+## Why a custom generator?
+
+We tried many existing generators, and while most worked in a basic sense, we
+found it hard to make customizations, whether through CLI flags, templates, or
+patching with [patch-package](https://github.com/ds300/patch-package). We
+decided to prototype our own TS generator after seeing other Oxide devs do the
+same for Rust ([progenitor](https://github.com/oxidecomputer/progenitor) and
+[oxide.rs](https://github.com/oxidecomputer/oxide.rs)) and Go
+([oxide.go](https://github.com/oxidecomputer/oxide.go)). It quickly became clear
+that a special-purpose generator could be dramatically simpler than a general
+one, so writing one was easier than existing generators made it look.
+
+The TypeScript client code will be written to `oxide-api/src`.
+
+## Versioning scheme
+
+Generator versions on npm are semver-ish. Breaking changes to the generator's
+own API (not the generated output) should be major releases. Currently, the
+generator has no programmatic API and can only be used as a CLI app (e.g.,
+through `npx`), so we will consider the CLI to be the external API.
+
+| Version bump | Example changes                                                |
+| ------------ | -------------------------------------------------------------- |
+| Major        | Breaking changes to CLI args or flags                          |
+| Minor        | Semantic changes (i.e., modulo formatting) to generated output |
+| Patch        | Internal changes or non-meaningful changes to generated output |
diff --git a/oxide-openapi-gen-ts/docs/releases.md b/oxide-openapi-gen-ts/docs/releases.md
new file mode 100644
index 0000000..9eaa3ba
--- /dev/null
+++ b/oxide-openapi-gen-ts/docs/releases.md
@@ -0,0 +1,25 @@
+# Releasing this library
+
+This is a spot for documentation not useful to the end user.
+
+## Publishing to npm
+
+This will change when we figure out automatic publishing from GH actions.
+
+```
+npm version <bump-type>
+
+# now commit and push that because we don't want to publish things that aren't
+# on github
+
+# now build and publish
+npm run build # runs tsup and outputs in dist
+npm publish
+```
+
+## Generating the client in this repo
+
+```bash
+# optional: update omicron sha in OMICRON_VERSION
+./tools/gen.sh
+```
diff --git a/package-lock.json b/oxide-openapi-gen-ts/package-lock.json
similarity index 82%
rename from package-lock.json
rename to oxide-openapi-gen-ts/package-lock.json
index fa96a92..9a9faa6 100644
--- a/package-lock.json
+++ b/oxide-openapi-gen-ts/package-lock.json
@@ -1,24 +1,32 @@
 {
-  "name": "@oxide/api",
-  "version": "0.0.1",
+  "name": "@oxide/openapi-gen-ts",
+  "version": "0.1.13",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
-      "name": "@oxide/api",
-      "version": "0.0.1",
+      "name": "@oxide/openapi-gen-ts",
+      "version": "0.1.13",
       "license": "MPL-2.0",
+      "dependencies": {
+        "minimist": "^1.2.8",
+        "prettier": "2.7.1",
+        "swagger-parser": "^10.0.3",
+        "ts-pattern": "^4.0.5"
+      },
+      "bin": {
+        "openapi-gen-ts": "dist/index.cjs"
+      },
       "devDependencies": {
+        "@types/minimist": "^1.2.5",
         "@types/node": "^18.7.20",
         "@typescript-eslint/eslint-plugin": "^6.13.1",
         "@typescript-eslint/parser": "^6.13.1",
         "eslint": "^8.55.0",
         "msw": "^2.0.9",
         "openapi-types": "^12.0.2",
-        "prettier": "2.7.1",
-        "swagger-parser": "^10.0.3",
-        "ts-pattern": "^4.0.5",
         "tsafe": "^1.1.1",
+        "tsup": "^8.0.2",
         "tsx": "^4.7.1",
         "type-fest": "^3.1.0",
         "typescript": "^5.2.2",
@@ -43,7 +51,6 @@
     },
     "node_modules/@apidevtools/json-schema-ref-parser": {
       "version": "9.0.9",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@jsdevtools/ono": "^7.1.3",
@@ -54,7 +61,6 @@
     },
     "node_modules/@apidevtools/openapi-schemas": {
       "version": "2.1.0",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=10"
@@ -62,12 +68,10 @@
     },
     "node_modules/@apidevtools/swagger-methods": {
       "version": "3.0.2",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/@apidevtools/swagger-parser": {
       "version": "10.0.3",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@apidevtools/json-schema-ref-parser": "^9.0.6",
@@ -565,6 +569,102 @@
       "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
       "dev": true
     },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true
+    },
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "dev": true,
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
     "node_modules/@jest/schemas": {
       "version": "29.6.3",
       "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
@@ -577,15 +677,56 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
       "dev": true
     },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
     "node_modules/@jsdevtools/ono": {
       "version": "7.1.3",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/@mswjs/cookies": {
@@ -668,10 +809,20 @@
       "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
       "dev": true
     },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
-      "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
+      "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
       "cpu": [
         "arm"
       ],
@@ -682,9 +833,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
-      "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
+      "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
       "cpu": [
         "arm64"
       ],
@@ -695,9 +846,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
-      "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
+      "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
       "cpu": [
         "arm64"
       ],
@@ -708,9 +859,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
-      "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
+      "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
       "cpu": [
         "x64"
       ],
@@ -721,9 +872,22 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
-      "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
+      "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz",
+      "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==",
       "cpu": [
         "arm"
       ],
@@ -734,9 +898,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
-      "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
+      "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
       "cpu": [
         "arm64"
       ],
@@ -747,9 +911,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
-      "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
+      "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
       "cpu": [
         "arm64"
       ],
@@ -759,10 +923,23 @@
         "linux"
       ]
     },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz",
+      "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
-      "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
+      "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
       "cpu": [
         "riscv64"
       ],
@@ -772,10 +949,23 @@
         "linux"
       ]
     },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz",
+      "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
-      "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
+      "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
       "cpu": [
         "x64"
       ],
@@ -786,9 +976,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
-      "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
+      "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
       "cpu": [
         "x64"
       ],
@@ -799,9 +989,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
-      "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
+      "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
       "cpu": [
         "arm64"
       ],
@@ -812,9 +1002,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
-      "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
+      "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
       "cpu": [
         "ia32"
       ],
@@ -825,9 +1015,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
-      "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
+      "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
       "cpu": [
         "x64"
       ],
@@ -894,7 +1084,12 @@
     "node_modules/@types/json-schema": {
       "version": "7.0.15",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
+    },
+    "node_modules/@types/minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
       "dev": true
     },
     "node_modules/@types/node": {
@@ -1327,6 +1522,12 @@
         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
+    "node_modules/any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+      "dev": true
+    },
     "node_modules/anymatch": {
       "version": "3.1.2",
       "dev": true,
@@ -1341,7 +1542,6 @@
     },
     "node_modules/argparse": {
       "version": "2.0.1",
-      "dev": true,
       "license": "Python-2.0"
     },
     "node_modules/array-union": {
@@ -1491,6 +1691,21 @@
       "optional": true,
       "peer": true
     },
+    "node_modules/bundle-require": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.3.tgz",
+      "integrity": "sha512-2iscZ3fcthP2vka4Y7j277YJevwmsby/FpFDwjgw34Nl7dtCpt7zz/4TexmHMzY6KZEih7En9ImlbbgUNNQGtA==",
+      "dev": true,
+      "dependencies": {
+        "load-tsconfig": "^0.2.3"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "esbuild": ">=0.17"
+      }
+    },
     "node_modules/cac": {
       "version": "6.7.14",
       "dev": true,
@@ -1515,7 +1730,6 @@
     },
     "node_modules/call-me-maybe": {
       "version": "1.0.1",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/callsites": {
@@ -1699,6 +1913,15 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "dev": true,
@@ -1932,6 +2155,12 @@
         "node": ">=12"
       }
     },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+      "dev": true
+    },
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -2268,6 +2497,29 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
     "node_modules/external-editor": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -2408,6 +2660,34 @@
       "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
       "dev": true
     },
+    "node_modules/foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/form-data": {
       "version": "2.5.1",
       "dev": true,
@@ -2492,6 +2772,18 @@
         "node": ">=4"
       }
     },
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/get-tsconfig": {
       "version": "4.7.3",
       "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
@@ -2737,6 +3029,15 @@
         "node": ">= 6"
       }
     },
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.17.0"
+      }
+    },
     "node_modules/iconv-lite": {
       "version": "0.6.3",
       "dev": true,
@@ -2931,6 +3232,18 @@
       "optional": true,
       "peer": true
     },
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-unicode-supported": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -2955,6 +3268,33 @@
       "dev": true,
       "license": "ISC"
     },
+    "node_modules/jackspeak": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+      "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+      "dev": true,
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/joycon": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+      "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/js-levenshtein": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
@@ -2972,7 +3312,6 @@
     },
     "node_modules/js-yaml": {
       "version": "4.1.0",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "argparse": "^2.0.1"
@@ -3117,6 +3456,33 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/lilconfig": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
+      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antonk52"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true
+    },
+    "node_modules/load-tsconfig": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+      "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+      "dev": true,
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      }
+    },
     "node_modules/local-pkg": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
@@ -3156,12 +3522,10 @@
     },
     "node_modules/lodash.get": {
       "version": "4.4.2",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.isequal": {
       "version": "4.5.0",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.merge": {
@@ -3170,6 +3534,12 @@
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
     },
+    "node_modules/lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+      "dev": true
+    },
     "node_modules/log-symbols": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -3286,6 +3656,23 @@
         "node": "*"
       }
     },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+      "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
     "node_modules/mlly": {
       "version": "1.6.1",
       "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz",
@@ -3369,8 +3756,19 @@
       "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
       "dev": true
     },
-    "node_modules/nanoid": {
-      "version": "3.3.7",
+    "node_modules/mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "dependencies": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.7",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
       "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
       "dev": true,
@@ -3422,6 +3820,18 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/nwsapi": {
       "version": "2.2.2",
       "dev": true,
@@ -3429,6 +3839,15 @@
       "optional": true,
       "peer": true
     },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/object-inspect": {
       "version": "1.12.2",
       "dev": true,
@@ -3464,8 +3883,7 @@
     "node_modules/openapi-types": {
       "version": "12.0.2",
       "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz",
-      "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==",
-      "dev": true
+      "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA=="
     },
     "node_modules/optionator": {
       "version": "0.8.3",
@@ -3636,6 +4054,31 @@
         "node": ">=8"
       }
     },
+    "node_modules/path-scurry": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
+      "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+      "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+      "dev": true,
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
     "node_modules/path-to-regexp": {
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
@@ -3681,6 +4124,15 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
+    "node_modules/pirates": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/pkg-types": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
@@ -3720,6 +4172,41 @@
         "node": "^10 || ^12 || >=14"
       }
     },
+    "node_modules/postcss-load-config": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "lilconfig": "^3.0.0",
+        "yaml": "^2.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      },
+      "peerDependencies": {
+        "postcss": ">=8.0.9",
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "postcss": {
+          "optional": true
+        },
+        "ts-node": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/prelude-ls": {
       "version": "1.1.2",
       "dev": true,
@@ -3731,7 +4218,6 @@
     },
     "node_modules/prettier": {
       "version": "2.7.1",
-      "dev": true,
       "license": "MIT",
       "bin": {
         "prettier": "bin-prettier.js"
@@ -3892,6 +4378,15 @@
       "optional": true,
       "peer": true
     },
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/resolve-pkg-maps": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
@@ -3938,6 +4433,41 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/rollup": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
+      "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "1.0.5"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.17.2",
+        "@rollup/rollup-android-arm64": "4.17.2",
+        "@rollup/rollup-darwin-arm64": "4.17.2",
+        "@rollup/rollup-darwin-x64": "4.17.2",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
+        "@rollup/rollup-linux-arm-musleabihf": "4.17.2",
+        "@rollup/rollup-linux-arm64-gnu": "4.17.2",
+        "@rollup/rollup-linux-arm64-musl": "4.17.2",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
+        "@rollup/rollup-linux-riscv64-gnu": "4.17.2",
+        "@rollup/rollup-linux-s390x-gnu": "4.17.2",
+        "@rollup/rollup-linux-x64-gnu": "4.17.2",
+        "@rollup/rollup-linux-x64-musl": "4.17.2",
+        "@rollup/rollup-win32-arm64-msvc": "4.17.2",
+        "@rollup/rollup-win32-ia32-msvc": "4.17.2",
+        "@rollup/rollup-win32-x64-msvc": "4.17.2",
+        "fsevents": "~2.3.2"
+      }
+    },
     "node_modules/run-async": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
@@ -4137,6 +4667,21 @@
         "node": ">=8"
       }
     },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -4149,6 +4694,28 @@
         "node": ">=8"
       }
     },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/strip-json-comments": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -4173,6 +4740,74 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
+    "node_modules/sucrase": {
+      "version": "3.35.0",
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "commander": "^4.0.0",
+        "glob": "^10.3.10",
+        "lines-and-columns": "^1.1.6",
+        "mz": "^2.7.0",
+        "pirates": "^4.0.1",
+        "ts-interface-checker": "^0.1.9"
+      },
+      "bin": {
+        "sucrase": "bin/sucrase",
+        "sucrase-node": "bin/sucrase-node"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/sucrase/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/sucrase/node_modules/glob": {
+      "version": "10.3.12",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
+      "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
+      "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.3.6",
+        "minimatch": "^9.0.1",
+        "minipass": "^7.0.4",
+        "path-scurry": "^1.10.2"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sucrase/node_modules/minimatch": {
+      "version": "9.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -4187,7 +4822,6 @@
     },
     "node_modules/swagger-parser": {
       "version": "10.0.3",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@apidevtools/swagger-parser": "10.0.3"
@@ -4264,6 +4898,27 @@
       "optional": true,
       "peer": true
     },
+    "node_modules/thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dev": true,
+      "dependencies": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "node_modules/thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+      "dev": true,
+      "dependencies": {
+        "thenify": ">= 3.1.0 < 4"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -4341,6 +4996,15 @@
       "optional": true,
       "peer": true
     },
+    "node_modules/tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true,
+      "bin": {
+        "tree-kill": "cli.js"
+      }
+    },
     "node_modules/ts-api-utils": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
@@ -4353,11 +5017,16 @@
         "typescript": ">=4.2.0"
       }
     },
+    "node_modules/ts-interface-checker": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+      "dev": true
+    },
     "node_modules/ts-pattern": {
       "version": "4.0.5",
       "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.0.5.tgz",
-      "integrity": "sha512-Bq44KCEt7JVaNLa148mBCJkcQf4l7jtLEBDuDdeuLynWDA+1a60P4D0rMkqSM9mOKLQbIWUddE9h3XKyKwBeqA==",
-      "dev": true
+      "integrity": "sha512-Bq44KCEt7JVaNLa148mBCJkcQf4l7jtLEBDuDdeuLynWDA+1a60P4D0rMkqSM9mOKLQbIWUddE9h3XKyKwBeqA=="
     },
     "node_modules/tsafe": {
       "version": "1.1.1",
@@ -4371,6 +5040,93 @@
       "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
       "dev": true
     },
+    "node_modules/tsup": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.2.tgz",
+      "integrity": "sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==",
+      "dev": true,
+      "dependencies": {
+        "bundle-require": "^4.0.0",
+        "cac": "^6.7.12",
+        "chokidar": "^3.5.1",
+        "debug": "^4.3.1",
+        "esbuild": "^0.19.2",
+        "execa": "^5.0.0",
+        "globby": "^11.0.3",
+        "joycon": "^3.0.1",
+        "postcss-load-config": "^4.0.1",
+        "resolve-from": "^5.0.0",
+        "rollup": "^4.0.2",
+        "source-map": "0.8.0-beta.0",
+        "sucrase": "^3.20.3",
+        "tree-kill": "^1.2.2"
+      },
+      "bin": {
+        "tsup": "dist/cli-default.js",
+        "tsup-node": "dist/cli-node.js"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@microsoft/api-extractor": "^7.36.0",
+        "@swc/core": "^1",
+        "postcss": "^8.4.12",
+        "typescript": ">=4.5.0"
+      },
+      "peerDependenciesMeta": {
+        "@microsoft/api-extractor": {
+          "optional": true
+        },
+        "@swc/core": {
+          "optional": true
+        },
+        "postcss": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tsup/node_modules/source-map": {
+      "version": "0.8.0-beta.0",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+      "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+      "dev": true,
+      "dependencies": {
+        "whatwg-url": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/tsup/node_modules/tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/tsup/node_modules/webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "dev": true
+    },
+    "node_modules/tsup/node_modules/whatwg-url": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+      "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+      "dev": true,
+      "dependencies": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
+      }
+    },
     "node_modules/tsx": {
       "version": "4.7.1",
       "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz",
@@ -4487,7 +5243,6 @@
     },
     "node_modules/validator": {
       "version": "13.7.0",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">= 0.10"
@@ -4570,38 +5325,6 @@
         "url": "https://opencollective.com/vitest"
       }
     },
-    "node_modules/vite/node_modules/rollup": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz",
-      "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==",
-      "dev": true,
-      "dependencies": {
-        "@types/estree": "1.0.5"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=18.0.0",
-        "npm": ">=8.0.0"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.13.0",
-        "@rollup/rollup-android-arm64": "4.13.0",
-        "@rollup/rollup-darwin-arm64": "4.13.0",
-        "@rollup/rollup-darwin-x64": "4.13.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.13.0",
-        "@rollup/rollup-linux-arm64-musl": "4.13.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.13.0",
-        "@rollup/rollup-linux-x64-gnu": "4.13.0",
-        "@rollup/rollup-linux-x64-musl": "4.13.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.13.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.13.0",
-        "@rollup/rollup-win32-x64-msvc": "4.13.0",
-        "fsevents": "~2.3.2"
-      }
-    },
     "node_modules/vitest": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz",
@@ -4951,6 +5674,24 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
     "node_modules/wrappy": {
       "version": "1.0.2",
       "dev": true,
@@ -5010,6 +5751,18 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "node_modules/yaml": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
+      "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
+      "dev": true,
+      "bin": {
+        "yaml": "bin.mjs"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/yargs": {
       "version": "17.6.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
@@ -5051,7 +5804,6 @@
     },
     "node_modules/z-schema": {
       "version": "5.0.2",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "lodash.get": "^4.4.2",
@@ -5070,7 +5822,6 @@
     },
     "node_modules/z-schema/node_modules/commander": {
       "version": "2.20.3",
-      "dev": true,
       "license": "MIT",
       "optional": true
     },
@@ -5093,7 +5844,6 @@
     },
     "@apidevtools/json-schema-ref-parser": {
       "version": "9.0.9",
-      "dev": true,
       "requires": {
         "@jsdevtools/ono": "^7.1.3",
         "@types/json-schema": "^7.0.6",
@@ -5102,16 +5852,13 @@
       }
     },
     "@apidevtools/openapi-schemas": {
-      "version": "2.1.0",
-      "dev": true
+      "version": "2.1.0"
     },
     "@apidevtools/swagger-methods": {
-      "version": "3.0.2",
-      "dev": true
+      "version": "3.0.2"
     },
     "@apidevtools/swagger-parser": {
       "version": "10.0.3",
-      "dev": true,
       "requires": {
         "@apidevtools/json-schema-ref-parser": "^9.0.6",
         "@apidevtools/openapi-schemas": "^2.0.4",
@@ -5370,6 +6117,71 @@
       "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
       "dev": true
     },
+    "@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "dev": true,
+      "requires": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+          "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "9.2.2",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+          "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+          "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+          "dev": true,
+          "requires": {
+            "eastasianwidth": "^0.2.0",
+            "emoji-regex": "^9.2.2",
+            "strip-ansi": "^7.0.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+          "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^6.0.1"
+          }
+        },
+        "wrap-ansi": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+          "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^6.1.0",
+            "string-width": "^5.0.1",
+            "strip-ansi": "^7.0.1"
+          }
+        }
+      }
+    },
     "@jest/schemas": {
       "version": "29.6.3",
       "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
@@ -5379,15 +6191,47 @@
         "@sinclair/typebox": "^0.27.8"
       }
     },
+    "@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true
+    },
+    "@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true
+    },
     "@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
       "dev": true
     },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
     "@jsdevtools/ono": {
-      "version": "7.1.3",
-      "dev": true
+      "version": "7.1.3"
     },
     "@mswjs/cookies": {
       "version": "1.1.0",
@@ -5451,94 +6295,122 @@
       "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
       "dev": true
     },
+    "@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "dev": true,
+      "optional": true
+    },
     "@rollup/rollup-android-arm-eabi": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
-      "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
+      "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-android-arm64": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
-      "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
+      "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-darwin-arm64": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
-      "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
+      "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-darwin-x64": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
-      "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
+      "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
-      "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
+      "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz",
+      "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
-      "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
+      "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-linux-arm64-musl": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
-      "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
+      "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz",
+      "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
-      "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
+      "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz",
+      "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-linux-x64-gnu": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
-      "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
+      "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-linux-x64-musl": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
-      "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
+      "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
-      "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
+      "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
-      "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
+      "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
       "dev": true,
       "optional": true
     },
     "@rollup/rollup-win32-x64-msvc": {
-      "version": "4.13.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
-      "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==",
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
+      "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
       "dev": true,
       "optional": true
     },
@@ -5593,7 +6465,12 @@
     "@types/json-schema": {
       "version": "7.0.15",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
+    },
+    "@types/minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
       "dev": true
     },
     "@types/node": {
@@ -5874,6 +6751,12 @@
         "color-convert": "^2.0.1"
       }
     },
+    "any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+      "dev": true
+    },
     "anymatch": {
       "version": "3.1.2",
       "dev": true,
@@ -5883,8 +6766,7 @@
       }
     },
     "argparse": {
-      "version": "2.0.1",
-      "dev": true
+      "version": "2.0.1"
     },
     "array-union": {
       "version": "2.1.0",
@@ -5983,6 +6865,15 @@
       "optional": true,
       "peer": true
     },
+    "bundle-require": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.3.tgz",
+      "integrity": "sha512-2iscZ3fcthP2vka4Y7j277YJevwmsby/FpFDwjgw34Nl7dtCpt7zz/4TexmHMzY6KZEih7En9ImlbbgUNNQGtA==",
+      "dev": true,
+      "requires": {
+        "load-tsconfig": "^0.2.3"
+      }
+    },
     "cac": {
       "version": "6.7.14",
       "dev": true
@@ -5998,8 +6889,7 @@
       }
     },
     "call-me-maybe": {
-      "version": "1.0.1",
-      "dev": true
+      "version": "1.0.1"
     },
     "callsites": {
       "version": "3.1.0",
@@ -6129,6 +7019,12 @@
         "delayed-stream": "~1.0.0"
       }
     },
+    "commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "dev": true
+    },
     "concat-map": {
       "version": "0.0.1",
       "dev": true
@@ -6299,6 +7195,12 @@
         "webidl-conversions": "^7.0.0"
       }
     },
+    "eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+      "dev": true
+    },
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -6537,6 +7439,23 @@
       "version": "2.0.3",
       "dev": true
     },
+    "execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      }
+    },
     "external-editor": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -6645,6 +7564,24 @@
       "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
       "dev": true
     },
+    "foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "dependencies": {
+        "signal-exit": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+          "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+          "dev": true
+        }
+      }
+    },
     "form-data": {
       "version": "2.5.1",
       "dev": true,
@@ -6702,6 +7639,12 @@
       "optional": true,
       "peer": true
     },
+    "get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true
+    },
     "get-tsconfig": {
       "version": "4.7.3",
       "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
@@ -6878,6 +7821,12 @@
         "debug": "4"
       }
     },
+    "human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true
+    },
     "iconv-lite": {
       "version": "0.6.3",
       "dev": true,
@@ -7010,6 +7959,12 @@
       "optional": true,
       "peer": true
     },
+    "is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true
+    },
     "is-unicode-supported": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -7026,6 +7981,22 @@
       "version": "2.0.0",
       "dev": true
     },
+    "jackspeak": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+      "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+      "dev": true,
+      "requires": {
+        "@isaacs/cliui": "^8.0.2",
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "joycon": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+      "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+      "dev": true
+    },
     "js-levenshtein": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
@@ -7040,7 +8011,6 @@
     },
     "js-yaml": {
       "version": "4.1.0",
-      "dev": true,
       "requires": {
         "argparse": "^2.0.1"
       }
@@ -7155,6 +8125,24 @@
         "type-check": "~0.3.2"
       }
     },
+    "lilconfig": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
+      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
+      "dev": true
+    },
+    "lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true
+    },
+    "load-tsconfig": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+      "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+      "dev": true
+    },
     "local-pkg": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
@@ -7181,12 +8169,10 @@
       "dev": true
     },
     "lodash.get": {
-      "version": "4.4.2",
-      "dev": true
+      "version": "4.4.2"
     },
     "lodash.isequal": {
-      "version": "4.5.0",
-      "dev": true
+      "version": "4.5.0"
     },
     "lodash.merge": {
       "version": "4.6.2",
@@ -7194,6 +8180,12 @@
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
     },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+      "dev": true
+    },
     "log-symbols": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -7273,6 +8265,17 @@
         "brace-expansion": "^1.1.7"
       }
     },
+    "minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+    },
+    "minipass": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+      "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+      "dev": true
+    },
     "mlly": {
       "version": "1.6.1",
       "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz",
@@ -7332,6 +8335,17 @@
       "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
       "dev": true
     },
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
     "nanoid": {
       "version": "3.3.7",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
@@ -7357,12 +8371,27 @@
       "version": "3.0.0",
       "dev": true
     },
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.0.0"
+      }
+    },
     "nwsapi": {
       "version": "2.2.2",
       "dev": true,
       "optional": true,
       "peer": true
     },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true
+    },
     "object-inspect": {
       "version": "1.12.2",
       "dev": true,
@@ -7386,8 +8415,7 @@
     "openapi-types": {
       "version": "12.0.2",
       "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz",
-      "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==",
-      "dev": true
+      "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA=="
     },
     "optionator": {
       "version": "0.8.3",
@@ -7505,6 +8533,24 @@
       "version": "3.1.1",
       "dev": true
     },
+    "path-scurry": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
+      "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "10.2.2",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+          "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+          "dev": true
+        }
+      }
+    },
     "path-to-regexp": {
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
@@ -7535,6 +8581,12 @@
       "version": "2.3.1",
       "dev": true
     },
+    "pirates": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+      "dev": true
+    },
     "pkg-types": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
@@ -7557,6 +8609,16 @@
         "source-map-js": "^1.1.0"
       }
     },
+    "postcss-load-config": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+      "dev": true,
+      "requires": {
+        "lilconfig": "^3.0.0",
+        "yaml": "^2.3.4"
+      }
+    },
     "prelude-ls": {
       "version": "1.1.2",
       "dev": true,
@@ -7564,8 +8626,7 @@
       "peer": true
     },
     "prettier": {
-      "version": "2.7.1",
-      "dev": true
+      "version": "2.7.1"
     },
     "pretty-format": {
       "version": "29.7.0",
@@ -7670,6 +8731,12 @@
       "optional": true,
       "peer": true
     },
+    "resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true
+    },
     "resolve-pkg-maps": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
@@ -7699,6 +8766,32 @@
         "glob": "^7.1.3"
       }
     },
+    "rollup": {
+      "version": "4.17.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
+      "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
+      "dev": true,
+      "requires": {
+        "@rollup/rollup-android-arm-eabi": "4.17.2",
+        "@rollup/rollup-android-arm64": "4.17.2",
+        "@rollup/rollup-darwin-arm64": "4.17.2",
+        "@rollup/rollup-darwin-x64": "4.17.2",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
+        "@rollup/rollup-linux-arm-musleabihf": "4.17.2",
+        "@rollup/rollup-linux-arm64-gnu": "4.17.2",
+        "@rollup/rollup-linux-arm64-musl": "4.17.2",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
+        "@rollup/rollup-linux-riscv64-gnu": "4.17.2",
+        "@rollup/rollup-linux-s390x-gnu": "4.17.2",
+        "@rollup/rollup-linux-x64-gnu": "4.17.2",
+        "@rollup/rollup-linux-x64-musl": "4.17.2",
+        "@rollup/rollup-win32-arm64-msvc": "4.17.2",
+        "@rollup/rollup-win32-ia32-msvc": "4.17.2",
+        "@rollup/rollup-win32-x64-msvc": "4.17.2",
+        "@types/estree": "1.0.5",
+        "fsevents": "~2.3.2"
+      }
+    },
     "run-async": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
@@ -7837,6 +8930,17 @@
         "strip-ansi": "^6.0.1"
       }
     },
+    "string-width-cjs": {
+      "version": "npm:string-width@4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      }
+    },
     "strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -7846,6 +8950,21 @@
         "ansi-regex": "^5.0.1"
       }
     },
+    "strip-ansi-cjs": {
+      "version": "npm:strip-ansi@6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
     "strip-json-comments": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -7861,6 +8980,54 @@
         "js-tokens": "^8.0.2"
       }
     },
+    "sucrase": {
+      "version": "3.35.0",
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "commander": "^4.0.0",
+        "glob": "^10.3.10",
+        "lines-and-columns": "^1.1.6",
+        "mz": "^2.7.0",
+        "pirates": "^4.0.1",
+        "ts-interface-checker": "^0.1.9"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "dev": true,
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "glob": {
+          "version": "10.3.12",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
+          "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
+          "dev": true,
+          "requires": {
+            "foreground-child": "^3.1.0",
+            "jackspeak": "^2.3.6",
+            "minimatch": "^9.0.1",
+            "minipass": "^7.0.4",
+            "path-scurry": "^1.10.2"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+          "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
+      }
+    },
     "supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -7872,7 +9039,6 @@
     },
     "swagger-parser": {
       "version": "10.0.3",
-      "dev": true,
       "requires": {
         "@apidevtools/swagger-parser": "10.0.3"
       }
@@ -7936,6 +9102,24 @@
         }
       }
     },
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+      "dev": true,
+      "requires": {
+        "thenify": ">= 3.1.0 < 4"
+      }
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -7996,6 +9180,12 @@
       "optional": true,
       "peer": true
     },
+    "tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true
+    },
     "ts-api-utils": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
@@ -8003,11 +9193,16 @@
       "dev": true,
       "requires": {}
     },
+    "ts-interface-checker": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+      "dev": true
+    },
     "ts-pattern": {
       "version": "4.0.5",
       "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.0.5.tgz",
-      "integrity": "sha512-Bq44KCEt7JVaNLa148mBCJkcQf4l7jtLEBDuDdeuLynWDA+1a60P4D0rMkqSM9mOKLQbIWUddE9h3XKyKwBeqA==",
-      "dev": true
+      "integrity": "sha512-Bq44KCEt7JVaNLa148mBCJkcQf4l7jtLEBDuDdeuLynWDA+1a60P4D0rMkqSM9mOKLQbIWUddE9h3XKyKwBeqA=="
     },
     "tsafe": {
       "version": "1.1.1",
@@ -8021,6 +9216,65 @@
       "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
       "dev": true
     },
+    "tsup": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.2.tgz",
+      "integrity": "sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==",
+      "dev": true,
+      "requires": {
+        "bundle-require": "^4.0.0",
+        "cac": "^6.7.12",
+        "chokidar": "^3.5.1",
+        "debug": "^4.3.1",
+        "esbuild": "^0.19.2",
+        "execa": "^5.0.0",
+        "globby": "^11.0.3",
+        "joycon": "^3.0.1",
+        "postcss-load-config": "^4.0.1",
+        "resolve-from": "^5.0.0",
+        "rollup": "^4.0.2",
+        "source-map": "0.8.0-beta.0",
+        "sucrase": "^3.20.3",
+        "tree-kill": "^1.2.2"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.8.0-beta.0",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+          "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+          "dev": true,
+          "requires": {
+            "whatwg-url": "^7.0.0"
+          }
+        },
+        "tr46": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+          "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+          "dev": true,
+          "requires": {
+            "punycode": "^2.1.0"
+          }
+        },
+        "webidl-conversions": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+          "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+          "dev": true
+        },
+        "whatwg-url": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+          "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+          "dev": true,
+          "requires": {
+            "lodash.sortby": "^4.7.0",
+            "tr46": "^1.0.1",
+            "webidl-conversions": "^4.0.2"
+          }
+        }
+      }
+    },
     "tsx": {
       "version": "4.7.1",
       "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz",
@@ -8101,8 +9355,7 @@
       "dev": true
     },
     "validator": {
-      "version": "13.7.0",
-      "dev": true
+      "version": "13.7.0"
     },
     "vite": {
       "version": "5.1.6",
@@ -8114,31 +9367,6 @@
         "fsevents": "~2.3.3",
         "postcss": "^8.4.35",
         "rollup": "^4.2.0"
-      },
-      "dependencies": {
-        "rollup": {
-          "version": "4.13.0",
-          "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz",
-          "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==",
-          "dev": true,
-          "requires": {
-            "@rollup/rollup-android-arm-eabi": "4.13.0",
-            "@rollup/rollup-android-arm64": "4.13.0",
-            "@rollup/rollup-darwin-arm64": "4.13.0",
-            "@rollup/rollup-darwin-x64": "4.13.0",
-            "@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
-            "@rollup/rollup-linux-arm64-gnu": "4.13.0",
-            "@rollup/rollup-linux-arm64-musl": "4.13.0",
-            "@rollup/rollup-linux-riscv64-gnu": "4.13.0",
-            "@rollup/rollup-linux-x64-gnu": "4.13.0",
-            "@rollup/rollup-linux-x64-musl": "4.13.0",
-            "@rollup/rollup-win32-arm64-msvc": "4.13.0",
-            "@rollup/rollup-win32-ia32-msvc": "4.13.0",
-            "@rollup/rollup-win32-x64-msvc": "4.13.0",
-            "@types/estree": "1.0.5",
-            "fsevents": "~2.3.2"
-          }
-        }
       }
     },
     "vite-node": {
@@ -8369,6 +9597,17 @@
         "strip-ansi": "^6.0.0"
       }
     },
+    "wrap-ansi-cjs": {
+      "version": "npm:wrap-ansi@7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      }
+    },
     "wrappy": {
       "version": "1.0.2",
       "dev": true
@@ -8404,6 +9643,12 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "yaml": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
+      "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
+      "dev": true
+    },
     "yargs": {
       "version": "17.6.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
@@ -8433,7 +9678,6 @@
     },
     "z-schema": {
       "version": "5.0.2",
-      "dev": true,
       "requires": {
         "commander": "^2.7.1",
         "lodash.get": "^4.4.2",
@@ -8443,7 +9687,6 @@
       "dependencies": {
         "commander": {
           "version": "2.20.3",
-          "dev": true,
           "optional": true
         }
       }
diff --git a/oxide-openapi-gen-ts/package.json b/oxide-openapi-gen-ts/package.json
new file mode 100644
index 0000000..46d309a
--- /dev/null
+++ b/oxide-openapi-gen-ts/package.json
@@ -0,0 +1,75 @@
+{
+  "name": "@oxide/openapi-gen-ts",
+  "version": "0.1.13",
+  "description": "OpenAPI client generator used to generate Oxide TypeScript SDK",
+  "keywords": [
+    "oxide",
+    "oxide.ts",
+    "oxide sdk",
+    "OpenAPI client generator"
+  ],
+  "engines": {
+    "node": ">=18"
+  },
+  "type": "module",
+  "main": "./dist/index.js",
+  "exports": {
+    "import": "./dist/index.js",
+    "require": "./dist/index.cjs"
+  },
+  "bin": {
+    "openapi-gen-ts": "dist/index.cjs"
+  },
+  "tsup": {
+    "clean": true,
+    "entry": [
+      "src/index.ts"
+    ],
+    "format": [
+      "cjs",
+      "esm"
+    ],
+    "shims": true
+  },
+  "scripts": {
+    "build": "tsup-node && mkdir -p dist/static/ && cp src/client/static/util.ts dist/static/ && cp src/client/static/http-client.ts dist/static/",
+    "fmt": "prettier --write .",
+    "lint": "eslint .",
+    "pretest": "../tools/gen.sh",
+    "test": "vitest",
+    "test:ui": "vitest --ui",
+    "tsc": "tsc"
+  },
+  "author": "Oxide Computer Company",
+  "license": "MPL-2.0",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/oxidecomputer/oxide.ts.git"
+  },
+  "homepage": "https://github.com/oxidecomputer/oxide.ts#readme",
+  "optionalDependencies": {
+    "zod": "^3.20"
+  },
+  "dependencies": {
+    "minimist": "^1.2.8",
+    "prettier": "2.7.1",
+    "swagger-parser": "^10.0.3",
+    "ts-pattern": "^4.0.5"
+  },
+  "devDependencies": {
+    "@types/minimist": "^1.2.5",
+    "@types/node": "^18.7.20",
+    "@typescript-eslint/eslint-plugin": "^6.13.1",
+    "@typescript-eslint/parser": "^6.13.1",
+    "eslint": "^8.55.0",
+    "msw": "^2.0.9",
+    "openapi-types": "^12.0.2",
+    "tsafe": "^1.1.1",
+    "tsup": "^8.0.2",
+    "tsx": "^4.7.1",
+    "type-fest": "^3.1.0",
+    "typescript": "^5.2.2",
+    "vitest": "^1.4.0",
+    "zod": "3.21.1"
+  }
+}
diff --git a/generator/client/api.ts b/oxide-openapi-gen-ts/src/client/api.ts
similarity index 99%
rename from generator/client/api.ts
rename to oxide-openapi-gen-ts/src/client/api.ts
index 738ea8f..2e8377b 100644
--- a/generator/client/api.ts
+++ b/oxide-openapi-gen-ts/src/client/api.ts
@@ -74,8 +74,8 @@ function copyFile(sourceRelPath: string, destDirAbs: string) {
 }
 
 export function copyStaticFiles(destDir: string) {
-  copyFile("../../static/util.ts", destDir);
-  copyFile("../../static/http-client.ts", destDir);
+  copyFile("./static/util.ts", destDir);
+  copyFile("./static/http-client.ts", destDir);
 }
 
 export function generateApi(spec: OpenAPIV3.Document, destDir: string) {
diff --git a/generator/client/base.ts b/oxide-openapi-gen-ts/src/client/base.ts
similarity index 100%
rename from generator/client/base.ts
rename to oxide-openapi-gen-ts/src/client/base.ts
diff --git a/generator/client/msw-handlers.ts b/oxide-openapi-gen-ts/src/client/msw-handlers.ts
similarity index 100%
rename from generator/client/msw-handlers.ts
rename to oxide-openapi-gen-ts/src/client/msw-handlers.ts
diff --git a/static/README.md b/oxide-openapi-gen-ts/src/client/static/README.md
similarity index 100%
rename from static/README.md
rename to oxide-openapi-gen-ts/src/client/static/README.md
diff --git a/static/http-client.test.ts b/oxide-openapi-gen-ts/src/client/static/http-client.test.ts
similarity index 100%
rename from static/http-client.test.ts
rename to oxide-openapi-gen-ts/src/client/static/http-client.test.ts
diff --git a/client/http-client.ts b/oxide-openapi-gen-ts/src/client/static/http-client.ts
similarity index 100%
rename from client/http-client.ts
rename to oxide-openapi-gen-ts/src/client/static/http-client.ts
diff --git a/static/util.test.ts b/oxide-openapi-gen-ts/src/client/static/util.test.ts
similarity index 100%
rename from static/util.test.ts
rename to oxide-openapi-gen-ts/src/client/static/util.test.ts
diff --git a/client/util.ts b/oxide-openapi-gen-ts/src/client/static/util.ts
similarity index 100%
rename from client/util.ts
rename to oxide-openapi-gen-ts/src/client/static/util.ts
diff --git a/generator/client/type-tests.ts b/oxide-openapi-gen-ts/src/client/type-tests.ts
similarity index 100%
rename from generator/client/type-tests.ts
rename to oxide-openapi-gen-ts/src/client/type-tests.ts
diff --git a/generator/client/zodValidators.ts b/oxide-openapi-gen-ts/src/client/zodValidators.ts
similarity index 100%
rename from generator/client/zodValidators.ts
rename to oxide-openapi-gen-ts/src/client/zodValidators.ts
diff --git a/oxide-openapi-gen-ts/src/index.ts b/oxide-openapi-gen-ts/src/index.ts
new file mode 100644
index 0000000..c9e0d47
--- /dev/null
+++ b/oxide-openapi-gen-ts/src/index.ts
@@ -0,0 +1,106 @@
+#!/usr/bin/env node
+/**
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, you can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * Copyright Oxide Computer Company
+ */
+
+import SwaggerParser from "@apidevtools/swagger-parser";
+import type { OpenAPIV3 } from "openapi-types";
+
+import { copyStaticFiles, generateApi } from "./client/api";
+import { generateMSWHandlers } from "./client/msw-handlers";
+import { generateTypeTests } from "./client/type-tests";
+import { generateZodValidators } from "./client/zodValidators";
+import { resolve } from "node:path";
+import { existsSync } from "node:fs";
+import parseArgs from "minimist";
+
+function helpAndExit(msg?: string): never {
+  if (msg) console.log("Error: " + msg + "\n");
+  console.log("Usage:");
+  console.log("  gen <specFile> <destDir> [options]\n");
+  console.log("Options:");
+  console.log(
+    "  --features       Comma-separated list of features to generate. Default: none.",
+  );
+  console.log(`                   Allowed values: ${ALL_FEATURES.join(", ")}`);
+  console.log("  -h, --help       Show this help message and exit\n");
+  console.log("Example:");
+  console.log("  gen nexus-json generated-client --features zod,msw");
+  process.exit(1);
+}
+
+type Feature = "zod" | "msw" | "typetests";
+const ALL_FEATURES: Feature[] = ["zod", "msw", "typetests"];
+type Features = Record<Feature, boolean>;
+
+function parseFeatures(featuresArg: string | undefined) {
+  const features =
+    typeof featuresArg === "string"
+      ? featuresArg.split(",").map((f) => f.trim())
+      : [];
+
+  for (const feature of features) {
+    if (!ALL_FEATURES.includes(feature as Feature)) {
+      helpAndExit(`Unrecognized feature '${feature}'.`);
+    }
+  }
+
+  const validated = features as Feature[];
+
+  return {
+    zod: validated.includes("zod"),
+    msw: validated.includes("msw"),
+    typetests: validated.includes("typetests"),
+  };
+}
+
+async function generate(specFile: string, destDir: string, features: Features) {
+  // destination directory is resolved relative to CWD
+  const destDirAbs = resolve(process.cwd(), destDir);
+
+  if (!existsSync(destDirAbs)) {
+    throw new Error(`Error: destination directory does not exist.
+  Argument given: ${destDirAbs}
+  Resolved path:  ${destDirAbs}
+`);
+  }
+
+  const rawSpec = await SwaggerParser.parse(specFile);
+  if (!("openapi" in rawSpec) || !rawSpec.openapi.startsWith("3.0")) {
+    throw new Error("Only OpenAPI 3.0 is currently supported");
+  }
+
+  // we're not actually changing anything from rawSpec to spec, we've
+  // just ruled out v2 and v3.1
+  const spec = rawSpec as OpenAPIV3.Document;
+
+  copyStaticFiles(destDirAbs);
+  generateApi(spec, destDirAbs);
+  if (features.typetests) generateTypeTests(spec, destDirAbs);
+  if (features.msw) generateMSWHandlers(spec, destDirAbs);
+  // msw requires zod
+  if (features.zod || features.msw) generateZodValidators(spec, destDirAbs);
+}
+
+////////////////////////////////////
+// actually do the thing
+////////////////////////////////////
+
+const args = parseArgs(process.argv.slice(2), {
+  string: ["features"],
+  alias: { h: "help" },
+});
+
+if (args.help) helpAndExit();
+
+const [specFile, destDir] = args._;
+if (!specFile) helpAndExit(`Missing <specFile>`);
+if (!destDir) helpAndExit(`Missing <destdir>`);
+
+const features = parseFeatures(args.features);
+
+generate(specFile, destDir, features);
diff --git a/generator/io.ts b/oxide-openapi-gen-ts/src/io.ts
similarity index 100%
rename from generator/io.ts
rename to oxide-openapi-gen-ts/src/io.ts
diff --git a/generator/schema/base.ts b/oxide-openapi-gen-ts/src/schema/base.ts
similarity index 100%
rename from generator/schema/base.ts
rename to oxide-openapi-gen-ts/src/schema/base.ts
diff --git a/generator/schema/types.ts b/oxide-openapi-gen-ts/src/schema/types.ts
similarity index 100%
rename from generator/schema/types.ts
rename to oxide-openapi-gen-ts/src/schema/types.ts
diff --git a/generator/schema/zod.test.ts b/oxide-openapi-gen-ts/src/schema/zod.test.ts
similarity index 100%
rename from generator/schema/zod.test.ts
rename to oxide-openapi-gen-ts/src/schema/zod.test.ts
diff --git a/generator/schema/zod.ts b/oxide-openapi-gen-ts/src/schema/zod.ts
similarity index 100%
rename from generator/schema/zod.ts
rename to oxide-openapi-gen-ts/src/schema/zod.ts
diff --git a/generator/util.test.ts b/oxide-openapi-gen-ts/src/util.test.ts
similarity index 100%
rename from generator/util.test.ts
rename to oxide-openapi-gen-ts/src/util.test.ts
diff --git a/generator/util.ts b/oxide-openapi-gen-ts/src/util.ts
similarity index 100%
rename from generator/util.ts
rename to oxide-openapi-gen-ts/src/util.ts
diff --git a/tsconfig.json b/oxide-openapi-gen-ts/tsconfig.json
similarity index 98%
rename from tsconfig.json
rename to oxide-openapi-gen-ts/tsconfig.json
index 7e49dea..4bbd77f 100644
--- a/tsconfig.json
+++ b/oxide-openapi-gen-ts/tsconfig.json
@@ -14,5 +14,5 @@
     "strict": true,
     "target": "ES2020",
     "types": ["vite/client", "vitest/importMeta"]
-  },
+  }
 }
diff --git a/package.json b/package.json
deleted file mode 100644
index c4b4df5..0000000
--- a/package.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "name": "@oxide/api",
-  "version": "0.0.1",
-  "description": "The official JavaScript and TypeScript client SDK for interacting with the Oxide API",
-  "keywords": [
-    "oxide",
-    "oxide.ts",
-    "oxide computer",
-    "oxide sdk"
-  ],
-  "engines": {
-    "node": ">=18"
-  },
-  "scripts": {
-    "gen": "./tools/gen.sh $(cat ./OMICRON_VERSION) ./client",
-    "lint": "eslint .",
-    "postgen": "prettier --parser typescript --write ./client",
-    "pretest": "npm run gen",
-    "test": "vitest",
-    "test:ui": "vitest --ui",
-    "tsc": "tsc"
-  },
-  "author": "",
-  "license": "MPL-2.0",
-  "optionalDependencies": {
-    "zod": "^3.20"
-  },
-  "devDependencies": {
-    "@types/node": "^18.7.20",
-    "@typescript-eslint/eslint-plugin": "^6.13.1",
-    "@typescript-eslint/parser": "^6.13.1",
-    "eslint": "^8.55.0",
-    "msw": "^2.0.9",
-    "openapi-types": "^12.0.2",
-    "prettier": "2.7.1",
-    "swagger-parser": "^10.0.3",
-    "ts-pattern": "^4.0.5",
-    "tsafe": "^1.1.1",
-    "tsx": "^4.7.1",
-    "type-fest": "^3.1.0",
-    "typescript": "^5.2.2",
-    "vitest": "^1.4.0",
-    "zod": "3.21.1"
-  }
-}
diff --git a/tools/gen.sh b/tools/gen.sh
index 63ba41d..8baf909 100755
--- a/tools/gen.sh
+++ b/tools/gen.sh
@@ -9,19 +9,9 @@
 set -o errexit
 set -o pipefail
 
-HELP="$(
-	cat <<EOF
-usage: ./gen.sh [spec-file] [out-file]
-EOF
-)"
-
-if [[ $# != 2 ]]; then
-	echo "$HELP"
-	exit 2
-fi
-
-OMICRON_SHA="$1"
-DEST_DIR="$2"
+ROOT_DIR="$(dirname "$0")/.."
+OMICRON_SHA=$(cat "$ROOT_DIR/OMICRON_VERSION")
+DEST_DIR="$ROOT_DIR/oxide-api/src"
 
 SPEC_URL="https://raw.githubusercontent.com/oxidecomputer/omicron/$OMICRON_SHA/openapi/nexus.json"
 SPEC_FILE="./spec.json"
@@ -29,4 +19,5 @@ SPEC_FILE="./spec.json"
 # TODO: we could get rid of this DL if a test didn't rely on it
 curl --fail "$SPEC_URL" -o $SPEC_FILE
 
-tsx generator/index.ts $SPEC_FILE $DEST_DIR
+npx tsx "$ROOT_DIR/oxide-openapi-gen-ts/src/index.ts" $SPEC_FILE $DEST_DIR --features zod,msw,typetests
+npx prettier@3.2.5 --write --log-level error "$DEST_DIR"