From 3803e449964993f4400b3f7ce7c73a884065a062 Mon Sep 17 00:00:00 2001 From: Amin Chirazi <32016576+AminChirazi@users.noreply.github.com> Date: Tue, 28 Jul 2026 11:50:54 +0400 Subject: [PATCH 1/2] feat!: rebuild the SDK from the API's OpenAPI document The published package sat at v0.2.0 since February 2024 while the API moved on for two and a half years. It exposed four methods - generate, generateFromTemplateId, exportToApi, exportToDB - and none of projects, scenarios, sets, keymaps, plans or masking. That is less a coverage gap than a misrepresentation of the product. The cause was hand-copied types: nothing ever failed when the API and the SDK diverged. So the fix is structural rather than a catch-up. `src/generated/ schema.ts` is generated from `spec/openapi.json` (the document datamaker-api now emits and commits), and CI fails when the committed types no longer match. Drift becomes a build error instead of a discovery. DataMaker .projects .templates .sets .keymaps .maskingPolicies .plans Method names mirror datamaker-py (list/get/create/update/delete/save) so one set of docs covers both SDKs, and apiKey/baseURL fall back to DATAMAKER_API_KEY / DATAMAKER_API_URL - the same variables Python reads, so a configured machine works with either. Deliberate choices worth stating: - ZERO runtime dependencies, on the platform `fetch`. Runs unmodified on Node 18+, Deno, Bun, browsers and edge runtimes. A shared native core would have bought nothing here - an SDK is URL building and JSON - and would have cost exactly the environments customers deploy to. - `DataMakerError` carries the status and parsed body rather than a flattened string: 401 means the key is wrong, 403 means it is right and lacks a permission, 409 means the resource is locked, and callers branch on that. - A non-JSON error body (a proxy answering HTML) still reports its status instead of being replaced by a parse error. - `sets.get` returns SetDetail, which the spec composes as Set & { createdByName }, so the field is not silently assumed on list results. - KeyMap methods return projections, because the API has no endpoint that returns a stored KeyMap row and the SDK should not invent one. 11 tests, none of which touch a real API: they inject a fetch stub and assert on the request the SDK builds. The old suite required DATAMAKER_API_KEY in CI. BREAKING CHANGE: v0.2's four methods are removed. Their replacements live on the typed resource clients, and anything not yet wrapped is reachable through the typed `dm.http` transport. Co-Authored-By: Claude Opus 5 --- .changeset/rebuild-from-openapi.md | 5 + .github/workflows/main.yaml | 22 +- README.md | 122 +- examples/basic.ts | 62 +- examples/exportToApi.ts | 36 - examples/exportToDB.ts | 17 - examples/generateFromTemplateId.ts | 14 - examples/keymaps.ts | 32 + package.json | 52 +- pnpm-lock.yaml | 4741 ++++++------ scripts/check-generated.mjs | 31 + spec/openapi.json | 10551 +++++++++++++++++++++++++++ src/core.ts | 183 +- src/error.ts | 1 - src/generated/schema.ts | 8461 +++++++++++++++++++++ src/index.test.ts | 308 +- src/index.ts | 342 +- src/resources.ts | 240 + src/template.test.ts | 28 - src/template.ts | 425 -- src/utils.ts | 107 - tsconfig.json | 134 +- vitest.config.ts | 16 +- 23 files changed, 22033 insertions(+), 3897 deletions(-) create mode 100644 .changeset/rebuild-from-openapi.md delete mode 100644 examples/exportToApi.ts delete mode 100644 examples/exportToDB.ts delete mode 100644 examples/generateFromTemplateId.ts create mode 100644 examples/keymaps.ts create mode 100644 scripts/check-generated.mjs create mode 100644 spec/openapi.json delete mode 100644 src/error.ts create mode 100644 src/generated/schema.ts create mode 100644 src/resources.ts delete mode 100644 src/template.test.ts delete mode 100644 src/template.ts delete mode 100644 src/utils.ts diff --git a/.changeset/rebuild-from-openapi.md b/.changeset/rebuild-from-openapi.md new file mode 100644 index 0000000..7b39337 --- /dev/null +++ b/.changeset/rebuild-from-openapi.md @@ -0,0 +1,5 @@ +--- +"@automators/datamaker": major +--- + +Rebuild the SDK from the API's OpenAPI document. Types are generated rather than hand-written, and the client covers projects, templates, sets, keymaps, masking policies and plans instead of only generate/export. diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 116445a..bdba395 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -11,18 +11,22 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 - with: - version: 8 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 with: node-version: 20.x cache: "pnpm" - run: pnpm install --frozen-lockfile - - run: pnpm run lint && pnpm run build + + # The types in src/generated are produced from spec/openapi.json. Stale + # or hand-edited types mean the SDK describes an API that has moved on, + # which is exactly how this package fell 2.5 years behind. Fail here + # rather than discover it from a customer. + - name: Generated types match the spec + run: pnpm run generate:check + + - run: pnpm run lint - run: pnpm run test - env: - DATAMAKER_API_KEY: ${{ secrets.DATAMAKER_API_KEY }} - DEV_ACCOUNT_API: ${{secrets.DEV_ACCOUNT_API}} + - run: pnpm run build diff --git a/README.md b/README.md index fd6eb77..289fcde 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,93 @@ -# DataMaker +# @automators/datamaker -[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) +The official TypeScript / Node.js client for the [DataMaker](https://datamaker.automators.com) API. -## What is it? +> **Note on naming.** The unscoped `datamaker` package on npm is an unrelated project by another author. This package is the official one and is always **`@automators/datamaker`**. -The official Node.js / Typescript library for the datamaker API. Datamaker assists with generating realistic relational data for testing and development purposes. - -## Installation - -```sh +```bash npm install @automators/datamaker ``` -## Quick start +Node 18+, and it also runs on Deno, Bun, browsers and edge runtimes. Zero runtime dependencies: it uses the platform `fetch`. -Basic example: +## Usage ```ts -import { DataMaker, Template } from "@automators/datamaker"; +import { DataMaker } from "@automators/datamaker"; + +const dm = new DataMaker({ apiKey: process.env.DATAMAKER_API_KEY }); + +const sets = await dm.sets.list(); -const datamaker = new DataMaker({ - apiKey: `YOUR_API_KEY`, +const saved = await dm.sets.save({ + name: "golden customers", + data: [{ id: 1, name: "Ada Lovelace" }], }); -const generateData = async () => { - const template = { - name: "basic template", - quantity: 2, - fields: [ - { - name: "first_name", - type: "First Name", - }, - { - name: "last_name", - type: "Last Name", - }, - { - name: "email", - type: "Derived", - options: { - value: "{{first_name}}.{{last_name}}@automators.com", - }, - }, - ], - } satisfies Template; - - const data = await datamaker.generate(template); - const result = await data.json(); - console.log(result); -}; - -generateData(); +const { mappings, missing } = await dm.keymaps.lookup({ + mapName: "sap-material-migration", + object: "Material", + oldKeys: ["OLD-1", "OLD-2"], +}); +``` + +`apiKey` falls back to `DATAMAKER_API_KEY` and `baseURL` to `DATAMAKER_API_URL` - the same variables `datamaker-py` reads, so one configured machine works with both SDKs. + +## Resources + +| Client | Methods | +| --- | --- | +| `dm.projects` | `list` `get` `create` `update` `delete` | +| `dm.templates` | `list` `get` `create` `update` `delete` | +| `dm.sets` | `list` `get` `create` `update` `delete` `save` | +| `dm.keymaps` | `list` `put` `lookup` `entries` `delete` | +| `dm.maskingPolicies` | `list` `get` `create` `update` `delete` | +| `dm.plans` | `list` `get` `update` `delete` | + +Method names mirror `datamaker-py`, so one set of docs covers both. + +For anything not yet wrapped, `dm.http` is the typed transport: + +```ts +const rows = await dm.http.get("/scenarios", { query: { projectId } }); ``` -## Development & Contibutions +## Errors -See the [contributing.md](/CONTRIBUTING.md) guide for details on how to contribute to this project. +A non-2xx throws `DataMakerError`, carrying the status and the parsed body rather than a flattened string, because callers branch on both: -## License +```ts +import { DataMakerError } from "@automators/datamaker"; + +try { + await dm.sets.delete(id); +} catch (error) { + if (error instanceof DataMakerError && error.status === 409) { + // the set is locked - unlock it first + } +} +``` + +`401` means the key is wrong, `403` that it is right but lacks a permission, `409` that the resource is locked. + +## Types are generated, not written + +Every type comes from the API's own OpenAPI document, generated into `src/generated/schema.ts`: + +```bash +pnpm generate # regenerate from spec/openapi.json +pnpm generate:check # fail if the committed types are stale (CI runs this) +``` + +This is deliberate. The previous release of this package sat at v0.2.0 for two and a half years while the API moved on, because its types were hand-copied and nothing ever failed when they diverged. Do not hand-edit `src/generated/`. + +## Development + +```bash +pnpm install +pnpm test +pnpm lint +pnpm build +``` -[MIT](https://github.com/automator-com/datamaker-core/blob/main/LICENSE) +The tests never reach a real API: they inject a `fetch` stub and assert on the request the SDK builds. diff --git a/examples/basic.ts b/examples/basic.ts index 541a952..168b588 100644 --- a/examples/basic.ts +++ b/examples/basic.ts @@ -1,34 +1,34 @@ -import { DataMaker } from "../src/index"; -import { Template } from "../src/template"; +/** + * The shortest useful thing: save a set, then read it back. + * + * Run with: DATAMAKER_API_KEY=... npx tsx examples/basic.ts + */ +import { DataMaker, DataMakerError } from "../src/index.js"; -const datamaker = new DataMaker({}); +const dm = new DataMaker(); -const generateData = async () => { - const template = { - name: "basic template", - quantity: 2, - fields: [ - { - name: "first_name", - type: "First Name", - }, - { - name: "last_name", - type: "Last Name", - }, - { - name: "email", - type: "Derived", - options: { - value: "{{first_name}}.{{last_name}}@automators.com", - }, - }, - ], - } satisfies Template; - - const data = await datamaker.generate(template); - const result = await data.json(); - console.log(result); -}; +const saved = await dm.sets.save({ + name: `example-${Date.now()}`, + description: "Written by examples/basic.ts", + data: [ + { id: 1, name: "Ada Lovelace", email: "ada@example.com" }, + { id: 2, name: "Alan Turing", email: "alan@example.com" }, + ], +}); -generateData(); \ No newline at end of file +console.log(`saved set ${saved.id} with ${saved.rowCount} rows`); + +// The detail endpoint carries `createdByName`, which the list does not. +const detail = await dm.sets.get(saved.id); +console.log(`created by: ${detail.createdByName ?? "an API key, not a user"}`); + +try { + await dm.sets.delete(saved.id); + console.log("cleaned up"); +} catch (error) { + if (error instanceof DataMakerError && error.status === 409) { + console.log("the set is locked; unlock it before deleting"); + } else { + throw error; + } +} diff --git a/examples/exportToApi.ts b/examples/exportToApi.ts deleted file mode 100644 index 9a988dd..0000000 --- a/examples/exportToApi.ts +++ /dev/null @@ -1,36 +0,0 @@ -// First set your Datamaker api key as DATAMAKER_API_KEY environment variable -import { DataMaker, CustomEndpoint } from "../src/index"; - -const datamaker = new DataMaker({}); - -// Generate data and send them to API endpoint saved in your Datamaker account (identified by ID) -const exportToPredefinedEndpoint = async () => { - const quantity = 2; - const generate = await datamaker.generateFromTemplateId("templateIDFromYourAccount", quantity); - const data = await generate.json(); - - await datamaker.exportToApi("idOfEndpointInYourAccount", data); -}; - -exportToPredefinedEndpoint(); - -// Generate data and send them to a custom API endpoint -const exportToCustomEndpoint = async () => { - const quantity = 2; - // Define endpoint that has obligatory url and method parameters and optional headers parameter - const endpoint: CustomEndpoint = { - url: "urlOfYourEndpoint", - method: "POST", - headers: { - // optional headers object - } - }; - - const generate = await datamaker.generateFromTemplateId("templateIDFromYourAccount", quantity); - const data = await generate.json(); - - // Call export method with your defined endpoint instead of endpoint ID from your Datamaker account - await datamaker.exportToApi(endpoint, data); -}; - -exportToCustomEndpoint(); \ No newline at end of file diff --git a/examples/exportToDB.ts b/examples/exportToDB.ts deleted file mode 100644 index f6a0539..0000000 --- a/examples/exportToDB.ts +++ /dev/null @@ -1,17 +0,0 @@ -// First set your Datamaker api key as DATAMAKER_API_KEY environment variable and save database connection in DB Bridge section of your Datamaker account -import { DataMaker } from "../src/index"; - -const datamaker = new DataMaker({}); - -// Generate data and export them to database -const exportToDB = async () => { - const quantity = 2; - - // Define data to be exported to database. You can use Datamaker to generate such data or define your data in code. - const data = await datamaker.generateFromTemplateId("templateIDFromYourAccount", quantity); - - // Call export method with connectionID, table name and your data as arguments. - await datamaker.exportToDB("connectionIDFromYourAccount", "DBTableName", data); -}; - -exportToDB(); \ No newline at end of file diff --git a/examples/generateFromTemplateId.ts b/examples/generateFromTemplateId.ts deleted file mode 100644 index a09d217..0000000 --- a/examples/generateFromTemplateId.ts +++ /dev/null @@ -1,14 +0,0 @@ -// First set your Datamaker api key as DATAMAKER_API_KEY environment variable -import { DataMaker } from "../src/index"; - -const datamaker = new DataMaker({}); - -const generateData = async () => { - const quantity = 2; - const data = await datamaker.generateFromTemplateId("templateIDFromYourAccount", quantity); - const result = await data.json(); - - console.log(result); -}; - -generateData(); \ No newline at end of file diff --git a/examples/keymaps.ts b/examples/keymaps.ts new file mode 100644 index 0000000..eabcaf9 --- /dev/null +++ b/examples/keymaps.ts @@ -0,0 +1,32 @@ +/** + * KeyMaps: record the keys a migration minted, then translate in bulk. + * + * Run with: DATAMAKER_API_KEY=... npx tsx examples/keymaps.ts + */ +import { DataMaker } from "../src/index.js"; + +const dm = new DataMaker(); +const mapName = "sap-material-migration"; + +await dm.keymaps.put({ + mapName, + object: "Material", + entries: [ + { oldKey: "OLD-1", newKey: "NEW-1" }, + { oldKey: "OLD-2", newKey: "NEW-2" }, + ], +}); + +// `missing` is the point: it separates "no mapping yet" from "not asked for", +// which a plain record of results could not express. +const { mappings, missing } = await dm.keymaps.lookup({ + mapName, + object: "Material", + oldKeys: ["OLD-1", "OLD-2", "OLD-3"], +}); + +console.log("resolved:", mappings); +console.log("not mapped yet:", missing); + +const page = await dm.keymaps.entries(mapName, { page: 1, pageSize: 50 }); +console.log(`${page.entries.length} of ${page.total} entries`); diff --git a/package.json b/package.json index f7930a9..5dc0bdf 100644 --- a/package.json +++ b/package.json @@ -3,19 +3,22 @@ "description": "The official Node.js / Typescript library for the DataMaker API", "author": "Automators ", "license": "MIT", - "version": "0.2.0", + "version": "1.0.0", "homepage": "https://github.com/automators-com/datamaker-js", "bugs": "https://github.com/automators-com/datamaker-js/issues", - "main": "dist/index.js", - "module": "dist/index.mjs", + "main": "dist/index.cjs", + "module": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "build": "tsup src/index.ts --format cjs,esm --dts", - "release": "pnpm run build && changeset publish", - "lint": "tsc", - "test": "vitest", + "build": "tsup src/index.ts --format cjs,esm --dts --clean", + "generate": "openapi-typescript spec/openapi.json -o src/generated/schema.ts", + "generate:check": "node scripts/check-generated.mjs", + "lint": "tsc --noEmit", + "test": "vitest run", + "test:watch": "vitest", "coverage": "vitest run --coverage", - "changeset": "changeset " + "release": "pnpm run build && changeset publish", + "changeset": "changeset" }, "devDependencies": { "@changesets/cli": "^2.27.1", @@ -24,9 +27,36 @@ "tsup": "^8.0.1", "typescript": "^5.3.3", "vite": "^5.0.7", - "vitest": "^1.0.2" + "vitest": "^1.0.2", + "openapi-typescript": "^7.13.0" + }, + "dependencies": {}, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "files": [ + "dist", + "spec/openapi.json", + "README.md", + "LICENSE" + ], + "engines": { + "node": ">=18" }, - "dependencies": { - "dotenv": "^16.3.1" + "keywords": [ + "datamaker", + "test-data", + "synthetic-data", + "automators", + "sdk" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/automators-com/datamaker-js.git" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 933b39c..844f739 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2850 +1,1364 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - -devDependencies: - '@changesets/cli': - specifier: ^2.27.1 - version: 2.27.1 - '@types/node': - specifier: ^20.10.4 - version: 20.10.4 - '@vitest/coverage-v8': - specifier: ^1.0.2 - version: 1.0.2(vitest@1.0.2) - tsup: - specifier: ^8.0.1 - version: 8.0.1(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - vite: - specifier: ^5.0.7 - version: 5.0.7(@types/node@20.10.4) - vitest: - specifier: ^1.0.2 - version: 1.0.2(@types/node@20.10.4) +importers: + + .: + devDependencies: + '@changesets/cli': + specifier: ^2.27.1 + version: 2.31.1(@types/node@20.19.43) + '@types/node': + specifier: ^20.10.4 + version: 20.19.43 + '@vitest/coverage-v8': + specifier: ^1.0.2 + version: 1.6.1(vitest@1.6.1(@types/node@20.19.43)) + openapi-typescript: + specifier: ^7.13.0 + version: 7.13.0(typescript@5.9.3) + tsup: + specifier: ^8.0.1 + version: 8.5.1(postcss@8.5.23)(typescript@5.9.3) + typescript: + specifier: ^5.3.3 + version: 5.9.3 + vite: + specifier: ^5.0.7 + version: 5.4.21(@types/node@20.19.43) + vitest: + specifier: ^1.0.2 + version: 1.6.1(@types/node@20.19.43) packages: - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - /@babel/parser@7.23.5: - resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.23.5 - dev: true - /@babel/runtime@7.23.5: - resolution: {integrity: sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: true - /@babel/types@7.23.5: - resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - /@bcoe/v8-coverage@0.2.3: + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@changesets/apply-release-plan@7.0.0: - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/config': 3.0.0 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.5.4 - dev: true + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} - /@changesets/assemble-release-plan@6.0.0: - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.5.4 - dev: true + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} - /@changesets/changelog-git@0.2.0: - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - dependencies: - '@changesets/types': 6.0.0 - dev: true + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - /@changesets/cli@2.27.1: - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + '@changesets/cli@2.31.1': + resolution: {integrity: sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==} hasBin: true - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/apply-release-plan': 7.0.0 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.0 - '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.6 - ansi-colors: 4.1.3 - chalk: 2.4.2 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - meow: 6.1.1 - outdent: 0.5.0 - p-limit: 2.3.0 - preferred-pm: 3.1.2 - resolve-from: 5.0.0 - semver: 7.5.4 - spawndamnit: 2.0.0 - term-size: 2.2.1 - tty-table: 4.2.3 - dev: true - /@changesets/config@3.0.0: - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.5 - dev: true + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} - /@changesets/errors@0.2.0: + '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - dependencies: - extendable-error: 0.1.7 - dev: true - /@changesets/get-dependents-graph@2.0.0: - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 - semver: 7.5.4 - dev: true - - /@changesets/get-release-plan@4.0.0: - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - dev: true + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} - /@changesets/get-version-range-type@0.4.0: + '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - dev: true - /@changesets/git@3.0.0: - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 - dev: true + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - dependencies: - chalk: 2.4.2 - dev: true + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - /@changesets/parse@0.4.0: - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 - dev: true + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} - /@changesets/pre@2.0.0: - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - dev: true + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - /@changesets/read@0.6.0: - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 - chalk: 2.4.2 - fs-extra: 7.0.1 - p-filter: 2.1.0 - dev: true + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} - /@changesets/types@4.1.0: + '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: true - /@changesets/types@6.0.0: - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - dev: true + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - /@changesets/write@0.3.0: - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/types': 6.0.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - prettier: 2.8.8 - dev: true + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - /@esbuild/android-arm64@0.19.8: - resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.8: - resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.8: - resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.8: - resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.8: - resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.8: - resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.8: - resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.8: - resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.8: - resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.8: - resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.8: - resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.8: - resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.8: - resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.8: - resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.8: - resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.8: - resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.8: - resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.8: - resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.8: - resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.8: - resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.8: - resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.8: - resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} - dev: true - /@jest/schemas@29.6.3: + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - /@manypkg/find-root@1.1.0: + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - dependencies: - '@babel/runtime': 7.23.5 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - dev: true - /@manypkg/get-packages@1.1.3: + '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - dependencies: - '@babel/runtime': 7.23.5 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - dev: true - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - /@rollup/rollup-android-arm-eabi@4.7.0: - resolution: {integrity: sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.17': + resolution: {integrity: sha512-wsV2keCt6B806XpSdezbWZ9aFJYf14YVh+XQf0ESt7M90yqVuxH9//PxvtC70sgj9OCkRM3nRaLfu4MsGQZRig==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@rollup/rollup-android-arm-eabi@4.62.3': + resolution: {integrity: sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.7.0: - resolution: {integrity: sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==} + '@rollup/rollup-android-arm64@4.62.3': + resolution: {integrity: sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.7.0: - resolution: {integrity: sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==} + '@rollup/rollup-darwin-arm64@4.62.3': + resolution: {integrity: sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.7.0: - resolution: {integrity: sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==} + '@rollup/rollup-darwin-x64@4.62.3': + resolution: {integrity: sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.7.0: - resolution: {integrity: sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==} + '@rollup/rollup-freebsd-arm64@4.62.3': + resolution: {integrity: sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.3': + resolution: {integrity: sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.3': + resolution: {integrity: sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.3': + resolution: {integrity: sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==} + cpu: [arm] + os: [linux] + libc: [musl] - /@rollup/rollup-linux-arm64-gnu@4.7.0: - resolution: {integrity: sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==} + '@rollup/rollup-linux-arm64-gnu@4.62.3': + resolution: {integrity: sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@rollup/rollup-linux-arm64-musl@4.7.0: - resolution: {integrity: sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==} + '@rollup/rollup-linux-arm64-musl@4.62.3': + resolution: {integrity: sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@rollup/rollup-linux-riscv64-gnu@4.7.0: - resolution: {integrity: sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==} - cpu: [riscv64] + '@rollup/rollup-linux-loong64-gnu@4.62.3': + resolution: {integrity: sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==} + cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@rollup/rollup-linux-x64-gnu@4.7.0: - resolution: {integrity: sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==} - cpu: [x64] + '@rollup/rollup-linux-loong64-musl@4.62.3': + resolution: {integrity: sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==} + cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@rollup/rollup-linux-x64-musl@4.7.0: - resolution: {integrity: sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==} - cpu: [x64] + '@rollup/rollup-linux-ppc64-gnu@4.62.3': + resolution: {integrity: sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==} + cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@rollup/rollup-win32-arm64-msvc@4.7.0: - resolution: {integrity: sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@rollup/rollup-linux-ppc64-musl@4.62.3': + resolution: {integrity: sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==} + cpu: [ppc64] + os: [linux] + libc: [musl] - /@rollup/rollup-win32-ia32-msvc@4.7.0: - resolution: {integrity: sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@rollup/rollup-linux-riscv64-gnu@4.62.3': + resolution: {integrity: sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] - /@rollup/rollup-win32-x64-msvc@4.7.0: - resolution: {integrity: sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==} - cpu: [x64] + '@rollup/rollup-linux-riscv64-musl@4.62.3': + resolution: {integrity: sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.3': + resolution: {integrity: sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.3': + resolution: {integrity: sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.3': + resolution: {integrity: sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.3': + resolution: {integrity: sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.3': + resolution: {integrity: sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.3': + resolution: {integrity: sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==} + cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@rollup/rollup-win32-ia32-msvc@4.62.3': + resolution: {integrity: sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==} + cpu: [ia32] + os: [win32] - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true + '@rollup/rollup-win32-x64-gnu@4.62.3': + resolution: {integrity: sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==} + cpu: [x64] + os: [win32] - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@rollup/rollup-win32-x64-msvc@4.62.3': + resolution: {integrity: sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==} + cpu: [x64] + os: [win32] - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: true + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} - /@types/node@20.10.4: - resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} - dependencies: - undici-types: 5.26.5 - dev: true + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: true + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} - /@vitest/coverage-v8@1.0.2(vitest@1.0.2): - resolution: {integrity: sha512-WCTbfnvFPqH8TGVPNnPXcLBK/tbMX5GGZ/Lc9EuYvVX4xbO0ULKLzWDbVU37C2Y2YIlNu/VP1kp7QKUZolUDgA==} + '@vitest/coverage-v8@1.6.1': + resolution: {integrity: sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==} peerDependencies: - vitest: ^1.0.0 - dependencies: - '@ampproject/remapping': 2.2.1 - '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - magic-string: 0.30.5 - magicast: 0.3.2 - picocolors: 1.0.0 - std-env: 3.6.0 - test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 - vitest: 1.0.2(@types/node@20.10.4) - transitivePeerDependencies: - - supports-color - dev: true + vitest: 1.6.1 - /@vitest/expect@1.0.2: - resolution: {integrity: sha512-mAIo/8uddSWkjQMLFcjqZP3WmkwvvN0OtlyZIu33jFnwme3vZds8m8EDMxtj+Uzni2DwtPfHNjJcTM8zTV1f4A==} - dependencies: - '@vitest/spy': 1.0.2 - '@vitest/utils': 1.0.2 - chai: 4.3.10 - dev: true + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} - /@vitest/runner@1.0.2: - resolution: {integrity: sha512-ZcHJXPT2kg/9Hc4fNkCbItlsgZSs3m4vQbxB8LCSdzpbG85bExCmSvu6K9lWpMNdoKfAr1Jn0BwS9SWUcGnbTQ==} - dependencies: - '@vitest/utils': 1.0.2 - p-limit: 5.0.0 - pathe: 1.1.1 - dev: true + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} - /@vitest/snapshot@1.0.2: - resolution: {integrity: sha512-9ClDz2/aV5TfWA4reV7XR9p+hE0e7bifhwxlURugj3Fw0YXeTFzHmKCNEHd6wOIFMfthbGGwhlq7TOJ2jDO4/g==} - dependencies: - magic-string: 0.30.5 - pathe: 1.1.1 - pretty-format: 29.7.0 - dev: true + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} - /@vitest/spy@1.0.2: - resolution: {integrity: sha512-YlnHmDntp+zNV3QoTVFI5EVHV0AXpiThd7+xnDEbWnD6fw0TH/J4/+3GFPClLimR39h6nA5m0W4Bjm5Edg4A/A==} - dependencies: - tinyspy: 2.2.0 - dev: true + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} - /@vitest/utils@1.0.2: - resolution: {integrity: sha512-GPQkGHAnFAP/+seSbB9pCsj339yRrMgILoI5H2sPevTLCYgBq0VRjF8QSllmnQyvf0EontF6KUIt2t5s2SmqoQ==} - dependencies: - diff-sequences: 29.6.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} - /acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - dev: true - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true - dev: true - /ansi-colors@4.1.3: + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - dev: true - /ansi-regex@5.0.1: + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - /ansi-styles@5.2.0: + ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true - /any-promise@1.3.0: + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /argparse@1.0.10: + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 - dev: true + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /array-union@2.1.0: + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.2 - dev: true - - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true - - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - /assertion-error@1.1.0: + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /balanced-match@1.0.2: + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - /better-path-resolve@1.0.0: + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - dependencies: - is-windows: 1.0.2 - dev: true - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true + brace-expansion@2.1.2: + resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - /breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - dependencies: - wcwidth: 1.0.1 - dev: true - - /bundle-require@4.0.2(esbuild@0.19.8): - resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.17' - dependencies: - esbuild: 0.19.8 - load-tsconfig: 0.2.5 - dev: true + esbuild: '>=0.18' - /cac@6.7.14: + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true - - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - dev: true - - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} - /check-error@1.0.3: + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - /commander@4.1.1: + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - dev: true - /concat-map@0.0.1: + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: true - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: true - - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: true - - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - dev: true - - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 - dev: true - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - dev: true - /detect-indent@6.1.0: + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - dev: true - /diff-sequences@29.6.3: + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /dir-glob@3.0.1: + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - /enquirer@2.4.1: + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - es-set-tostringtag: 2.0.2 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 - dev: true - - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 - dev: true - - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.0 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /esbuild@0.19.8: - resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.8 - '@esbuild/android-arm64': 0.19.8 - '@esbuild/android-x64': 0.19.8 - '@esbuild/darwin-arm64': 0.19.8 - '@esbuild/darwin-x64': 0.19.8 - '@esbuild/freebsd-arm64': 0.19.8 - '@esbuild/freebsd-x64': 0.19.8 - '@esbuild/linux-arm': 0.19.8 - '@esbuild/linux-arm64': 0.19.8 - '@esbuild/linux-ia32': 0.19.8 - '@esbuild/linux-loong64': 0.19.8 - '@esbuild/linux-mips64el': 0.19.8 - '@esbuild/linux-ppc64': 0.19.8 - '@esbuild/linux-riscv64': 0.19.8 - '@esbuild/linux-s390x': 0.19.8 - '@esbuild/linux-x64': 0.19.8 - '@esbuild/netbsd-x64': 0.19.8 - '@esbuild/openbsd-x64': 0.19.8 - '@esbuild/sunos-x64': 0.19.8 - '@esbuild/win32-arm64': 0.19.8 - '@esbuild/win32-ia32': 0.19.8 - '@esbuild/win32-x64': 0.19.8 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true - /esprima@4.0.1: + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - /execa@8.0.1: + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - /extendable-error@0.1.7: + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: true - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - /find-up@4.1.0: + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - /fs-extra@7.0.1: + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - /fs-extra@8.1.0: + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - /fs.realpath@1.0.0: + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - /fsevents@2.3.3: + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-func-name@2.0.2: + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - /get-stream@8.0.1: + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true - /glob-parent@5.1.2: + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - dev: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - /globby@11.1.0: + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /graceful-fs@4.2.11: + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - /has-flag@4.0.0: + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /html-escaper@2.0.2: + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: true + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-id@4.2.0: + resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} + hasBin: true - /human-signals@5.0.0: + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - dev: true - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - dev: true - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} - /inflight@1.0.6: + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - /inherits@2.0.4: + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 - dev: true - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-subdir@1.2.0: + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - dependencies: - better-path-resolve: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.13 - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-windows@1.0.2: + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isexe@2.0.0: + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - /istanbul-lib-coverage@3.2.2: + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - dev: true - /istanbul-lib-report@3.0.1: + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - /joycon@3.1.1: + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - dev: true - /js-tokens@4.0.0: + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + js-yaml@3.15.0: + resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} + hasBin: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} - dev: true - /lines-and-columns@1.2.4: + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - /load-tsconfig@0.2.5: + load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} - dependencies: - mlly: 1.4.2 - pkg-types: 1.0.3 - dev: true - /locate-path@5.0.0: + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true - - /lodash.startcase@4.4.0: + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true - /loupe@2.3.7: + loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - /magicast@0.3.2: - resolution: {integrity: sha512-Fjwkl6a0syt9TFN0JSYpOybxiMCkYNEeOTnOTNRbjphirLakznZXAqrXgj/7GG3D1dvETONNwrBfinvAbpunDg==} - dependencies: - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - source-map-js: 1.0.2 - dev: true + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - /make-dir@4.0.0: + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: true - - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true - - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - dev: true - - /merge-stream@2.0.0: + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - /merge2@1.4.1: + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - /mimic-fn@4.0.0: + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - dev: true - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} - /mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - dev: true + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} - dependencies: - acorn: 8.11.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.2 - dev: true + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /mz@2.7.0: + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true - - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /object-assign@4.1.1: + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: true - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /once@1.4.0: + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /onetime@6.0.0: + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + openapi-typescript@7.13.0: + resolution: {integrity: sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==} + hasBin: true + peerDependencies: + typescript: ^5.x - /outdent@0.5.0: + outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: true - /p-filter@2.1.0: + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} - dependencies: - p-map: 2.1.0 - dev: true - /p-limit@2.3.0: + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-limit@5.0.0: + p-limit@5.0.0: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - /p-locate@4.1.0: + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - /p-map@2.1.0: + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} - dev: true - /p-try@2.2.0: + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.23.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - /path-exists@4.0.0: + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: true - /path-is-absolute@1.0.1: + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - dev: true - /path-key@3.1.1: + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - dev: true - /path-key@4.0.0: + path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@4.0.0: + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - /pathval@1.1.1: + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - dev: true - /pify@4.0.1: + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - dev: true - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - dev: true + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} - /postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: + jiti: '>=1.21.0' postcss: '>=8.0.9' - ts-node: '>=9.0.0' + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true - dependencies: - lilconfig: 3.0.0 - yaml: 2.3.4 - dev: true - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /preferred-pm@3.1.2: - resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} - engines: {node: '>=10'} - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: true - /prettier@2.8.8: + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - dev: true - /pretty-format@29.7.0: + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - /queue-microtask@1.2.3: + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - /read-yaml-file@1.1.0: + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: true - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - dev: true + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: true - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - /resolve-from@5.0.0: + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - /rollup@4.7.0: - resolution: {integrity: sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==} + rollup@4.62.3: + resolution: {integrity: sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.7.0 - '@rollup/rollup-android-arm64': 4.7.0 - '@rollup/rollup-darwin-arm64': 4.7.0 - '@rollup/rollup-darwin-x64': 4.7.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.7.0 - '@rollup/rollup-linux-arm64-gnu': 4.7.0 - '@rollup/rollup-linux-arm64-musl': 4.7.0 - '@rollup/rollup-linux-riscv64-gnu': 4.7.0 - '@rollup/rollup-linux-x64-gnu': 4.7.0 - '@rollup/rollup-linux-x64-musl': 4.7.0 - '@rollup/rollup-win32-arm64-msvc': 4.7.0 - '@rollup/rollup-win32-ia32-msvc': 4.7.0 - '@rollup/rollup-win32-x64-msvc': 4.7.0 - fsevents: 2.3.3 - dev: true - /run-parallel@1.2.0: + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - dev: true - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - /shebang-regex@3.0.0: + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - dev: true - - /siginfo@2.0.0: + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /signal-exit@4.1.0: + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - dev: true - /slash@3.0.0: + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true - - /smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - dependencies: - whatwg-url: 7.1.0 - dev: true + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - /spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - dev: true + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 - dev: true + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 - dev: true + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: true + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - /std-env@3.6.0: - resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} - dev: true + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - dependencies: - mixme: 0.5.10 - dev: true + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - dependencies: - acorn: 8.11.2 - dev: true - - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /term-size@2.2.1: + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - dev: true - /test-exclude@6.0.0: + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.1.6 - minimatch: 3.1.2 - dev: true - /thenify-all@1.6.0: + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - /thenify@3.3.1: + thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - /tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} - dev: true + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - /tinypool@0.8.1: - resolution: {integrity: sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==} - engines: {node: '>=14.0.0'} - dev: true + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - /tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} - engines: {node: '>=14.0.0'} - dev: true + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} - /to-regex-range@5.0.1: + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - dependencies: - punycode: 2.3.1 - dev: true - - /tree-kill@1.2.2: + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - dev: true - - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - /ts-interface-checker@0.1.13: + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - /tsup@8.0.1(typescript@5.3.3): - resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -2861,166 +1375,40 @@ packages: optional: true typescript: optional: true - dependencies: - bundle-require: 4.0.2(esbuild@0.19.8) - cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.19.8 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.1 - postcss-load-config: 4.0.2 - resolve-from: 5.0.0 - rollup: 4.7.0 - source-map: 0.8.0-beta.0 - sucrase: 3.34.0 - tree-kill: 1.2.2 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - dev: true - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true - - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - dev: true - - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - dev: true - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.5 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - /universalify@0.1.2: + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - dev: true - - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.20 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - dev: true - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} - /vite-node@1.0.2(@types/node@20.10.4): - resolution: {integrity: sha512-h7BbMJf46fLvFW/9Ygo3snkIBEHFh6fHpB4lge98H5quYrDhPFeI3S0LREz328uqPWSnii2yeJXktQ+Pmqk5BQ==} + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.1 - picocolors: 1.0.0 - vite: 5.0.7(@types/node@20.10.4) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vite@5.0.7(@types/node@20.10.4): - resolution: {integrity: sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==} + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3028,6 +1416,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -3040,30 +1429,24 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true - dependencies: - '@types/node': 20.10.4 - esbuild: 0.19.8 - postcss: 8.4.32 - rollup: 4.7.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vitest@1.0.2(@types/node@20.10.4): - resolution: {integrity: sha512-F3NVwwpXfRSDnJmyv+ALPwSRVt0zDkRRE18pwUHSUPXAlWQ47rY1dc99ziMW5bBHyqwK2ERjMisLNoef64qk9w==} + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': ^1.0.0 - '@vitest/ui': ^1.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3079,207 +1462,1375 @@ packages: optional: true jsdom: optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + +snapshots: + + '@ampproject/remapping@2.3.0': dependencies: - '@types/node': 20.10.4 - '@vitest/expect': 1.0.2 - '@vitest/runner': 1.0.2 - '@vitest/snapshot': 1.0.2 - '@vitest/spy': 1.0.2 - '@vitest/utils': 1.0.2 - acorn-walk: 8.3.1 - cac: 6.7.14 - chai: 4.3.10 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.5 - pathe: 1.1.1 - picocolors: 1.0.0 - std-env: 3.6.0 - strip-literal: 1.3.0 - tinybench: 2.5.1 - tinypool: 0.8.1 - vite: 5.0.7(@types/node@20.10.4) - vite-node: 1.0.2(@types/node@20.10.4) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + '@babel/code-frame@7.29.7': dependencies: - defaults: 1.0.4 - dev: true + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true + '@babel/helper-string-parser@7.29.7': {} - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - dev: true + '@babel/helper-validator-identifier@7.29.7': {} - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + '@babel/parser@7.29.7': dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true + '@babel/types': 7.29.7 - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true + '@babel/runtime@7.29.7': {} - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} + '@babel/types@7.29.7': dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: true + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bcoe/v8-coverage@0.2.3': {} - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} + '@changesets/apply-release-plan@7.1.1': dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true + '@changesets/config': 3.1.4 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.8.5 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + '@changesets/assemble-release-plan@6.0.10': dependencies: - isexe: 2.0.0 - dev: true + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.8.5 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@changesets/changelog-git@0.2.1': dependencies: - isexe: 2.0.0 - dev: true + '@changesets/types': 6.1.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + '@changesets/cli@2.31.1(@types/node@20.19.43)': dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@20.19.43) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.8.5 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + '@changesets/config@3.1.4': dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + '@changesets/errors@0.2.0': dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true + extendable-error: 0.1.7 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + '@changesets/get-dependents-graph@2.1.4': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.8.5 - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true + '@changesets/get-release-plan@4.0.16': + dependencies: + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + '@changesets/get-version-range-type@0.4.0': {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.3.0 - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + '@changesets/pre@2.0.2': dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + '@changesets/should-skip-package@0.1.2': dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.2.0 + prettier: 2.8.8 - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + '@esbuild/aix-ppc64@0.21.5': + optional: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@inquirer/external-editor@1.0.3(@types/node@20.19.43)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@istanbuljs/schema@0.1.6': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.29.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.29.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.17(supports-color@10.2.2)': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + js-levenshtein: 1.1.6 + js-yaml: 4.2.0 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@rollup/rollup-android-arm-eabi@4.62.3': + optional: true + + '@rollup/rollup-android-arm64@4.62.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.3': + optional: true + + '@rollup/rollup-darwin-x64@4.62.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.3': + optional: true + + '@sinclair/typebox@0.27.12': {} + + '@types/estree@1.0.9': {} + + '@types/node@12.20.55': {} + + '@types/node@20.19.43': + dependencies: + undici-types: 6.21.0 + + '@vitest/coverage-v8@1.6.1(vitest@1.6.1(@types/node@20.19.43))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.3(supports-color@10.2.2) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + test-exclude: 6.0.0 + vitest: 1.6.1(@types/node@20.19.43) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.21 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + acorn-walk@8.3.5: + dependencies: + acorn: 8.18.0 + + acorn@8.18.0: {} + + agent-base@7.1.4: {} + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-styles@5.2.0: {} + + any-promise@1.3.0: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assertion-error@1.1.0: {} + + balanced-match@1.0.2: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + brace-expansion@1.1.16: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bundle-require@5.1.0(esbuild@0.27.7): + dependencies: + esbuild: 0.27.7 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + change-case@5.4.4: {} + + chardet@2.2.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + colorette@1.4.0: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.3(supports-color@10.2.2): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + detect-indent@6.1.0: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esprima@4.0.1: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + extendable-error@0.1.7: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.62.3 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-func-name@2.0.2: {} + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + html-escaper@2.0.2: {} + + https-proxy-agent@7.0.6(supports-color@10.2.2): + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + human-id@4.2.0: {} + + human-signals@5.0.0: {} + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + index-to-position@1.2.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-stream@3.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@10.2.2) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + joycon@3.1.1: {} + + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.15.0: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + + json-schema-traverse@1.0.0: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.8.2 + pkg-types: 1.3.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.5 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mimic-fn@4.0.0: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.16 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.2 + + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + mri@1.2.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.16: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + openapi-typescript@7.13.0(typescript@5.9.3): + dependencies: + '@redocly/openapi-core': 1.34.17(supports-color@10.2.2) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.3.0 + supports-color: 10.2.2 + typescript: 5.9.3 + yargs-parser: 21.1.1 + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.7 + index-to-position: 1.2.0 + type-fest: 4.41.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@1.1.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.5: {} + + pify@4.0.1: {} + + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pluralize@8.0.0: {} + + postcss-load-config@6.0.1(postcss@8.5.23): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.23 + + postcss@8.5.23: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@2.8.8: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + react-is@18.3.1: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.15.0 + pify: 4.0.1 + strip-bom: 3.0.0 + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + + rollup@4.62.3: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.3 + '@rollup/rollup-android-arm64': 4.62.3 + '@rollup/rollup-darwin-arm64': 4.62.3 + '@rollup/rollup-darwin-x64': 4.62.3 + '@rollup/rollup-freebsd-arm64': 4.62.3 + '@rollup/rollup-freebsd-x64': 4.62.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.3 + '@rollup/rollup-linux-arm-musleabihf': 4.62.3 + '@rollup/rollup-linux-arm64-gnu': 4.62.3 + '@rollup/rollup-linux-arm64-musl': 4.62.3 + '@rollup/rollup-linux-loong64-gnu': 4.62.3 + '@rollup/rollup-linux-loong64-musl': 4.62.3 + '@rollup/rollup-linux-ppc64-gnu': 4.62.3 + '@rollup/rollup-linux-ppc64-musl': 4.62.3 + '@rollup/rollup-linux-riscv64-gnu': 4.62.3 + '@rollup/rollup-linux-riscv64-musl': 4.62.3 + '@rollup/rollup-linux-s390x-gnu': 4.62.3 + '@rollup/rollup-linux-x64-gnu': 4.62.3 + '@rollup/rollup-linux-x64-musl': 4.62.3 + '@rollup/rollup-openbsd-x64': 4.62.3 + '@rollup/rollup-openharmony-arm64': 4.62.3 + '@rollup/rollup-win32-arm64-msvc': 4.62.3 + '@rollup/rollup-win32-ia32-msvc': 4.62.3 + '@rollup/rollup-win32-x64-gnu': 4.62.3 + '@rollup/rollup-win32-x64-msvc': 4.62.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.8.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.7.6: {} + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + + supports-color@10.2.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + term-size@2.2.1: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 7.2.3 + minimatch: 3.1.5 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tsup@8.5.1(postcss@8.5.23)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.7) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3(supports-color@10.2.2) + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.23) + resolve-from: 5.0.0 + rollup: 4.62.3 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.23 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + type-detect@4.1.0: {} + + type-fest@4.41.0: {} + + typescript@5.9.3: {} + + ufo@1.6.4: {} + + undici-types@6.21.0: {} + + universalify@0.1.2: {} + + uri-js-replace@1.0.1: {} + + vite-node@1.6.1(@types/node@20.19.43): + dependencies: + cac: 6.7.14 + debug: 4.4.3(supports-color@10.2.2) + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.21(@types/node@20.19.43) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.21(@types/node@20.19.43): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.23 + rollup: 4.62.3 + optionalDependencies: + '@types/node': 20.19.43 + fsevents: 2.3.3 + + vitest@1.6.1(@types/node@20.19.43): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.5 + chai: 4.5.0 + debug: 4.4.3(supports-color@10.2.2) + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.21 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.21(@types/node@20.19.43) + vite-node: 1.6.1(@types/node@20.19.43) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.43 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrappy@1.0.2: {} + + yaml-ast-parser@0.0.43: {} + + yargs-parser@21.1.1: {} + + yocto-queue@1.2.2: {} diff --git a/scripts/check-generated.mjs b/scripts/check-generated.mjs new file mode 100644 index 0000000..715c4f7 --- /dev/null +++ b/scripts/check-generated.mjs @@ -0,0 +1,31 @@ +/** + * Fail when `src/generated/schema.ts` no longer matches `spec/openapi.json`. + * + * The types in this package are GENERATED. A hand-edit, or a spec update with + * no regeneration, puts the SDK back exactly where it was before this rewrite: + * describing an API that has moved on. CI runs this so that cannot happen + * quietly. + */ +import { execFileSync } from "node:child_process"; +import { readFileSync, mkdtempSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +const out = join(mkdtempSync(join(tmpdir(), "dm-sdk-")), "schema.ts"); +execFileSync("npx", ["openapi-typescript", "spec/openapi.json", "-o", out], { + stdio: "inherit", +}); + +const fresh = readFileSync(out, "utf8"); +const committed = readFileSync("src/generated/schema.ts", "utf8"); + +if (fresh !== committed) { + console.error( + "\nsrc/generated/schema.ts is stale or hand-edited.\n" + + "Run `pnpm generate` and commit the result.\n" + + "These types are generated from spec/openapi.json - editing them by hand\n" + + "is how this package fell 2.5 years behind the API.\n", + ); + process.exit(1); +} +console.log("generated types match the spec"); diff --git a/spec/openapi.json b/spec/openapi.json new file mode 100644 index 0000000..dd4834e --- /dev/null +++ b/spec/openapi.json @@ -0,0 +1,10551 @@ +{ + "components": { + "schemas": { + "ApiError": { + "properties": { + "code": { + "type": "string" + }, + "details": { + "type": "string" + }, + "error": { + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + "DeletedResult": { + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" + }, + "KeyMapDeleteResult": { + "properties": { + "deleted": { + "description": "Entries removed", + "type": "integer" + }, + "message": { + "type": "string" + } + }, + "required": [ + "message", + "deleted" + ], + "type": "object" + }, + "KeyMapEntriesPage": { + "properties": { + "entries": { + "items": { + "$ref": "#/components/schemas/KeyMapEntry" + }, + "type": "array" + }, + "mapName": { + "type": "string" + }, + "page": { + "description": "1-based", + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "description": "Entries matching the filter, not this page", + "type": "integer" + } + }, + "required": [ + "mapName", + "page", + "pageSize", + "total", + "entries" + ], + "type": "object" + }, + "KeyMapEntry": { + "properties": { + "newKey": { + "type": "string" + }, + "object": { + "type": "string" + }, + "oldKey": { + "type": "string" + }, + "runId": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "description": "ISO-8601 timestamp", + "type": "string" + } + }, + "required": [ + "object", + "oldKey", + "newKey", + "runId", + "updatedAt" + ], + "type": "object" + }, + "KeyMapLookupResult": { + "properties": { + "mapName": { + "type": "string" + }, + "mappings": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "missing": { + "items": { + "type": "string" + }, + "type": "array" + }, + "object": { + "type": "string" + } + }, + "required": [ + "mapName", + "object", + "mappings", + "missing" + ], + "type": "object" + }, + "KeyMapSummary": { + "properties": { + "entryCount": { + "type": "integer" + }, + "mapName": { + "type": "string" + }, + "object": { + "description": "The domain object type, e.g. Material", + "type": "string" + }, + "updatedAt": { + "description": "ISO-8601 timestamp", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "mapName", + "object", + "entryCount", + "updatedAt" + ], + "type": "object" + }, + "KeyMapUpsertResult": { + "properties": { + "mapName": { + "type": "string" + }, + "object": { + "type": "string" + }, + "upserted": { + "description": "Rows inserted or updated", + "type": "integer" + } + }, + "required": [ + "mapName", + "object", + "upserted" + ], + "type": "object" + }, + "MaskingPolicy": { + "properties": { + "consistent": { + "type": "boolean" + }, + "createdAt": { + "description": "ISO-8601 timestamp", + "type": "string" + }, + "createdBy": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "fields": {}, + "id": { + "type": "string" + }, + "keyMapName": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "reversible": { + "type": "boolean" + }, + "teamId": { + "type": "string" + }, + "updatedAt": { + "description": "ISO-8601 timestamp", + "type": "string" + } + }, + "required": [ + "id", + "name", + "description", + "consistent", + "reversible", + "keyMapName", + "createdAt", + "updatedAt", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + }, + "Plan": { + "properties": { + "createdAt": { + "description": "ISO-8601 timestamp", + "type": "string" + }, + "createdBy": { + "type": [ + "string", + "null" + ] + }, + "createdFrom": { + "type": [ + "string", + "null" + ] + }, + "env": { + "type": [ + "string", + "null" + ] + }, + "history": { + "items": { + "properties": { + "by": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + }, + "when": { + "type": "string" + } + }, + "required": [ + "status", + "when", + "note" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "origin": { + "enum": [ + "chat", + "blueprint", + "intake", + "gap analysis", + null + ], + "type": [ + "string", + "null" + ] + }, + "owner": { + "type": [ + "string", + "null" + ] + }, + "projectId": { + "type": "string" + }, + "rows": { + "type": "integer" + }, + "spec": { + "properties": { + "approval": { + "properties": { + "reason": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "role", + "reason" + ], + "type": "object" + }, + "capabilities": { + "items": { + "properties": { + "expectedCount": { + "minimum": 0, + "type": "integer" + }, + "expectedSumCents": { + "type": "integer" + }, + "group": { + "type": "string" + }, + "hidden": { + "default": false, + "type": "boolean" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "setId": { + "type": "string" + }, + "source": { + "default": "derived", + "enum": [ + "derived", + "manual" + ], + "type": "string" + }, + "sumField": { + "type": "string" + }, + "template": { + "type": "string" + }, + "templateId": { + "type": "string" + } + }, + "required": [ + "key", + "name", + "source", + "hidden", + "note" + ], + "type": "object" + }, + "type": "array" + }, + "constraints": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "coverage": { + "items": { + "properties": { + "count": { + "minimum": 0, + "type": "integer" + }, + "family": { + "type": "string" + }, + "items": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "family", + "count", + "items" + ], + "type": "object" + }, + "type": "array" + }, + "coverageConfig": { + "properties": { + "freshnessDays": { + "default": 14, + "minimum": 1, + "type": "integer" + }, + "mode": { + "default": "release", + "enum": [ + "release", + "migration" + ], + "type": "string" + }, + "sourceSystem": { + "type": "string" + }, + "sumToleranceCents": { + "default": 0, + "minimum": 0, + "type": "integer" + }, + "targetSystem": { + "type": "string" + } + }, + "required": [ + "mode", + "freshnessDays", + "sumToleranceCents" + ], + "type": "object" + }, + "entities": { + "default": [], + "items": { + "properties": { + "endpointId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "template": { + "type": "string" + }, + "templateId": { + "type": "string" + }, + "volume": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "name", + "template", + "volume", + "key", + "note" + ], + "type": "object" + }, + "type": "array" + }, + "expectations": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "flow": { + "items": { + "properties": { + "loop": { + "type": [ + "string", + "null" + ] + }, + "phase": { + "type": "string" + }, + "steps": { + "items": { + "properties": { + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "from": { + "type": "string" + }, + "iface": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "msg": { + "type": "string" + }, + "reachable": { + "type": "boolean" + }, + "scaffold": { + "properties": { + "entity": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ops": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "entity", + "ops", + "fields" + ], + "type": "object" + }, + "status": { + "enum": [ + "mapped", + "likely", + "custom", + "unknown" + ], + "type": "string" + }, + "to": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "from", + "to", + "msg", + "iface", + "kind", + "status" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "phase", + "steps" + ], + "type": "object" + }, + "type": "array" + }, + "gaps": { + "default": [], + "items": { + "properties": { + "action": { + "type": "string" + }, + "iface": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "scaffold": { + "properties": { + "entity": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ops": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "entity", + "ops", + "fields" + ], + "type": "object" + }, + "title": { + "type": "string" + }, + "type": { + "enum": [ + "connect", + "custom", + "input", + "blocker", + "gap", + "stale" + ], + "type": "string" + } + }, + "required": [ + "type", + "title", + "note" + ], + "type": "object" + }, + "type": "array" + }, + "integrations": { + "default": [], + "items": { + "properties": { + "access": { + "enum": [ + "read", + "write" + ], + "type": "string" + }, + "detail": { + "default": "", + "type": "string" + }, + "system": { + "type": "string" + }, + "via": { + "type": "string" + } + }, + "required": [ + "system", + "via", + "access", + "detail" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "enum": [ + "entity", + "flow", + "task", + "mapping" + ], + "type": "string" + }, + "lanes": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "lifecycle": { + "properties": { + "mode": { + "type": "string" + }, + "refresh": { + "type": "string" + }, + "replenish": { + "type": "string" + } + }, + "required": [ + "mode", + "refresh", + "replenish" + ], + "type": "object" + }, + "mappingConfig": { + "properties": { + "keyMapName": { + "type": "string" + }, + "maskingPolicyId": { + "type": "string" + }, + "maskingPolicyName": { + "type": "string" + }, + "sourceObject": { + "type": "string" + }, + "sourceSystem": { + "type": "string" + }, + "targetObject": { + "type": "string" + }, + "targetSystem": { + "type": "string" + } + }, + "type": "object" + }, + "mappings": { + "items": { + "properties": { + "generate": { + "default": false, + "type": "boolean" + }, + "keyMapName": { + "type": "string" + }, + "maskingPolicyId": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "sourceField": { + "type": "string" + }, + "status": { + "default": "open", + "enum": [ + "mapped", + "open", + "needs-review" + ], + "type": "string" + }, + "targetField": { + "type": "string" + }, + "transform": { + "default": "", + "type": "string" + } + }, + "required": [ + "targetField", + "transform", + "generate", + "status", + "note" + ], + "type": "object" + }, + "type": "array" + }, + "steps": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "tasks": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "tasks": { + "items": { + "properties": { + "deps": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "detail": { + "default": "", + "type": "string" + }, + "key": { + "type": "string" + }, + "priority": { + "enum": [ + "P0", + "P1", + "P2", + "P3" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title", + "detail", + "deps" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "phase", + "tasks" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "properties": { + "by": { + "type": "string" + }, + "n": { + "minimum": 1, + "type": "integer" + }, + "when": { + "type": "string" + } + }, + "required": [ + "n", + "by", + "when" + ], + "type": "object" + } + }, + "required": [ + "lanes", + "entities", + "gaps", + "integrations", + "constraints", + "steps", + "expectations" + ], + "type": "object" + }, + "status": { + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "teamId": { + "type": "string" + }, + "title": { + "type": "string" + }, + "updatedAt": { + "description": "ISO-8601 timestamp", + "type": "string" + }, + "write": { + "type": "boolean" + } + }, + "required": [ + "id", + "title", + "summary", + "status", + "origin", + "createdFrom", + "owner", + "env", + "write", + "rows", + "targets", + "spec", + "history", + "createdAt", + "updatedAt", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + }, + "PlanDeleteResult": { + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" + }, + "Project": { + "properties": { + "avatar": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "description": "ISO-8601 timestamp", + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "avatar", + "description", + "createdAt", + "createdBy", + "teamId" + ], + "type": "object" + }, + "Set": { + "properties": { + "createdAt": { + "description": "ISO-8601 timestamp", + "type": "string" + }, + "createdBy": { + "type": [ + "string", + "null" + ] + }, + "data": {}, + "description": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "locked": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "rowCount": { + "type": "integer" + }, + "teamId": { + "type": "string" + }, + "updatedAt": { + "description": "ISO-8601 timestamp", + "type": "string" + } + }, + "required": [ + "id", + "name", + "description", + "rowCount", + "locked", + "createdAt", + "updatedAt", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + }, + "SetDetail": { + "allOf": [ + { + "$ref": "#/components/schemas/Set" + } + ], + "properties": { + "createdByName": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "createdByName" + ] + }, + "Template": { + "properties": { + "createdAt": { + "description": "ISO-8601 timestamp", + "type": "string" + }, + "createdBy": { + "type": [ + "string", + "null" + ] + }, + "dbOrderIdx": { + "type": "integer" + }, + "fields": {}, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": [ + "string", + "null" + ] + }, + "seed": { + "type": [ + "integer", + "null" + ] + }, + "simulationConfig": { + "type": "null" + }, + "teamId": { + "type": [ + "string", + "null" + ] + }, + "templateFolderId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "name", + "dbOrderIdx", + "seed", + "createdAt", + "createdBy", + "templateFolderId", + "projectId", + "teamId" + ], + "type": "object" + } + } + }, + "info": { + "description": "API for Automators DataMaker", + "title": "DataMaker API", + "version": "0.9.17" + }, + "openapi": "3.1.0", + "paths": { + "/address/availability": { + "get": { + "description": "Whether the address dataset is configured and available", + "operationId": "getAddressAvailability", + "parameters": [], + "responses": {}, + "tags": [ + "Address" + ] + } + }, + "/address/cities": { + "get": { + "description": "List distinct cities for a country (code or name)", + "operationId": "getAddressCities", + "parameters": [], + "responses": {}, + "tags": [ + "Address" + ] + } + }, + "/address/countries": { + "get": { + "description": "List distinct countries available in the address dataset", + "operationId": "getAddressCountries", + "parameters": [], + "responses": {}, + "tags": [ + "Address" + ] + } + }, + "/address/postcodes": { + "get": { + "description": "List distinct postcodes for a country (code or name)", + "operationId": "getAddressPostcodes", + "parameters": [], + "responses": {}, + "tags": [ + "Address" + ] + } + }, + "/address/regions": { + "get": { + "description": "List distinct regions for a country (code or name)", + "operationId": "getAddressRegions", + "parameters": [], + "responses": {}, + "tags": [ + "Address" + ] + } + }, + "/agent/approvals": { + "get": { + "description": "List pending approval requests for a chat", + "operationId": "getAgentApprovals", + "parameters": [], + "responses": {}, + "tags": [ + "Approvals" + ] + }, + "post": { + "description": "Resolve or create an approval request for a large agent write", + "operationId": "postAgentApprovals", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "chatId": { + "type": "string" + }, + "rowCount": { + "type": "number" + }, + "targetKind": { + "type": "string" + }, + "targetRef": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "rowCount" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Approvals" + ] + } + }, + "/agent/approvals/{id}/deny": { + "post": { + "description": "Reject a large agent write", + "operationId": "postAgentApprovalsByIdDeny", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Approvals" + ] + } + }, + "/agent/approvals/{id}/grant": { + "post": { + "description": "Approve a large agent write", + "operationId": "postAgentApprovalsByIdGrant", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Approvals" + ] + } + }, + "/analyze-image": { + "post": { + "description": "Analyze image and return description", + "operationId": "postAnalyze-image", + "parameters": [], + "responses": {}, + "tags": [ + "Analyze" + ] + } + }, + "/analyze-pdf": { + "post": { + "description": "Analyze PDF documents by extracting structured key information like dates, titles, invoice numbers, and other business document fields", + "operationId": "postAnalyze-pdf", + "parameters": [], + "responses": {}, + "tags": [ + "PDF Analysis" + ] + } + }, + "/apiKeys": { + "get": { + "description": "Get API keys filtered by scope", + "operationId": "getApiKeys", + "parameters": [], + "responses": {}, + "tags": [ + "API Keys" + ] + }, + "post": { + "description": "Create a new API key", + "operationId": "postApiKeys", + "parameters": [], + "responses": {}, + "tags": [ + "API Keys" + ] + } + }, + "/apiKeys/{id}": { + "delete": { + "description": "Delete an API key", + "operationId": "deleteApiKeysById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "API Keys" + ] + }, + "put": { + "description": "Update an API key", + "operationId": "putApiKeysById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "API Keys" + ] + } + }, + "/audit/events": { + "get": { + "description": "List recent agent audit events for the current team", + "operationId": "getAuditEvents", + "parameters": [], + "responses": {}, + "tags": [ + "Audit" + ] + }, + "post": { + "description": "Record an agent tool-invocation audit event", + "operationId": "postAuditEvents", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "category": { + "type": "string" + }, + "chatId": { + "type": "string" + }, + "decision": { + "type": "string" + }, + "durationMs": { + "type": "number" + }, + "error": { + "type": "string" + }, + "finishedAt": { + "type": "string" + }, + "inputDigest": {}, + "sdkSessionId": { + "type": "string" + }, + "startedAt": { + "type": "string" + }, + "status": { + "type": "string" + }, + "targetKind": { + "type": "string" + }, + "targetRef": { + "type": "string" + }, + "tool": { + "type": "string" + }, + "trackingId": { + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Audit" + ] + } + }, + "/auth/logout": { + "post": { + "description": "Revoke a refresh token and its rotation family.", + "operationId": "postAuthLogout", + "parameters": [], + "responses": {}, + "tags": [ + "Auth" + ] + } + }, + "/auth/refresh": { + "post": { + "description": "Rotate a refresh token for a new access token (+ rotated refresh token).", + "operationId": "postAuthRefresh", + "parameters": [], + "responses": {}, + "tags": [ + "Auth" + ] + } + }, + "/auth/session": { + "post": { + "description": "Exchange the current login for a desktop access + refresh token pair (stay-signed-in).", + "operationId": "postAuthSession", + "parameters": [], + "responses": {}, + "tags": [ + "Auth" + ] + } + }, + "/blob/{key}": { + "get": { + "description": "Serve a blob's bytes from the local filesystem store (local-first mode).", + "operationId": "getBlobByKey", + "parameters": [ + { + "in": "path", + "name": "key", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Blob" + ] + } + }, + "/chat-assets": { + "get": { + "description": "List assets for a chat", + "operationId": "getChat-assets", + "parameters": [], + "responses": {}, + "tags": [ + "Chat Assets" + ] + }, + "post": { + "description": "Create a new chat asset", + "operationId": "postChat-assets", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "chatId": { + "type": "string" + }, + "filename": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "s3Key": { + "type": "string" + }, + "size": { + "type": "number" + }, + "source": { + "enum": [ + "agent", + "upload" + ], + "type": "string" + } + }, + "required": [ + "chatId", + "filename", + "s3Key" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Chat Assets" + ] + } + }, + "/chat-assets/{id}": { + "delete": { + "description": "Delete a chat asset", + "operationId": "deleteChat-assetsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Chat Assets" + ] + } + }, + "/chats": { + "get": { + "description": "Get all chats for the current user", + "operationId": "getChats", + "parameters": [], + "responses": {}, + "tags": [ + "Chats" + ] + }, + "post": { + "description": "Create a new chat", + "operationId": "postChats", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "messages": {}, + "title": { + "default": "New Chat", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Chats" + ] + } + }, + "/chats/{id}": { + "delete": { + "description": "Delete a chat", + "operationId": "deleteChatsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Chats" + ] + }, + "get": { + "description": "Get a chat by id", + "operationId": "getChatsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Chats" + ] + }, + "put": { + "description": "Update a chat", + "operationId": "putChatsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "messages": {}, + "title": { + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Chats" + ] + } + }, + "/config": { + "get": { + "description": "Get shared datamaker config", + "operationId": "getConfig", + "parameters": [], + "responses": {}, + "tags": [ + "Config" + ] + } + }, + "/connections": { + "get": { + "description": "Get all connections", + "operationId": "getConnections", + "parameters": [], + "responses": {}, + "tags": [ + "Connections" + ] + }, + "post": { + "description": "Create a new connection", + "operationId": "postConnections", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "connectionString": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "endpointFolderId": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "readOnly": { + "type": "boolean" + }, + "teamId": { + "type": "string" + }, + "type": { + "enum": [ + "db2", + "postgresql", + "mysql", + "mssql", + "mongodb", + "oracle" + ], + "type": "string" + } + }, + "required": [ + "name", + "type", + "connectionString", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Connections" + ] + } + }, + "/connections/tables": { + "get": { + "description": "Get tables and metadata for a specific connection", + "operationId": "getConnectionsTables", + "parameters": [], + "responses": {}, + "tags": [ + "Tables" + ] + } + }, + "/connections/test": { + "post": { + "description": "Test a connection", + "operationId": "postConnectionsTest", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "connectionString": { + "type": "string" + }, + "type": { + "enum": [ + "db2", + "postgresql", + "mysql", + "mssql", + "mongodb", + "oracle" + ], + "type": "string" + } + }, + "required": [ + "connectionString", + "type" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Connections" + ] + } + }, + "/connections/{id}": { + "delete": { + "description": "Delete a connection", + "operationId": "deleteConnectionsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Connections" + ] + }, + "get": { + "description": "Get a single connection by id", + "operationId": "getConnectionsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Connections" + ] + }, + "put": { + "description": "Update a connection", + "operationId": "putConnectionsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "connectionString": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "endpointFolderId": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "readOnly": { + "type": "boolean" + }, + "teamId": { + "type": "string" + }, + "type": { + "enum": [ + "db2", + "postgresql", + "mysql", + "mssql", + "mongodb", + "oracle" + ], + "type": "string" + } + }, + "required": [ + "name", + "type", + "connectionString", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Connections" + ] + } + }, + "/customDataTypes": { + "get": { + "description": "Get all custom data types", + "operationId": "getCustomDataTypes", + "parameters": [], + "responses": {}, + "tags": [ + "Custom Data Types" + ] + }, + "post": { + "description": "Create a new custom data type", + "operationId": "postCustomDataTypes", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdBy": { + "type": "string" + }, + "fieldConfig": {}, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "teamId", + "projectId", + "createdBy" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Custom Data Types" + ] + } + }, + "/customDataTypes/{id}": { + "delete": { + "description": "Delete a custom data type", + "operationId": "deleteCustomDataTypesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Custom Data Types" + ] + }, + "put": { + "description": "Update a custom data type", + "operationId": "putCustomDataTypesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdBy": { + "type": "string" + }, + "fieldConfig": {}, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "teamId", + "projectId", + "createdBy" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Custom Data Types" + ] + } + }, + "/datamaker": { + "post": { + "description": "Generate data based on template fields", + "operationId": "postDatamaker", + "parameters": [], + "responses": {}, + "tags": [ + "DataMaker" + ] + } + }, + "/endpointFolders": { + "get": { + "description": "Route to get all endpoint folders", + "operationId": "getEndpointFolders", + "parameters": [], + "responses": {}, + "tags": [ + "Endpoint Folders" + ] + }, + "post": { + "description": "Route to create a new endpoint folder", + "operationId": "postEndpointFolders", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdAt": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Endpoint Folders" + ] + } + }, + "/endpointFolders/{id}": { + "delete": { + "description": "Route to delete an endpoint folder", + "operationId": "deleteEndpointFoldersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Endpoint Folders" + ] + }, + "put": { + "description": "Route to update an endpoint folder", + "operationId": "putEndpointFoldersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Endpoint Folders" + ] + } + }, + "/endpoints": { + "get": { + "description": "Get all endpoints", + "operationId": "getEndpoints", + "parameters": [], + "responses": {}, + "tags": [ + "Endpoints" + ] + }, + "post": { + "description": "Create a new endpoint", + "operationId": "postEndpoints", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdBy": { + "type": "string" + }, + "endpointFolderId": { + "type": [ + "string", + "null" + ] + }, + "headers": {}, + "id": { + "type": "string" + }, + "integrationId": { + "type": [ + "string", + "null" + ] + }, + "meta": {}, + "method": { + "enum": [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "queryParams": {}, + "teamId": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "method", + "url", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Endpoints" + ] + } + }, + "/endpoints/auth-resolve": { + "post": { + "description": "Resolve an endpoint's usable credentials: the Authorization header (decrypt Basic / exchange OAuth2), the auth type, and - for Basic auth - the decrypted username/password. Used by the desktop execution sidecar and by scenarios that need to authenticate to an external system with the endpoint's real credentials. Decryption stays central; access is gated by the same endpoint access check as the rest of the API.", + "operationId": "postEndpointsAuth-resolve", + "parameters": [], + "responses": {}, + "tags": [ + "Endpoints" + ] + } + }, + "/endpoints/{id}": { + "delete": { + "description": "Delete an endpoint", + "operationId": "deleteEndpointsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Endpoints" + ] + }, + "get": { + "description": "Get an endpoint by ID", + "operationId": "getEndpointsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Endpoints" + ] + }, + "put": { + "description": "Update an endpoint", + "operationId": "putEndpointsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdBy": { + "type": "string" + }, + "endpointFolderId": { + "type": [ + "string", + "null" + ] + }, + "headers": {}, + "id": { + "type": "string" + }, + "integrationId": { + "type": [ + "string", + "null" + ] + }, + "meta": {}, + "method": { + "enum": [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "queryParams": {}, + "teamId": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name", + "method", + "url", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Endpoints" + ] + } + }, + "/execute-python": { + "post": { + "description": "Execute a Python file from a URL using the datamaker runner. By default waits for completion, set async=true for immediate return.", + "operationId": "postExecute-python", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "async": { + "default": false, + "type": "boolean" + }, + "projectId": { + "type": "string" + }, + "requirementsUrl": { + "format": "uri", + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Execution" + ] + } + }, + "/export/db": { + "post": { + "description": "Export to Database", + "operationId": "postExportDb", + "parameters": [], + "responses": {}, + "tags": [ + "Export" + ] + } + }, + "/export/rest": { + "post": { + "description": "Export to REST API", + "operationId": "postExportRest", + "parameters": [], + "responses": {}, + "tags": [ + "Export" + ] + } + }, + "/feedback": { + "get": { + "description": "Get all feedback", + "operationId": "getFeedback", + "parameters": [], + "responses": {}, + "tags": [ + "Feedback" + ] + }, + "post": { + "description": "Create new feedback", + "operationId": "postFeedback", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "comment": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "feeling": { + "enum": [ + "EXCITED", + "HAPPY", + "SAD", + "HATE" + ], + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "feeling", + "createdBy" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Feedback" + ] + } + }, + "/feedback/{id}": { + "delete": { + "description": "Delete feedback", + "operationId": "deleteFeedbackById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Feedback" + ] + }, + "put": { + "description": "Update feedback", + "operationId": "putFeedbackById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "comment": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "feeling": { + "enum": [ + "EXCITED", + "HAPPY", + "SAD", + "HATE" + ], + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "feeling", + "createdBy" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Feedback" + ] + } + }, + "/fields": { + "get": { + "description": "Get all fields", + "operationId": "getFields", + "parameters": [], + "responses": {}, + "tags": [ + "Fields" + ] + } + }, + "/generate/database-templates": { + "post": { + "description": "Analyze a relational database and propose DataMaker templates + prompts", + "operationId": "postGenerateDatabase-templates", + "parameters": [], + "responses": {}, + "tags": [ + "DataMaker" + ] + } + }, + "/generate/openapi/{format}": { + "post": { + "description": "Generate an OpenAPI spec from a JSON or YAML file.", + "operationId": "postGenerateOpenapiByFormat", + "parameters": [ + { + "in": "path", + "name": "format", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "OpenAPI" + ] + } + }, + "/generate/sensitive": { + "post": { + "description": "Classify template fields as sensitive (PII) data", + "operationId": "postGenerateSensitive", + "parameters": [], + "responses": {}, + "tags": [ + "DataMaker" + ] + } + }, + "/generate/template": { + "post": { + "description": "Generate a template from JSON or CSV data.", + "operationId": "postGenerateTemplate", + "parameters": [], + "responses": {}, + "tags": [ + "Templates" + ] + } + }, + "/getcsrftoken": { + "post": { + "description": "Get CSRF token from SAP system", + "operationId": "postGetcsrftoken", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "authorization": {}, + "endpointId": { + "minLength": 1, + "type": "string" + }, + "sapUrl": { + "format": "uri", + "type": "string" + } + }, + "required": [ + "sapUrl" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "CSRF" + ] + } + }, + "/integrations": { + "get": { + "description": "Get all integrations", + "operationId": "getIntegrations", + "parameters": [], + "responses": {}, + "tags": [ + "Integrations" + ] + }, + "post": { + "description": "Create a new integration", + "operationId": "postIntegrations", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "auth": {}, + "createdBy": { + "type": "string" + }, + "endpointFolderId": { + "type": [ + "string", + "null" + ] + }, + "headers": {}, + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "scope": { + "type": [ + "string", + "null" + ] + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "origin", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/test": { + "post": { + "description": "Probe an integration's connection (no persistence). Returns whether the origin + credentials are reachable and accepted.", + "operationId": "postIntegrationsTest", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "auth": {}, + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "origin": { + "type": "string" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}": { + "delete": { + "description": "Delete an integration", + "operationId": "deleteIntegrationsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + }, + "get": { + "description": "Get an integration by ID", + "operationId": "getIntegrationsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + }, + "put": { + "description": "Update an integration", + "operationId": "putIntegrationsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "auth": {}, + "createdBy": { + "type": "string" + }, + "endpointFolderId": { + "type": [ + "string", + "null" + ] + }, + "headers": {}, + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "scope": { + "type": [ + "string", + "null" + ] + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "origin", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/endpoints": { + "post": { + "description": "Create a DataMaker endpoint for one of this integration's OData services, linked to the integration so it INHERITS the system credentials (no auth is stored on the endpoint itself). The service root URL is resolved from the Gateway catalog by service id. Use this instead of creating a raw endpoint - a standalone endpoint has no credentials and SAP will reject it (401).", + "operationId": "postIntegrationsByIdEndpoints", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "entitySet": { + "type": "string" + }, + "name": { + "type": "string" + }, + "service": { + "type": "string" + } + }, + "required": [ + "service" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/jira/createmeta": { + "get": { + "description": "Create-metadata for a project (?project=KEY required): without ?issueTypeId= lists the project's issue types; with it, that type's fields incl. which are required and their allowed values. Call before creating an issue so the payload is valid.", + "operationId": "getIntegrationsByIdJiraCreatemeta", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/jira/issues": { + "post": { + "description": "Create a Jira issue (e.g. a defect from a failed scenario run). Body: projectKey, issueType (name, e.g. Bug), summary, optional description (plain text - converted to ADF), labels, priority. Returns the new key + browse URL. Blocked when the connection is read-only.", + "operationId": "postIntegrationsByIdJiraIssues", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "description": { + "type": "string" + }, + "issueType": { + "minLength": 1, + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "priority": { + "type": "string" + }, + "projectKey": { + "minLength": 1, + "type": "string" + }, + "summary": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "projectKey", + "issueType", + "summary" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/jira/issues/{issueKey}": { + "get": { + "description": "Read one Jira issue by key (e.g. PROJ-123): summary, status, description flattened to plain text, labels, links, parent. The richest input for deriving test data from a story's acceptance criteria.", + "operationId": "getIntegrationsByIdJiraIssuesByIssueKey", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "issueKey", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/jira/issues/{issueKey}/comment": { + "post": { + "description": "Add a plain-text comment to a Jira issue (converted to ADF). Blocked when the connection is read-only.", + "operationId": "postIntegrationsByIdJiraIssuesByIssueKeyComment", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "issueKey", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/jira/issues/{issueKey}/transitions": { + "get": { + "description": "List the workflow transitions currently available on a Jira issue (id + name + target status). Read-only; use the POST variant to apply one.", + "operationId": "getIntegrationsByIdJiraIssuesByIssueKeyTransitions", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "issueKey", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + }, + "post": { + "description": "Apply a workflow transition to a Jira issue (transitionId from the GET variant). Blocked when the connection is read-only.", + "operationId": "postIntegrationsByIdJiraIssuesByIssueKeyTransitions", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "issueKey", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "transitionId": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "transitionId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/jira/projects": { + "get": { + "description": "List the Jira projects visible to this integration's credentials. Query: ?q= filters by name/key; ?limit= caps the count. Returns id, key (use in JQL and issue creation), name, type.", + "operationId": "getIntegrationsByIdJiraProjects", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/jira/search": { + "get": { + "description": "Search Jira issues with JQL (?jql= required, ?limit= caps the count, default 25). Returns compact issues (key, summary, status, type, priority, assignee, url) plus nextPageToken when more pages exist.", + "operationId": "getIntegrationsByIdJiraSearch", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/services": { + "get": { + "description": "List the OData services registered on the SAP system this integration points at (Gateway CATALOGSERVICE), using the integration's stored credentials. Lets the agent discover what a connected system exposes before any per-service endpoint exists. Query: ?q= filters by id/description; ?status=active|inactive live-probes reachability; ?limit= caps the count.", + "operationId": "getIntegrationsByIdServices", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/onprem/checkin-all": { + "post": { + "description": "Repository-level check-in: commit ALL checked-out objects in a Tosca On-Prem workspace in one call (the workspace-level CheckInAll task - GET {ws}/task/CheckInAll). Individual writes already self-commit; use this to flush changes deliberately left checked out, or a workspace showing pending check-outs. Body: { workspace, comment? }.", + "operationId": "postIntegrationsByIdToscaOnpremCheckin-all", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "comment": { + "type": "string" + }, + "workspace": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "workspace" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/onprem/execution-entries": { + "post": { + "description": "Add a test case to a Tosca On-Prem execution list (the CreateExecutionEntry 'drop' task), checked out -> created -> checked in. Create the execution list itself via POST .../tosca/onprem/objects with objType 'ExecutionList'. NOTE: classic Tosca does not RUN tests via REST (a Tosca agent/DEX does); read verdicts back via GET .../objects/:id. Body: { workspace, executionListId, testCaseId, comment? }.", + "operationId": "postIntegrationsByIdToscaOnpremExecution-entries", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "comment": { + "type": "string" + }, + "executionListId": { + "minLength": 1, + "type": "string" + }, + "testCaseId": { + "minLength": 1, + "type": "string" + }, + "workspace": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "workspace", + "executionListId", + "testCaseId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/onprem/objects": { + "post": { + "description": "Create a child object (TestSheet, Instance, Attribute, ExecutionList, TestCase, Folder, ...) under a parent on a Tosca On-Prem system, optionally setting attributes. The parent is checked out, the object created (+ attributes set), then checked in. Body: { workspace, parentId, objType, attributes?, comment? }.", + "operationId": "postIntegrationsByIdToscaOnpremObjects", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "attributes": { + "items": { + "properties": { + "Name": { + "type": "string" + }, + "Value": { + "type": "string" + } + }, + "required": [ + "Name", + "Value" + ], + "type": "object" + }, + "type": "array" + }, + "comment": { + "type": "string" + }, + "objType": { + "minLength": 1, + "type": "string" + }, + "parentId": { + "minLength": 1, + "type": "string" + }, + "workspace": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "workspace", + "parentId", + "objType" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/onprem/objects/{objectId}": { + "get": { + "description": "Read a Tosca On-Prem object's attribute map. Use to inspect EXECUTION RESULTS (Result / ActualLog / ExecutionResult) after a run. Query: ?workspace= (required).", + "operationId": "getIntegrationsByIdToscaOnpremObjectsByObjectId", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "objectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/onprem/query": { + "post": { + "description": "Run a TQL search against a Tosca On-Prem system and return the matching object ids. Scoped to ?from= object id when given, else the project root. Body: { workspace, tql, from? }.", + "operationId": "postIntegrationsByIdToscaOnpremQuery", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "from": { + "type": "string" + }, + "tql": { + "minLength": 1, + "type": "string" + }, + "workspace": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "workspace", + "tql" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/onprem/workspaces": { + "get": { + "description": "List the workspaces on a connected Tosca On-Prem system. A workspace name is needed by the other on-prem write routes.", + "operationId": "getIntegrationsByIdToscaOnpremWorkspaces", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/playlist-runs/{playlistRunId}/testcase-runs": { + "get": { + "description": "List test case runs for a Tosca Cloud playlist run. ?space= overrides the default space; ?limit= caps the count. Returns id, displayName, testCaseId, state.", + "operationId": "getIntegrationsByIdToscaPlaylist-runsByPlaylistRunIdTestcase-runs", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "playlistRunId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/playlists": { + "get": { + "description": "List Tosca Cloud playlists (execution containers). Query: ?q= filters by description (Contains); ?space= overrides the default space; ?limit= caps the count. Returns id, name, description, state.", + "operationId": "getIntegrationsByIdToscaPlaylists", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/playlists/{playlistId}/runs": { + "get": { + "description": "List runs of a Tosca Cloud playlist. ?space= overrides the default space; ?limit= caps the count. Returns id, name, state, createdAt.", + "operationId": "getIntegrationsByIdToscaPlaylistsByPlaylistIdRuns", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "playlistId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/testcase-runs/{testCaseRunId}/steps": { + "get": { + "description": "Read the executed step tree for a Tosca Cloud test case run (pass/fail per step, values, messages). ?space= overrides the default space. Returns an empty steps array when no step log exists (404 from Tosca is normal for older runs).", + "operationId": "getIntegrationsByIdToscaTestcase-runsByTestCaseRunIdSteps", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "testCaseRunId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/testcases": { + "get": { + "description": "List Tosca Cloud test cases for this integration's system. Query: ?q= filters by description (Contains); ?space= overrides the default space; ?limit= caps the count. Returns id (use to read the design), name, description, status.", + "operationId": "getIntegrationsByIdToscaTestcases", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + }, + "post": { + "description": "Create a new Tosca Cloud test case in this integration's space from a design payload (the model-based-test builder shape returned by GET .../tosca/testcases/:id). The typical flow is read a design, modify it to cover the data gaps found, then POST it here. Structural ids are cleared server-side so Tosca mints new ones; module references are preserved. Body: { name, design, space? }.", + "operationId": "postIntegrationsByIdToscaTestcases", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "design": { + "additionalProperties": {}, + "type": "object" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "space": { + "type": "string" + } + }, + "required": [ + "name", + "design" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/testcases/{testCaseId}": { + "get": { + "description": "Read a single Tosca Cloud test case's design (model-based-test builder payload: configuration parameters, test step folders, module/attribute references, value ranges). The richest input for data-gap analysis. ?space= overrides the default space.", + "operationId": "getIntegrationsByIdToscaTestcasesByTestCaseId", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "testCaseId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/integrations/{id}/tosca/workspaces": { + "get": { + "description": "List the workspaces/spaces available on a connected Tosca system (on-prem returns the server's workspaces; Cloud enumerates the tenant's spaces). Returns { id, name }[]. Used to disambiguate which workspace to list test cases from.", + "operationId": "getIntegrationsByIdToscaWorkspaces", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Integrations" + ] + } + }, + "/internal/workspace/{scenarioId}/files": { + "get": { + "description": "List workspace files for worker sync", + "operationId": "getInternalWorkspaceByScenarioIdFiles", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Internal Workspace" + ] + } + }, + "/internal/workspace/{scenarioId}/info": { + "get": { + "description": "Get workspace info for worker", + "operationId": "getInternalWorkspaceByScenarioIdInfo", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Internal Workspace" + ] + } + }, + "/internal/workspace/{scenarioId}/sync": { + "post": { + "description": "Sync workspace metadata after worker run", + "operationId": "postInternalWorkspaceByScenarioIdSync", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "files": { + "items": { + "properties": { + "action": { + "enum": [ + "created", + "updated", + "deleted" + ], + "type": "string" + }, + "filename": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "size": { + "type": "number" + } + }, + "required": [ + "filename", + "size", + "action" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "files" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Internal Workspace" + ] + } + }, + "/internal/workspace/{scenarioId}/upload": { + "post": { + "description": "Upload output file from worker", + "operationId": "postInternalWorkspaceByScenarioIdUpload", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Internal Workspace" + ] + } + }, + "/keymaps": { + "get": { + "description": "List key maps for a project: one row per (mapName, object) with entry counts and last update", + "operationId": "getKeymaps", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/KeyMapSummary" + }, + "type": "array" + } + } + }, + "description": "One row per (mapName, object), ordered by both" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "KeyMaps" + ] + } + }, + "/keymaps/entries": { + "post": { + "description": "Batch-upsert key map entries: records old-to-new key mappings on the (projectId, mapName, object, oldKey) unique key. Last write wins for newKey.", + "operationId": "postKeymapsEntries", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "entries": { + "description": "Old-to-new key pairs to upsert", + "items": { + "properties": { + "newKey": { + "description": "The key minted in the target system", + "minLength": 1, + "type": "string" + }, + "oldKey": { + "description": "The key in the source system", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "oldKey", + "newKey" + ], + "type": "object" + }, + "maxItems": 5000, + "minItems": 1, + "type": "array" + }, + "mapName": { + "description": "Logical map name grouping entries, e.g. 'sap-material-migration'", + "minLength": 1, + "type": "string" + }, + "object": { + "description": "The domain object type, e.g. 'Material' or 'BusinessPartner'", + "minLength": 1, + "type": "string" + }, + "projectId": { + "description": "The project this map belongs to (falls back to the key/session scope)", + "type": "string" + }, + "runId": { + "description": "Optional run/source metadata: the scenario run or job that minted the keys", + "type": "string" + } + }, + "required": [ + "mapName", + "object", + "entries" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KeyMapUpsertResult" + } + } + }, + "description": "How many rows were inserted or updated" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The entries could not be upserted" + } + }, + "tags": [ + "KeyMaps" + ] + } + }, + "/keymaps/lookup": { + "post": { + "description": "Batch lookup: translate source-system keys to target-system keys. Returns found mappings and the keys that have no mapping yet. POST because oldKeys can be large.", + "operationId": "postKeymapsLookup", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "mapName": { + "description": "The map to look up in", + "minLength": 1, + "type": "string" + }, + "object": { + "description": "The domain object type", + "minLength": 1, + "type": "string" + }, + "oldKeys": { + "description": "Source-system keys to translate", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 5000, + "minItems": 1, + "type": "array" + }, + "projectId": { + "description": "The project the map belongs to (falls back to the key/session scope)", + "type": "string" + } + }, + "required": [ + "mapName", + "object", + "oldKeys" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KeyMapLookupResult" + } + } + }, + "description": "Resolved mappings, plus the keys with no mapping yet" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "KeyMaps" + ] + } + }, + "/keymaps/{mapName}": { + "delete": { + "description": "Drop a key map (all its entries), optionally scoped to one object type via the `object` query param", + "operationId": "deleteKeymapsByMapName", + "parameters": [ + { + "in": "path", + "name": "mapName", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KeyMapDeleteResult" + } + } + }, + "description": "The map was dropped, with the number of entries removed" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The key map could not be deleted" + } + }, + "tags": [ + "KeyMaps" + ] + } + }, + "/keymaps/{mapName}/entries": { + "get": { + "description": "Paginated entries of a key map for inspection. Optional `object` filter; `page` is 1-based.", + "operationId": "getKeymapsByMapNameEntries", + "parameters": [ + { + "in": "path", + "name": "mapName", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KeyMapEntriesPage" + } + } + }, + "description": "One page of entries, with the total for the filter" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "KeyMaps" + ] + } + }, + "/licenses": { + "get": { + "description": "Get all licenses activated for a team (keys are masked)", + "operationId": "getLicenses", + "parameters": [], + "responses": {}, + "tags": [ + "Licenses" + ] + } + }, + "/licenses/activate": { + "post": { + "description": "Activate a license key issued by auth.automators.com on this deployment", + "operationId": "postLicensesActivate", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "key": { + "minLength": 1, + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "teamId", + "key" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Licenses" + ] + } + }, + "/licenses/status": { + "get": { + "description": "Effective license status for this deployment and (optionally) a team, including seat usage", + "operationId": "getLicensesStatus", + "parameters": [], + "responses": {}, + "tags": [ + "Licenses" + ] + } + }, + "/logs": { + "get": { + "description": "Get all scenario execution logs", + "operationId": "getLogs", + "parameters": [], + "responses": {}, + "tags": [ + "Scenario Logs" + ] + }, + "post": { + "description": "Create a new scenario execution log entry", + "operationId": "postLogs", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "description": "Error message if failed", + "type": "string" + }, + "jobId": { + "description": "The BullMQ job ID", + "type": "string" + }, + "logs": { + "default": [], + "description": "Log entries", + "items": { + "type": "string" + }, + "type": "array" + }, + "output": { + "description": "Final execution output", + "type": "string" + }, + "scenarioId": { + "description": "The scenario ID being executed", + "type": "string" + }, + "status": { + "description": "Current status of the scenario run", + "enum": [ + "queued", + "running", + "completed", + "failed" + ], + "type": "string" + } + }, + "required": [ + "scenarioId", + "jobId", + "status" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenario Logs" + ] + } + }, + "/logs/cleanup": { + "delete": { + "description": "Delete scenario logs older than specified days (default 90)", + "operationId": "deleteLogsCleanup", + "parameters": [], + "responses": {}, + "tags": [ + "Scenario Logs" + ] + } + }, + "/logs/job/{jobId}": { + "get": { + "description": "Get scenario logs by BullMQ job ID", + "operationId": "getLogsJobByJobId", + "parameters": [ + { + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenario Logs" + ] + }, + "patch": { + "description": "Update a scenario log's terminal state (status/output/error)", + "operationId": "patchLogsJobByJobId", + "parameters": [ + { + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "completedAt": { + "description": "ISO timestamp the run finished", + "type": [ + "string", + "null" + ] + }, + "error": { + "description": "Error message, if failed", + "type": [ + "string", + "null" + ] + }, + "output": { + "description": "Final run output", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "Terminal status (completed/failed)", + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenario Logs" + ] + } + }, + "/logs/job/{jobId}/append": { + "patch": { + "description": "Append new log entries to an existing scenario log (useful for streaming)", + "operationId": "patchLogsJobByJobIdAppend", + "parameters": [ + { + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "logs": { + "description": "New log entries to append", + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "description": "Updated status", + "type": "string" + } + }, + "required": [ + "logs" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenario Logs" + ] + } + }, + "/logs/scenario/{scenarioId}": { + "get": { + "description": "Get all execution logs for a specific scenario", + "operationId": "getLogsScenarioByScenarioId", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenario Logs" + ] + } + }, + "/logs/{id}": { + "delete": { + "description": "Delete a scenario log entry", + "operationId": "deleteLogsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenario Logs" + ] + }, + "get": { + "description": "Get a specific scenario log by ID", + "operationId": "getLogsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenario Logs" + ] + } + }, + "/masking-policies": { + "get": { + "description": "Get all masking policies for the caller's team/project scope", + "operationId": "getMasking-policies", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/MaskingPolicy" + }, + "type": "array" + } + } + }, + "description": "Policies in scope" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Masking policies" + ] + }, + "post": { + "description": "Create a masking policy scoped to the caller's team/project", + "operationId": "postMasking-policies", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "consistent": { + "description": "Default: same source value masks to the same output", + "type": "boolean" + }, + "description": { + "description": "Short description of the policy (e.g. GDPR profile)", + "type": "string" + }, + "fields": { + "description": "Per-field strategy rows: field matcher + strategy + overrides", + "items": { + "properties": { + "consistent": { + "type": "boolean" + }, + "detectedAs": { + "type": "string" + }, + "field": { + "minLength": 1, + "type": "string" + }, + "note": { + "type": "string" + }, + "reversible": { + "type": "boolean" + }, + "strategy": { + "enum": [ + "faker-replace", + "hash", + "tokenize", + "redact", + "preserve-format" + ], + "type": "string" + } + }, + "required": [ + "field", + "strategy" + ], + "type": "object" + }, + "type": "array" + }, + "keyMapName": { + "description": "Key map name (#2787) scoping consistency to one run's key space", + "type": "string" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "projectId": { + "description": "The project ID this policy belongs to", + "type": "string" + }, + "reversible": { + "description": "Default: masked values can be translated back (tokenization)", + "type": "boolean" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MaskingPolicy" + } + } + }, + "description": "The created policy" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The policy could not be created" + } + }, + "tags": [ + "Masking policies" + ] + } + }, + "/masking-policies/{id}": { + "delete": { + "description": "Delete a masking policy", + "operationId": "deleteMasking-policiesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeletedResult" + } + } + }, + "description": "The policy was deleted" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No policy with that id in the caller's scope" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The policy could not be deleted" + } + }, + "tags": [ + "Masking policies" + ] + }, + "get": { + "description": "Get a masking policy by id", + "operationId": "getMasking-policiesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MaskingPolicy" + } + } + }, + "description": "The policy" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No policy with that id in the caller's scope" + } + }, + "tags": [ + "Masking policies" + ] + }, + "patch": { + "description": "Update a masking policy", + "operationId": "patchMasking-policiesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "consistent": { + "type": "boolean" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "fields": { + "items": { + "properties": { + "consistent": { + "type": "boolean" + }, + "detectedAs": { + "type": "string" + }, + "field": { + "minLength": 1, + "type": "string" + }, + "note": { + "type": "string" + }, + "reversible": { + "type": "boolean" + }, + "strategy": { + "enum": [ + "faker-replace", + "hash", + "tokenize", + "redact", + "preserve-format" + ], + "type": "string" + } + }, + "required": [ + "field", + "strategy" + ], + "type": "object" + }, + "type": "array" + }, + "keyMapName": { + "type": [ + "string", + "null" + ] + }, + "name": { + "minLength": 1, + "type": "string" + }, + "reversible": { + "type": "boolean" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MaskingPolicy" + } + } + }, + "description": "The updated policy" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No policy with that id in the caller's scope" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The policy could not be updated" + } + }, + "tags": [ + "Masking policies" + ] + } + }, + "/packs/catalog": { + "get": { + "description": "Proxy the Hub catalog index (static file on the downloads host). Returns { enabled: false } when HUB_CATALOG_URL is not configured (air-gapped deployments).", + "operationId": "getPacksCatalog", + "parameters": [], + "responses": {}, + "tags": [ + "Packs" + ] + } + }, + "/packs/catalog/install": { + "post": { + "description": "Fetch a pack from the catalog and install it. Catalog installs REQUIRE a valid ed25519 signature from a pinned publisher key.", + "operationId": "postPacksCatalogInstall", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "confirm": { + "default": false, + "type": "boolean" + }, + "dryRun": { + "default": false, + "type": "boolean" + }, + "name": { + "pattern": "^[a-z0-9][a-z0-9-]*\\/[a-z0-9][a-z0-9-]*$", + "type": "string" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "name" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Packs" + ] + } + }, + "/packs/export": { + "post": { + "description": "Build a .dmpack.json from selected assets. Strips ids, team/project bindings and endpoint references so the pack is portable; returns the pack with its checksum (unsigned - signing happens at publish time).", + "operationId": "postPacksExport", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "datatypeIds": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "manifest": { + "properties": { + "description": { + "minLength": 1, + "type": "string" + }, + "license": { + "type": "string" + }, + "name": { + "pattern": "^[a-z0-9][a-z0-9-]*\\/[a-z0-9][a-z0-9-]*$", + "type": "string" + }, + "publisher": { + "minLength": 1, + "type": "string" + }, + "requires": { + "default": [], + "items": { + "properties": { + "kind": { + "const": "integration", + "type": "string" + }, + "note": { + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-[0-9A-Za-z.-]+)?$", + "type": "string" + } + }, + "required": [ + "name", + "version", + "description", + "publisher" + ], + "type": "object" + }, + "planIds": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "projectId": { + "type": "string" + }, + "scenarioIds": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "skillIds": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "templateIds": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectId", + "manifest" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Packs" + ] + } + }, + "/packs/import": { + "post": { + "description": "Import a .dmpack.json. dryRun=true returns the create/skip diff (with signature + requirement checks) without writing. Unsigned packs are allowed here (file installs) - the UI warns; catalog installs go through /packs/catalog/install which enforces signatures.", + "operationId": "postPacksImport", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "confirm": { + "default": false, + "type": "boolean" + }, + "dryRun": { + "default": false, + "type": "boolean" + }, + "pack": {}, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Packs" + ] + } + }, + "/packs/installed": { + "get": { + "description": "List Hub packs installed for the current scope.", + "operationId": "getPacksInstalled", + "parameters": [], + "responses": {}, + "tags": [ + "Packs" + ] + } + }, + "/permissions": { + "get": { + "description": "Get the catalogue of assignable permission strings", + "operationId": "getPermissions", + "parameters": [], + "responses": {}, + "tags": [ + "Roles" + ] + } + }, + "/plans": { + "get": { + "description": "List plans in the active project", + "operationId": "getPlans", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Plan" + }, + "type": "array" + } + } + }, + "description": "Plans in the active project" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Plans" + ] + } + }, + "/plans/capability-catalog": { + "get": { + "description": "Derive a plan's capability-catalog baseline from the project's templates", + "operationId": "getPlansCapability-catalog", + "parameters": [], + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/save": { + "post": { + "description": "Create a new plan", + "operationId": "postPlansSave", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdFrom": { + "type": "string" + }, + "env": { + "type": "string" + }, + "history": { + "default": [], + "items": { + "properties": { + "by": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + }, + "when": { + "type": "string" + } + }, + "required": [ + "status", + "when" + ], + "type": "object" + }, + "type": "array" + }, + "origin": { + "enum": [ + "chat", + "blueprint", + "intake", + "gap analysis" + ], + "type": "string" + }, + "owner": { + "type": "string" + }, + "spec": { + "properties": { + "approval": { + "properties": { + "reason": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "role", + "reason" + ], + "type": "object" + }, + "capabilities": { + "items": { + "properties": { + "expectedCount": { + "minimum": 0, + "type": "integer" + }, + "expectedSumCents": { + "type": "integer" + }, + "group": { + "type": "string" + }, + "hidden": { + "default": false, + "type": "boolean" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "setId": { + "type": "string" + }, + "source": { + "default": "derived", + "enum": [ + "derived", + "manual" + ], + "type": "string" + }, + "sumField": { + "type": "string" + }, + "template": { + "type": "string" + }, + "templateId": { + "type": "string" + } + }, + "required": [ + "key", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "constraints": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "coverage": { + "items": { + "properties": { + "count": { + "minimum": 0, + "type": "integer" + }, + "family": { + "type": "string" + }, + "items": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "family", + "count", + "items" + ], + "type": "object" + }, + "type": "array" + }, + "coverageConfig": { + "properties": { + "freshnessDays": { + "default": 14, + "minimum": 1, + "type": "integer" + }, + "mode": { + "default": "release", + "enum": [ + "release", + "migration" + ], + "type": "string" + }, + "sourceSystem": { + "type": "string" + }, + "sumToleranceCents": { + "default": 0, + "minimum": 0, + "type": "integer" + }, + "targetSystem": { + "type": "string" + } + }, + "type": "object" + }, + "entities": { + "default": [], + "items": { + "properties": { + "endpointId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "template": { + "type": "string" + }, + "templateId": { + "type": "string" + }, + "volume": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "name", + "template", + "volume", + "key" + ], + "type": "object" + }, + "type": "array" + }, + "expectations": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "flow": { + "items": { + "properties": { + "loop": { + "type": [ + "string", + "null" + ] + }, + "phase": { + "type": "string" + }, + "steps": { + "items": { + "properties": { + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "from": { + "type": "string" + }, + "iface": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "msg": { + "type": "string" + }, + "reachable": { + "type": "boolean" + }, + "scaffold": { + "properties": { + "entity": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ops": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "entity", + "ops", + "fields" + ], + "type": "object" + }, + "status": { + "enum": [ + "mapped", + "likely", + "custom", + "unknown" + ], + "type": "string" + }, + "to": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "from", + "to", + "msg", + "iface", + "kind", + "status" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "phase", + "steps" + ], + "type": "object" + }, + "type": "array" + }, + "gaps": { + "default": [], + "items": { + "properties": { + "action": { + "type": "string" + }, + "iface": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "scaffold": { + "properties": { + "entity": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ops": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "entity", + "ops", + "fields" + ], + "type": "object" + }, + "title": { + "type": "string" + }, + "type": { + "enum": [ + "connect", + "custom", + "input", + "blocker", + "gap", + "stale" + ], + "type": "string" + } + }, + "required": [ + "type", + "title" + ], + "type": "object" + }, + "type": "array" + }, + "integrations": { + "default": [], + "items": { + "properties": { + "access": { + "enum": [ + "read", + "write" + ], + "type": "string" + }, + "detail": { + "default": "", + "type": "string" + }, + "system": { + "type": "string" + }, + "via": { + "type": "string" + } + }, + "required": [ + "system", + "via", + "access" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "enum": [ + "entity", + "flow", + "task", + "mapping" + ], + "type": "string" + }, + "lanes": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "lifecycle": { + "properties": { + "mode": { + "type": "string" + }, + "refresh": { + "type": "string" + }, + "replenish": { + "type": "string" + } + }, + "required": [ + "mode", + "refresh", + "replenish" + ], + "type": "object" + }, + "mappingConfig": { + "properties": { + "keyMapName": { + "type": "string" + }, + "maskingPolicyId": { + "type": "string" + }, + "maskingPolicyName": { + "type": "string" + }, + "sourceObject": { + "type": "string" + }, + "sourceSystem": { + "type": "string" + }, + "targetObject": { + "type": "string" + }, + "targetSystem": { + "type": "string" + } + }, + "type": "object" + }, + "mappings": { + "items": { + "properties": { + "generate": { + "default": false, + "type": "boolean" + }, + "keyMapName": { + "type": "string" + }, + "maskingPolicyId": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "sourceField": { + "type": "string" + }, + "status": { + "default": "open", + "enum": [ + "mapped", + "open", + "needs-review" + ], + "type": "string" + }, + "targetField": { + "type": "string" + }, + "transform": { + "default": "", + "type": "string" + } + }, + "required": [ + "targetField" + ], + "type": "object" + }, + "type": "array" + }, + "steps": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "tasks": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "tasks": { + "items": { + "properties": { + "deps": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "detail": { + "default": "", + "type": "string" + }, + "key": { + "type": "string" + }, + "priority": { + "enum": [ + "P0", + "P1", + "P2", + "P3" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "phase", + "tasks" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "properties": { + "by": { + "type": "string" + }, + "n": { + "minimum": 1, + "type": "integer" + }, + "when": { + "type": "string" + } + }, + "required": [ + "n", + "by", + "when" + ], + "type": "object" + } + }, + "type": "object" + }, + "status": { + "default": "draft", + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + }, + "summary": { + "type": "string" + }, + "targets": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "write": { + "default": false, + "type": "boolean" + } + }, + "required": [ + "title" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Plan" + } + } + }, + "description": "The created plan" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The creating team member could not be resolved" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Plans" + ] + } + }, + "/plans/{id}": { + "get": { + "description": "Get a plan by id", + "operationId": "getPlansById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Plan" + } + } + }, + "description": "The plan" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No plan with that id in the caller's scope" + } + }, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}": { + "delete": { + "description": "Delete a plan", + "operationId": "deletePlansByPlanId", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlanDeleteResult" + } + } + }, + "description": "The plan was deleted" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No plan with that id in the caller's scope" + } + }, + "tags": [ + "Plans" + ] + }, + "patch": { + "description": "Update a plan", + "operationId": "patchPlansByPlanId", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdFrom": { + "type": "string" + }, + "env": { + "type": "string" + }, + "history": { + "default": [], + "items": { + "properties": { + "by": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + }, + "when": { + "type": "string" + } + }, + "required": [ + "status", + "when" + ], + "type": "object" + }, + "type": "array" + }, + "origin": { + "enum": [ + "chat", + "blueprint", + "intake", + "gap analysis" + ], + "type": "string" + }, + "owner": { + "type": "string" + }, + "spec": { + "properties": { + "approval": { + "properties": { + "reason": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "role", + "reason" + ], + "type": "object" + }, + "capabilities": { + "items": { + "properties": { + "expectedCount": { + "minimum": 0, + "type": "integer" + }, + "expectedSumCents": { + "type": "integer" + }, + "group": { + "type": "string" + }, + "hidden": { + "default": false, + "type": "boolean" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "setId": { + "type": "string" + }, + "source": { + "default": "derived", + "enum": [ + "derived", + "manual" + ], + "type": "string" + }, + "sumField": { + "type": "string" + }, + "template": { + "type": "string" + }, + "templateId": { + "type": "string" + } + }, + "required": [ + "key", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "constraints": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "coverage": { + "items": { + "properties": { + "count": { + "minimum": 0, + "type": "integer" + }, + "family": { + "type": "string" + }, + "items": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "family", + "count", + "items" + ], + "type": "object" + }, + "type": "array" + }, + "coverageConfig": { + "properties": { + "freshnessDays": { + "default": 14, + "minimum": 1, + "type": "integer" + }, + "mode": { + "default": "release", + "enum": [ + "release", + "migration" + ], + "type": "string" + }, + "sourceSystem": { + "type": "string" + }, + "sumToleranceCents": { + "default": 0, + "minimum": 0, + "type": "integer" + }, + "targetSystem": { + "type": "string" + } + }, + "type": "object" + }, + "entities": { + "default": [], + "items": { + "properties": { + "endpointId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "template": { + "type": "string" + }, + "templateId": { + "type": "string" + }, + "volume": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "name", + "template", + "volume", + "key" + ], + "type": "object" + }, + "type": "array" + }, + "expectations": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "flow": { + "items": { + "properties": { + "loop": { + "type": [ + "string", + "null" + ] + }, + "phase": { + "type": "string" + }, + "steps": { + "items": { + "properties": { + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "from": { + "type": "string" + }, + "iface": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "msg": { + "type": "string" + }, + "reachable": { + "type": "boolean" + }, + "scaffold": { + "properties": { + "entity": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ops": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "entity", + "ops", + "fields" + ], + "type": "object" + }, + "status": { + "enum": [ + "mapped", + "likely", + "custom", + "unknown" + ], + "type": "string" + }, + "to": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "required": [ + "from", + "to", + "msg", + "iface", + "kind", + "status" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "phase", + "steps" + ], + "type": "object" + }, + "type": "array" + }, + "gaps": { + "default": [], + "items": { + "properties": { + "action": { + "type": "string" + }, + "iface": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "scaffold": { + "properties": { + "entity": { + "type": "string" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ops": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "entity", + "ops", + "fields" + ], + "type": "object" + }, + "title": { + "type": "string" + }, + "type": { + "enum": [ + "connect", + "custom", + "input", + "blocker", + "gap", + "stale" + ], + "type": "string" + } + }, + "required": [ + "type", + "title" + ], + "type": "object" + }, + "type": "array" + }, + "integrations": { + "default": [], + "items": { + "properties": { + "access": { + "enum": [ + "read", + "write" + ], + "type": "string" + }, + "detail": { + "default": "", + "type": "string" + }, + "system": { + "type": "string" + }, + "via": { + "type": "string" + } + }, + "required": [ + "system", + "via", + "access" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "enum": [ + "entity", + "flow", + "task", + "mapping" + ], + "type": "string" + }, + "lanes": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "lifecycle": { + "properties": { + "mode": { + "type": "string" + }, + "refresh": { + "type": "string" + }, + "replenish": { + "type": "string" + } + }, + "required": [ + "mode", + "refresh", + "replenish" + ], + "type": "object" + }, + "mappingConfig": { + "properties": { + "keyMapName": { + "type": "string" + }, + "maskingPolicyId": { + "type": "string" + }, + "maskingPolicyName": { + "type": "string" + }, + "sourceObject": { + "type": "string" + }, + "sourceSystem": { + "type": "string" + }, + "targetObject": { + "type": "string" + }, + "targetSystem": { + "type": "string" + } + }, + "type": "object" + }, + "mappings": { + "items": { + "properties": { + "generate": { + "default": false, + "type": "boolean" + }, + "keyMapName": { + "type": "string" + }, + "maskingPolicyId": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "sourceField": { + "type": "string" + }, + "status": { + "default": "open", + "enum": [ + "mapped", + "open", + "needs-review" + ], + "type": "string" + }, + "targetField": { + "type": "string" + }, + "transform": { + "default": "", + "type": "string" + } + }, + "required": [ + "targetField" + ], + "type": "object" + }, + "type": "array" + }, + "steps": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "tasks": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "phase": { + "type": "string" + }, + "tasks": { + "items": { + "properties": { + "deps": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "detail": { + "default": "", + "type": "string" + }, + "key": { + "type": "string" + }, + "priority": { + "enum": [ + "P0", + "P1", + "P2", + "P3" + ], + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "phase", + "tasks" + ], + "type": "object" + }, + "type": "array" + }, + "version": { + "properties": { + "by": { + "type": "string" + }, + "n": { + "minimum": 1, + "type": "integer" + }, + "when": { + "type": "string" + } + }, + "required": [ + "n", + "by", + "when" + ], + "type": "object" + } + }, + "type": "object" + }, + "status": { + "default": "draft", + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + }, + "summary": { + "type": "string" + }, + "targets": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "write": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Plan" + } + } + }, + "description": "The updated plan" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No plan with that id in the caller's scope" + } + }, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/check": { + "post": { + "description": "Run a plan's coverage checks and store the graded result as a check run", + "operationId": "postPlansByPlanIdCheck", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/run": { + "post": { + "description": "Execute an entity plan and produce artifacts", + "operationId": "postPlansByPlanIdRun", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/runs": { + "get": { + "description": "List a plan's runs", + "operationId": "getPlansByPlanIdRuns", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/runs/{runId}": { + "get": { + "description": "Get a plan run with logs + artifacts", + "operationId": "getPlansByPlanIdRunsByRunId", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "runId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/runs/{runId}/complete": { + "post": { + "description": "Finalize a plan run's terminal state (agent bookkeeping)", + "operationId": "postPlansByPlanIdRunsByRunIdComplete", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "runId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "type": "string" + }, + "rows": { + "default": 0, + "minimum": 0, + "type": "integer" + }, + "status": { + "enum": [ + "completed", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/runs/{runId}/files": { + "post": { + "description": "Record a generated artifact for a plan run (agent bookkeeping)", + "operationId": "postPlansByPlanIdRunsByRunIdFiles", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "runId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "content": { + "type": "string" + }, + "entity": { + "minLength": 1, + "type": "string" + }, + "filename": { + "minLength": 1, + "type": "string" + }, + "mimeType": { + "default": "application/json", + "type": "string" + } + }, + "required": [ + "entity", + "filename", + "content" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/runs/{runId}/log": { + "post": { + "description": "Append a log line to a plan run (agent bookkeeping)", + "operationId": "postPlansByPlanIdRunsByRunIdLog", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "runId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "level": { + "default": "info", + "enum": [ + "info", + "warn", + "error" + ], + "type": "string" + }, + "message": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/signoffs": { + "get": { + "description": "List a plan's sign-off artifacts", + "operationId": "getPlansByPlanIdSignoffs", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Plans" + ] + }, + "post": { + "description": "Record an immutable sign-off on a coverage check run (waiver note required on a non-green verdict)", + "operationId": "postPlansByPlanIdSignoffs", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "note": { + "maxLength": 4000, + "type": "string" + }, + "runId": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "runId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/plans/{planId}/status": { + "post": { + "description": "Transition a plan's status and optionally append a run-history entry", + "operationId": "postPlansByPlanIdStatus", + "parameters": [ + { + "in": "path", + "name": "planId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "history": { + "properties": { + "by": { + "type": "string" + }, + "note": { + "default": "", + "type": "string" + }, + "status": { + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + }, + "when": { + "type": "string" + } + }, + "required": [ + "status", + "when" + ], + "type": "object" + }, + "status": { + "enum": [ + "draft", + "approved", + "running", + "completed", + "failed" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Plans" + ] + } + }, + "/preview": { + "post": { + "description": "Preview external endpoint (proxy for mixed content)", + "operationId": "postPreview", + "parameters": [], + "responses": {}, + "tags": [ + "Preview" + ] + } + }, + "/projects": { + "get": { + "description": "Get all projects", + "operationId": "getProjects", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Project" + }, + "type": "array" + } + } + }, + "description": "Projects the caller can access" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Projects" + ] + }, + "post": { + "description": "Create a new project", + "operationId": "postProjects", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "avatar": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "The created project" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Projects" + ] + } + }, + "/projects/{id}": { + "delete": { + "description": "Delete a project", + "operationId": "deleteProjectsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeletedResult" + } + } + }, + "description": "The project was deleted" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No project with that id in the caller's scope" + } + }, + "tags": [ + "Projects" + ] + }, + "get": { + "description": "Get a project by id", + "operationId": "getProjectsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "The project" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No project with that id in the caller's scope" + } + }, + "tags": [ + "Projects" + ] + }, + "put": { + "description": "Update a project", + "operationId": "putProjectsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "avatar": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "The updated project" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No project with that id in the caller's scope" + } + }, + "tags": [ + "Projects" + ] + } + }, + "/roles": { + "get": { + "description": "Get all roles for a team", + "operationId": "getRoles", + "parameters": [], + "responses": {}, + "tags": [ + "Roles" + ] + }, + "post": { + "description": "Create a custom role", + "operationId": "postRoles", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "description": { + "maxLength": 280, + "type": "string" + }, + "name": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "permissions": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "teamId", + "name" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Roles" + ] + } + }, + "/roles/{id}": { + "delete": { + "description": "Delete a custom role", + "operationId": "deleteRolesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Roles" + ] + }, + "put": { + "description": "Update a custom role", + "operationId": "putRolesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "description": { + "maxLength": 280, + "type": [ + "string", + "null" + ] + }, + "name": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "permissions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Roles" + ] + } + }, + "/scenario-files": { + "post": { + "description": "Create scenario file from base64 content", + "operationId": "postScenario-files", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "content": { + "type": "string" + }, + "description": { + "type": "string" + }, + "folderId": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "scenarioId": { + "type": "string" + }, + "size": { + "type": "number" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "content", + "scenarioId", + "teamId", + "size" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Internal Workspace" + ] + } + }, + "/scenarios": { + "get": { + "description": "Get all scenarios", + "operationId": "getScenarios", + "parameters": [], + "responses": {}, + "tags": [ + "Scenarios" + ] + }, + "post": { + "description": "Create a new scenario generated by AI", + "operationId": "postScenarios", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdAt": { + "type": "string" + }, + "createdBy": { + "description": "A valid team member id", + "type": "string" + }, + "description": { + "description": "Short description of what this scenario does", + "type": "string" + }, + "name": { + "type": "string" + }, + "presignedUrl": { + "type": "string" + }, + "projectId": { + "description": "The project ID this scenario belongs to", + "type": "string" + }, + "requirementsUrl": { + "type": "string" + }, + "teamId": { + "description": "The team ID this scenario belongs to", + "type": "string" + }, + "timeoutSeconds": { + "description": "Execution timeout in seconds (60–3600)", + "maximum": 3600, + "minimum": 60, + "type": "integer" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/execute": { + "post": { + "description": "Execute a scenario by queueing it for execution. By default waits for completion (async=false), set async=true for immediate return with jobId.", + "operationId": "postScenariosExecute", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "async": { + "default": false, + "type": "boolean" + }, + "code": { + "description": "Optional inline code to execute instead of saved script", + "type": "string" + }, + "projectId": { + "description": "The project ID this scenario belongs to", + "type": "string" + }, + "scenarioId": { + "description": "The scenario ID to execute", + "type": "string" + }, + "source": { + "default": "manual", + "description": "What initiated the run. UI clients omit this (defaults to 'manual'). The chat agent must send 'agent' so the run can be visually distinguished in scenario history.", + "enum": [ + "manual", + "agent", + "mcp" + ], + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/from-chat": { + "post": { + "description": "Generate a repeatable scenario from a chat thread. Reads the chat's agent-session turns (or a client-supplied thread snapshot), converts them into a single Python script via the LLM, and saves it like /scenarios/save.", + "operationId": "postScenariosFrom-chat", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "chatId": { + "description": "The chat whose thread should become a scenario", + "type": "string" + }, + "projectId": { + "description": "The project the chat and scenario belong to", + "type": "string" + }, + "thread": { + "description": "Optional client-side thread snapshot (richer than the persisted row: includes tool-call summaries)", + "properties": { + "turns": { + "items": { + "properties": { + "prompt": { + "type": "string" + }, + "reply": { + "type": "string" + }, + "toolSummaries": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "prompt", + "reply" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "turns" + ], + "type": "object" + }, + "timeoutSeconds": { + "description": "Execution timeout in seconds (60–3600)", + "maximum": 3600, + "minimum": 60, + "type": "integer" + } + }, + "required": [ + "chatId", + "projectId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/jobs/{jobId}/cancel": { + "post": { + "description": "Cancel a running scenario execution job", + "operationId": "postScenariosJobsByJobIdCancel", + "parameters": [ + { + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/jobs/{jobId}/logs/stream": { + "get": { + "description": "Stream logs for a running job via Server-Sent Events", + "operationId": "getScenariosJobsByJobIdLogsStream", + "parameters": [ + { + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/jobs/{jobId}/status": { + "get": { + "description": "Get the status of a queued job", + "operationId": "getScenariosJobsByJobIdStatus", + "parameters": [ + { + "in": "path", + "name": "jobId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/save": { + "post": { + "description": "Save a scenario coded by user", + "operationId": "postScenariosSave", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "code": { + "type": "string" + }, + "name": { + "type": "string" + }, + "timeoutSeconds": { + "description": "Execution timeout in seconds (60–3600)", + "maximum": 3600, + "minimum": 60, + "type": "integer" + } + }, + "required": [ + "code" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/{id}": { + "delete": { + "description": "Delete a scenario", + "operationId": "deleteScenariosById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + }, + "get": { + "description": "Get a scenario by id", + "operationId": "getScenariosById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + }, + "patch": { + "description": "Update a scenario", + "operationId": "patchScenariosById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdAt": { + "type": "string" + }, + "createdBy": { + "description": "A valid team member id", + "type": "string" + }, + "description": { + "description": "Short description of what this scenario does", + "type": "string" + }, + "name": { + "type": "string" + }, + "presignedUrl": { + "type": "string" + }, + "projectId": { + "description": "The project ID this scenario belongs to", + "type": "string" + }, + "requirementsUrl": { + "type": "string" + }, + "teamId": { + "description": "The team ID this scenario belongs to", + "type": "string" + }, + "timeoutSeconds": { + "description": "Execution timeout in seconds (60–3600)", + "maximum": 3600, + "minimum": 60, + "type": "integer" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/{id}/diagram/regenerate": { + "post": { + "description": "Regenerate the Mermaid flow diagram for a scenario. Accepts an optional { code } body (the current editor contents); otherwise the stored script is read from blob storage.", + "operationId": "postScenariosByIdDiagramRegenerate", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/{id}/environment-variables": { + "get": { + "description": "Get environment variables for a scenario", + "operationId": "getScenariosByIdEnvironment-variables", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + }, + "patch": { + "description": "Update environment variables for a scenario", + "operationId": "patchScenariosByIdEnvironment-variables", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "environmentVariables": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "environmentVariables" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenarios" + ] + }, + "post": { + "description": "Add an environment variable to a scenario", + "operationId": "postScenariosByIdEnvironment-variables", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "key": { + "minLength": 1, + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/{id}/environment-variables/{key}": { + "delete": { + "description": "Delete an environment variable from a scenario", + "operationId": "deleteScenariosByIdEnvironment-variablesByKey", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "key", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Scenarios" + ] + } + }, + "/scenarios/{scenarioId}/files": { + "get": { + "description": "List all workspace files for a scenario", + "operationId": "getScenariosByScenarioIdFiles", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Workspace Files" + ] + } + }, + "/scenarios/{scenarioId}/files/upload": { + "post": { + "description": "Upload a file to the scenario workspace", + "operationId": "postScenariosByScenarioIdFilesUpload", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Workspace Files" + ] + } + }, + "/scenarios/{scenarioId}/files/{fileId}": { + "delete": { + "description": "Delete a workspace file", + "operationId": "deleteScenariosByScenarioIdFilesByFileId", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "fileId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Workspace Files" + ] + }, + "get": { + "description": "Get file metadata and download URL", + "operationId": "getScenariosByScenarioIdFilesByFileId", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "fileId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Workspace Files" + ] + } + }, + "/scenarios/{scenarioId}/storage": { + "get": { + "description": "Get storage usage for a scenario workspace", + "operationId": "getScenariosByScenarioIdStorage", + "parameters": [ + { + "in": "path", + "name": "scenarioId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Workspace Files" + ] + } + }, + "/schema-graph/{id}/diff": { + "post": { + "description": "Compare the endpoint's cached SAP/OData schema graph against live $metadata without updating the cache. Body (optional): { metadataUrl } to override the derived service-root URL.", + "operationId": "postSchema-graphByIdDiff", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/entity/{name}": { + "get": { + "description": "The 1-hop neighborhood of an entity: properties (with labels, types, writability), keys, and incoming/outgoing navigations. Accepts the EntityType or EntitySet name.", + "operationId": "getSchema-graphByIdEntityByName", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/entity/{name}/connect": { + "post": { + "description": "Wire a template's lookup/code fields to LIVE SAP data (port of datamaker-sap-cli's `sap connect`). Creates a DataMaker endpoint for the entity set (reusing this endpoint's credentials) and upgrades the template's Custom/Words fields to 'API Response' generators that fetch from it at generation time. Body: { templateId } (required). Returns the new endpoint id + upgraded field names.", + "operationId": "postSchema-graphByIdEntityByNameConnect", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/entity/{name}/preview": { + "post": { + "description": "Preview real rows from the entity set (endpoint credentials), with OData metadata stripped - the raw data, not mined statistics. Use to eyeball what the system actually contains before building a template. Body (optional): { top } rows (default 10, max 50). Port of datamaker-sap-cli's `sap preview`.", + "operationId": "postSchema-graphByIdEntityByNamePreview", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/entity/{name}/sample": { + "post": { + "description": "Sample live rows from the entity set (endpoint credentials) and mine per-field value statistics: distinct values, frequencies, and which fields look like SAP code-lists (enum-like). Also lists the system's ValueHelp/code-list entity sets. Body (optional): { top } rows to sample (default 50, max 500).", + "operationId": "postSchema-graphByIdEntityByNameSample", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/entity/{name}/template": { + "post": { + "description": "Create a DataMaker template from a schema-graph entity: every property becomes a field with a generator inferred from its EDM type + SAP naming heuristics (port of datamaker-sap-cli's transform). Body (optional): { name } for the template name. Returns the created template id.", + "operationId": "postSchema-graphByIdEntityByNameTemplate", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/path": { + "get": { + "description": "Shortest navigation path between two entities (how they relate), e.g. how SalesOrder connects to Product. Query: ?from=&to=", + "operationId": "getSchema-graphByIdPath", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/refresh": { + "post": { + "description": "Fetch the endpoint's OData $metadata (with its stored credentials), parse it into a schema knowledge graph and cache it. Body (optional): { metadataUrl } to override the derived service-root URL.", + "operationId": "postSchema-graphByIdRefresh", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/search": { + "get": { + "description": "Search the endpoint's cached schema graph for entities by name, business label (sap:label) or entity-set name. Query: ?q=", + "operationId": "getSchema-graphByIdSearch", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/schema-graph/{id}/services": { + "get": { + "description": "List the OData services registered on the SAP system this endpoint belongs to (Gateway CATALOGSERVICE), using the endpoint's stored credentials. Query: ?q= filters by id/description; ?status=active|inactive live-probes each service for reachability (port of the CLI's `sap catalog --active`); ?limit= caps the number of services returned.", + "operationId": "getSchema-graphByIdServices", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "SchemaGraph" + ] + } + }, + "/sets": { + "get": { + "description": "Get all saved sets for the caller's team/project scope", + "operationId": "getSets", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Set" + }, + "type": "array" + } + } + }, + "description": "Sets in scope, newest first" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Sets" + ] + }, + "post": { + "description": "Create (save) a new set scoped to the caller's team/project", + "operationId": "postSets", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The saved rows payload (JSON)" + }, + "description": { + "description": "Short description of the set", + "type": "string" + }, + "locked": { + "description": "Freeze the set on creation (snapshot semantics)", + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "projectId": { + "description": "The project ID this set belongs to", + "type": "string" + }, + "rowCount": { + "description": "Row count; derived from `data` when omitted", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Set" + } + } + }, + "description": "The created set" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The payload exceeds the inline size cap (10,000 rows / 5 MB)" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The set could not be created" + } + }, + "tags": [ + "Sets" + ] + } + }, + "/sets/{id}": { + "delete": { + "description": "Delete a saved set", + "operationId": "deleteSetsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeletedResult" + } + } + }, + "description": "The set was deleted" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The set is locked; unlock it before deleting" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The set could not be deleted" + } + }, + "tags": [ + "Sets" + ] + }, + "get": { + "description": "Get a saved set by id", + "operationId": "getSetsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetDetail" + } + } + }, + "description": "The set, enriched with the creator's display name" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No set with that id in the caller's scope" + } + }, + "tags": [ + "Sets" + ] + }, + "patch": { + "description": "Update a saved set", + "operationId": "patchSetsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": {}, + "description": { + "type": [ + "string", + "null" + ] + }, + "locked": { + "description": "Lock (freeze) or unlock the set. Locking is always allowed; other edits are rejected while locked.", + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "rowCount": { + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Set" + } + } + }, + "description": "The updated set" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The payload exceeds the inline size cap (10,000 rows / 5 MB)" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The set is locked; unlock it before editing" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The set could not be updated" + } + }, + "tags": [ + "Sets" + ] + } + }, + "/setup/teams": { + "post": { + "description": "Create a new team while also creating teamMember and project", + "operationId": "postSetupTeams", + "parameters": [], + "responses": {}, + "tags": [ + "Teams" + ] + } + }, + "/shortcuts": { + "get": { + "description": "Get all shortcuts", + "operationId": "getShortcuts", + "parameters": [], + "responses": {}, + "tags": [ + "Shortcuts" + ] + }, + "post": { + "description": "Create a new shortcut", + "operationId": "postShortcuts", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "context": { + "enum": [ + "GLOBAL", + "TEMPLATE_PAGE", + "EDIT_TEMPLATE" + ], + "type": "string" + }, + "function": { + "type": "string" + }, + "id": { + "type": "string" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "userId": { + "type": "string" + } + }, + "required": [ + "id", + "function", + "context", + "keys", + "userId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Shortcuts" + ] + } + }, + "/shortcuts/{id}": { + "delete": { + "description": "Delete a shortcut", + "operationId": "deleteShortcutsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Shortcuts" + ] + }, + "put": { + "description": "Update a shortcut", + "operationId": "putShortcutsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "context": { + "enum": [ + "GLOBAL", + "TEMPLATE_PAGE", + "EDIT_TEMPLATE" + ], + "type": "string" + }, + "function": { + "type": "string" + }, + "id": { + "type": "string" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "userId": { + "type": "string" + } + }, + "required": [ + "id", + "function", + "context", + "keys", + "userId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Shortcuts" + ] + } + }, + "/skills": { + "get": { + "description": "List the team's skills (reusable agent instructions) plus the read-only built-in skills. Skills are team-wide. Query: ?teamId= (required).", + "operationId": "getSkills", + "parameters": [], + "responses": {}, + "tags": [ + "Skills" + ] + }, + "post": { + "description": "Create a team skill.", + "operationId": "postSkills", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "body": { + "minLength": 1, + "type": "string" + }, + "description": { + "minLength": 1, + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "projectId": { + "type": [ + "string", + "null" + ] + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "description", + "body", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Skills" + ] + } + }, + "/skills/import": { + "post": { + "description": "Create a team skill from an uploaded SKILL.md file (frontmatter name/title + description, markdown body).", + "operationId": "postSkillsImport", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "projectId": { + "type": [ + "string", + "null" + ] + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "content", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Skills" + ] + } + }, + "/skills/{id}": { + "delete": { + "description": "Delete a team skill.", + "operationId": "deleteSkillsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Skills" + ] + }, + "get": { + "description": "Get a single team skill by ID.", + "operationId": "getSkillsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Skills" + ] + }, + "put": { + "description": "Update a team skill.", + "operationId": "putSkillsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "body": { + "minLength": 1, + "type": "string" + }, + "description": { + "minLength": 1, + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Skills" + ] + } + }, + "/skills/{id}/export": { + "get": { + "description": "Download a team skill as a shareable SKILL.md file (frontmatter + markdown body).", + "operationId": "getSkillsByIdExport", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Skills" + ] + } + }, + "/teamMembers": { + "get": { + "description": "Get all team members", + "operationId": "getTeamMembers", + "parameters": [], + "responses": {}, + "tags": [ + "Team Members" + ] + }, + "post": { + "description": "Create a new team member", + "operationId": "postTeamMembers", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "role": { + "enum": [ + "MEMBER", + "ADMIN", + "OWNER" + ], + "type": "string" + }, + "teamId": { + "type": "string" + }, + "userId": { + "type": "string" + } + }, + "required": [ + "userId", + "teamId", + "role" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Team Members" + ] + } + }, + "/teamMembers/invite": { + "post": { + "description": "Invite a new team member by email", + "operationId": "postTeamMembersInvite", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "email": { + "format": "email", + "type": "string" + }, + "role": { + "default": "MEMBER", + "enum": [ + "MEMBER", + "ADMIN", + "OWNER" + ], + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "email", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Team Members" + ] + } + }, + "/teamMembers/{id}": { + "delete": { + "description": "Delete a team member", + "operationId": "deleteTeamMembersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Team Members" + ] + }, + "put": { + "description": "Update a team member", + "operationId": "putTeamMembersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "role": { + "enum": [ + "MEMBER", + "ADMIN", + "OWNER" + ], + "type": "string" + } + }, + "required": [ + "role" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Team Members" + ] + } + }, + "/teamMembers/{id}/roles": { + "post": { + "description": "Assign a custom role to a team member", + "operationId": "postTeamMembersByIdRoles", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "roleId": { + "type": "string" + } + }, + "required": [ + "roleId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Team Members" + ] + } + }, + "/teamMembers/{id}/roles/{roleId}": { + "delete": { + "description": "Unassign a custom role from a team member", + "operationId": "deleteTeamMembersByIdRolesByRoleId", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "roleId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Team Members" + ] + } + }, + "/teams": { + "get": { + "description": "Get all teams", + "operationId": "getTeams", + "parameters": [], + "responses": {}, + "tags": [ + "Teams" + ] + }, + "post": { + "description": "Create a new team", + "operationId": "postTeams", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "avatar": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Teams" + ] + } + }, + "/teams/{id}": { + "delete": { + "description": "Delete a team", + "operationId": "deleteTeamsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Teams" + ] + }, + "put": { + "description": "Update a team", + "operationId": "putTeamsById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "avatar": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Teams" + ] + } + }, + "/templateFolders": { + "get": { + "description": "Get all template folders", + "operationId": "getTemplateFolders", + "parameters": [], + "responses": {}, + "tags": [ + "Template Folders" + ] + }, + "post": { + "description": "Create a new template folder", + "operationId": "postTemplateFolders", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdBy": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isDatabase": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name", + "createdBy", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Template Folders" + ] + } + }, + "/templateFolders/{id}": { + "delete": { + "description": "Delete a template folder", + "operationId": "deleteTemplateFoldersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Template Folders" + ] + }, + "put": { + "description": "Update a template folder", + "operationId": "putTemplateFoldersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdBy": { + "type": "string" + }, + "id": { + "type": "string" + }, + "isDatabase": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Template Folders" + ] + } + }, + "/templates": { + "get": { + "description": "Get all datamaker templates", + "operationId": "getTemplates", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Template" + }, + "type": "array" + } + } + }, + "description": "Templates in the caller's team/project scope" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Templates" + ] + }, + "post": { + "description": "Create a new datamaker template", + "operationId": "postTemplates", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdAt": { + "type": "string" + }, + "createdBy": { + "description": "A valid team member id", + "type": "string" + }, + "dbOrderIdx": { + "description": "Not sure if this is needed", + "type": "number" + }, + "fields": { + "default": [], + "items": { + "properties": { + "active": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "nested": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "options": {}, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "type", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "seed": { + "default": null, + "type": [ + "number", + "null" + ] + }, + "simulationConfig": { + "properties": { + "isSimulationVisible": { + "type": "boolean" + }, + "period": { + "type": "number" + } + }, + "required": [ + "period", + "isSimulationVisible" + ], + "type": "object" + }, + "teamId": { + "type": "string" + }, + "templateFolderId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "The created template" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + } + }, + "tags": [ + "Templates" + ] + } + }, + "/templates/{id}": { + "delete": { + "description": "Delete a template", + "operationId": "deleteTemplatesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeletedResult" + } + } + }, + "description": "The template was deleted" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No template with that id in the caller's scope" + } + }, + "tags": [ + "Templates" + ] + }, + "get": { + "description": "Get a datamaker template by id", + "operationId": "getTemplatesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "The template" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No template with that id in the caller's scope" + } + }, + "tags": [ + "Templates" + ] + }, + "put": { + "description": "Update a template", + "operationId": "putTemplatesById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "createdAt": { + "type": "string" + }, + "createdBy": { + "description": "A valid team member id", + "type": "string" + }, + "dbOrderIdx": { + "description": "Not sure if this is needed", + "type": "number" + }, + "fields": { + "default": [], + "items": { + "properties": { + "active": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "nested": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "options": {}, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "type", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "seed": { + "default": null, + "type": [ + "number", + "null" + ] + }, + "simulationConfig": { + "properties": { + "isSimulationVisible": { + "type": "boolean" + }, + "period": { + "type": "number" + } + }, + "required": [ + "period", + "isSimulationVisible" + ], + "type": "object" + }, + "teamId": { + "type": "string" + }, + "templateFolderId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "projectId", + "teamId" + ], + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "The updated template" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The template has no team" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Not authenticated" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "The caller lacks the required permission" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "No template with that id in the caller's scope" + } + }, + "tags": [ + "Templates" + ] + } + }, + "/upload": { + "post": { + "description": "Upload an image, PDF, or JSON file to R2 storage", + "operationId": "postUpload", + "parameters": [], + "responses": {}, + "tags": [ + "Upload" + ] + } + }, + "/upload-csv": { + "post": { + "description": "Upload a CSV file to R2 storage and return a presigned URL", + "operationId": "postUpload-csv", + "parameters": [], + "responses": {}, + "tags": [ + "Upload" + ] + } + }, + "/upload-csv-batch": { + "post": { + "description": "Upload multiple CSV files (e.g. a folder) to R2 with content-hash deduplication. Re-uploading identical content is a no-op.", + "operationId": "postUpload-csv-batch", + "parameters": [], + "responses": {}, + "tags": [ + "Upload" + ] + } + }, + "/upload-text": { + "post": { + "description": "Upload text content to R2 storage. When chatId is provided, also registers the upload as a chat asset in the same request so the S3 blob and the ChatAsset row stay in sync.", + "operationId": "postUpload-text", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "chatId": { + "type": "string" + }, + "filename": { + "minLength": 1, + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "source": { + "enum": [ + "agent", + "upload" + ], + "type": "string" + }, + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "filename" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Upload" + ] + } + }, + "/users": { + "get": { + "description": "Get all users", + "operationId": "getUsers", + "parameters": [], + "responses": {}, + "tags": [ + "Users" + ] + }, + "post": { + "description": "Create a new user", + "operationId": "postUsers", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "autoSave": { + "type": "boolean" + }, + "avatar": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "email": { + "format": "email", + "type": "string" + }, + "firstName": { + "type": "string" + }, + "id": { + "type": "string" + }, + "lastName": { + "type": "string" + } + }, + "required": [ + "id", + "email", + "firstName", + "lastName" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Users" + ] + } + }, + "/users/logout": { + "post": { + "description": "Logout user and clear authentication cookie", + "operationId": "postUsersLogout", + "parameters": [], + "responses": {}, + "tags": [ + "Users" + ] + } + }, + "/users/me": { + "get": { + "description": "Get the current user", + "operationId": "getUsersMe", + "parameters": [], + "responses": {}, + "tags": [ + "Users" + ] + } + }, + "/users/me/permissions": { + "get": { + "description": "Get the current user's effective permissions for a team", + "operationId": "getUsersMePermissions", + "parameters": [], + "responses": {}, + "tags": [ + "Users" + ] + } + }, + "/users/me/preferences": { + "get": { + "description": "Get the current user's UI preferences", + "operationId": "getUsersMePreferences", + "parameters": [], + "responses": {}, + "tags": [ + "Users" + ] + }, + "patch": { + "description": "Update the current user's UI preferences", + "operationId": "patchUsersMePreferences", + "parameters": [], + "responses": {}, + "tags": [ + "Users" + ] + } + }, + "/users/provision": { + "post": { + "description": "Handle user account provisioning", + "operationId": "postUsersProvision", + "parameters": [], + "responses": {}, + "tags": [ + "Users" + ] + } + }, + "/users/{id}": { + "delete": { + "description": "Delete a user", + "operationId": "deleteUsersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Users" + ] + }, + "patch": { + "description": "Partially update a user", + "operationId": "patchUsersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {}, + "tags": [ + "Users" + ] + }, + "put": { + "description": "Update a user", + "operationId": "putUsersById", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "autoSave": { + "type": "boolean" + }, + "avatar": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "email": { + "format": "email", + "type": "string" + }, + "firstName": { + "type": "string" + }, + "id": { + "type": "string" + }, + "lastName": { + "type": "string" + } + }, + "required": [ + "id", + "email", + "firstName", + "lastName" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "tags": [ + "Users" + ] + } + }, + "/validate/apiKey": { + "get": { + "description": "Test API key authentication", + "operationId": "getValidateApiKey", + "parameters": [], + "responses": {}, + "tags": [ + "Validate" + ] + } + }, + "/workspace-files/by-key": { + "get": { + "description": "Get a workspace file by its storage key with presigned URL", + "operationId": "getWorkspace-filesBy-key", + "parameters": [], + "responses": {}, + "tags": [ + "Workspace Files" + ] + } + } + } +} diff --git a/src/core.ts b/src/core.ts index 1c8531b..b725156 100644 --- a/src/core.ts +++ b/src/core.ts @@ -1,8 +1,179 @@ -export type Fetch = (url: RequestInfo, init?: RequestInit) => Promise; -export type HTTPMethod = "get" | "post" | "put" | "patch" | "delete"; +/** + * The transport every resource client sits on. + * + * Deliberately thin: build a URL, attach auth, send JSON, parse JSON, turn a + * non-2xx into a typed error. Everything above this file is types and + * ergonomics. There is no retry policy, no caching and no client-side + * validation, because the API is the authority on all three and a clever SDK + * that disagrees with its server is worse than a dull one that does not. + */ +import type { components } from "./generated/schema.js"; -export type RequestClient = { fetch: Fetch }; -export type Headers = Record; -export type DefaultQuery = Record; +/** The error body the API returns on a non-2xx. */ +export type ApiErrorBody = components["schemas"]["ApiError"]; -export type Agent = any; +/** Where the API lives when the caller does not say. Matches datamaker-py. */ +export const DEFAULT_BASE_URL = "https://api.datamaker.automators.com"; + +export interface ClientOptions { + /** + * A DataMaker API key. Falls back to `DATAMAKER_API_KEY`, the same variable + * datamaker-py reads, so a machine configured for one SDK works with the + * other. + */ + apiKey?: string; + /** Falls back to `DATAMAKER_API_URL`, then {@link DEFAULT_BASE_URL}. */ + baseURL?: string; + /** + * Team and project scope, sent as `X-Team-Id` / `X-Project-Id`, which is how + * the API scopes reads and writes. Most keys are already project-scoped, so + * these are only needed when a key spans more than one. + */ + teamId?: string; + projectId?: string; + /** Extra headers merged into every request. */ + headers?: Record; + /** + * Injected `fetch`, for tests and for runtimes that supply their own. The + * SDK uses the global otherwise, so it runs unmodified on Node 18+, Deno, + * Bun, browsers and edge runtimes - one of the reasons this is not a native + * module. + */ + fetch?: typeof globalThis.fetch; +} + +/** + * A non-2xx response. + * + * Carries the status and the parsed body rather than a flattened string, + * because callers branch on both: 401 means the key is wrong, 403 means the + * key is right and lacks a permission, 409 means the resource is locked. + */ +export class DataMakerError extends Error { + readonly status: number; + readonly body: ApiErrorBody | undefined; + readonly url: string; + + constructor(status: number, url: string, body: ApiErrorBody | undefined) { + // The server's own message first: it is written for this exact failure, + // and a generic wrapper sentence would bury it. + super(body?.error ?? `DataMaker API request failed with ${status}`); + this.name = "DataMakerError"; + this.status = status; + this.url = url; + this.body = body; + } +} + +/** Thrown at construction when no key is available from anywhere. */ +export class MissingApiKeyError extends Error { + constructor() { + super( + "No DataMaker API key. Pass `apiKey` to the client or set DATAMAKER_API_KEY.", + ); + this.name = "MissingApiKeyError"; + } +} + +export interface RequestOptions { + /** Query parameters. `undefined` values are dropped rather than sent as "undefined". */ + query?: Record; + body?: unknown; + signal?: AbortSignal; +} + +/** + * Read an env var without assuming `process` exists: the SDK is meant to run + * in browsers and edge runtimes too, where touching it directly throws. + */ +function fromEnv(name: string): string | undefined { + const env = (globalThis as { process?: { env?: Record } }) + .process?.env; + return env?.[name]; +} + +export class HttpClient { + private readonly baseURL: string; + private readonly headers: Record; + private readonly fetchImpl: typeof globalThis.fetch; + + constructor(options: ClientOptions = {}) { + const apiKey = options.apiKey ?? fromEnv("DATAMAKER_API_KEY"); + if (!apiKey) throw new MissingApiKeyError(); + + this.baseURL = ( + options.baseURL ?? + fromEnv("DATAMAKER_API_URL") ?? + DEFAULT_BASE_URL + ).replace(/\/+$/, ""); + + this.headers = { + "Content-Type": "application/json", + "X-API-Key": apiKey, + ...(options.teamId ? { "X-Team-Id": options.teamId } : {}), + ...(options.projectId ? { "X-Project-Id": options.projectId } : {}), + ...options.headers, + }; + + const impl = options.fetch ?? globalThis.fetch; + if (!impl) { + throw new Error( + "No fetch implementation. Use Node 18+, or pass `fetch` in the client options.", + ); + } + // Bound because an unbound global fetch throws "Illegal invocation" in + // browsers when it is called as a method of something else. + this.fetchImpl = impl.bind(globalThis); + } + + async request( + method: string, + path: string, + options: RequestOptions = {}, + ): Promise { + const url = new URL(`${this.baseURL}${path}`); + for (const [key, value] of Object.entries(options.query ?? {})) { + if (value !== undefined) url.searchParams.set(key, String(value)); + } + + const response = await this.fetchImpl(url.toString(), { + method, + headers: this.headers, + body: + options.body === undefined ? undefined : JSON.stringify(options.body), + signal: options.signal, + }); + + if (!response.ok) { + // A failing endpoint does not always answer JSON - a proxy timeout or a + // crash returns HTML or nothing. Parsing is best-effort so the status + // survives instead of being replaced by a parse error. + let body: ApiErrorBody | undefined; + try { + body = (await response.json()) as ApiErrorBody; + } catch { + body = undefined; + } + throw new DataMakerError(response.status, url.toString(), body); + } + + if (response.status === 204) return undefined as T; + return (await response.json()) as T; + } + + get(path: string, options?: RequestOptions) { + return this.request("GET", path, options); + } + post(path: string, body?: unknown, options?: RequestOptions) { + return this.request("POST", path, { ...options, body }); + } + put(path: string, body?: unknown, options?: RequestOptions) { + return this.request("PUT", path, { ...options, body }); + } + patch(path: string, body?: unknown, options?: RequestOptions) { + return this.request("PATCH", path, { ...options, body }); + } + delete(path: string, options?: RequestOptions) { + return this.request("DELETE", path, options); + } +} diff --git a/src/error.ts b/src/error.ts deleted file mode 100644 index eef675a..0000000 --- a/src/error.ts +++ /dev/null @@ -1 +0,0 @@ -export class DataMakerError extends Error {} diff --git a/src/generated/schema.ts b/src/generated/schema.ts new file mode 100644 index 0000000..8a5da65 --- /dev/null +++ b/src/generated/schema.ts @@ -0,0 +1,8461 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/address/availability": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Whether the address dataset is configured and available */ + get: operations["getAddressAvailability"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/address/cities": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List distinct cities for a country (code or name) */ + get: operations["getAddressCities"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/address/countries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List distinct countries available in the address dataset */ + get: operations["getAddressCountries"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/address/postcodes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List distinct postcodes for a country (code or name) */ + get: operations["getAddressPostcodes"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/address/regions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List distinct regions for a country (code or name) */ + get: operations["getAddressRegions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agent/approvals": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List pending approval requests for a chat */ + get: operations["getAgentApprovals"]; + put?: never; + /** @description Resolve or create an approval request for a large agent write */ + post: operations["postAgentApprovals"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agent/approvals/{id}/deny": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Reject a large agent write */ + post: operations["postAgentApprovalsByIdDeny"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agent/approvals/{id}/grant": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Approve a large agent write */ + post: operations["postAgentApprovalsByIdGrant"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/analyze-image": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Analyze image and return description */ + post: operations["postAnalyze-image"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/analyze-pdf": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Analyze PDF documents by extracting structured key information like dates, titles, invoice numbers, and other business document fields */ + post: operations["postAnalyze-pdf"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/apiKeys": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get API keys filtered by scope */ + get: operations["getApiKeys"]; + put?: never; + /** @description Create a new API key */ + post: operations["postApiKeys"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/apiKeys/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update an API key */ + put: operations["putApiKeysById"]; + post?: never; + /** @description Delete an API key */ + delete: operations["deleteApiKeysById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/audit/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List recent agent audit events for the current team */ + get: operations["getAuditEvents"]; + put?: never; + /** @description Record an agent tool-invocation audit event */ + post: operations["postAuditEvents"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/logout": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Revoke a refresh token and its rotation family. */ + post: operations["postAuthLogout"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/refresh": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Rotate a refresh token for a new access token (+ rotated refresh token). */ + post: operations["postAuthRefresh"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/session": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Exchange the current login for a desktop access + refresh token pair (stay-signed-in). */ + post: operations["postAuthSession"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/blob/{key}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Serve a blob's bytes from the local filesystem store (local-first mode). */ + get: operations["getBlobByKey"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chat-assets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List assets for a chat */ + get: operations["getChat-assets"]; + put?: never; + /** @description Create a new chat asset */ + post: operations["postChat-assets"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chat-assets/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Delete a chat asset */ + delete: operations["deleteChat-assetsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chats": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all chats for the current user */ + get: operations["getChats"]; + put?: never; + /** @description Create a new chat */ + post: operations["postChats"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/chats/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a chat by id */ + get: operations["getChatsById"]; + /** @description Update a chat */ + put: operations["putChatsById"]; + post?: never; + /** @description Delete a chat */ + delete: operations["deleteChatsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/config": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get shared datamaker config */ + get: operations["getConfig"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/connections": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all connections */ + get: operations["getConnections"]; + put?: never; + /** @description Create a new connection */ + post: operations["postConnections"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/connections/tables": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get tables and metadata for a specific connection */ + get: operations["getConnectionsTables"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/connections/test": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Test a connection */ + post: operations["postConnectionsTest"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/connections/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a single connection by id */ + get: operations["getConnectionsById"]; + /** @description Update a connection */ + put: operations["putConnectionsById"]; + post?: never; + /** @description Delete a connection */ + delete: operations["deleteConnectionsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/customDataTypes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all custom data types */ + get: operations["getCustomDataTypes"]; + put?: never; + /** @description Create a new custom data type */ + post: operations["postCustomDataTypes"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/customDataTypes/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update a custom data type */ + put: operations["putCustomDataTypesById"]; + post?: never; + /** @description Delete a custom data type */ + delete: operations["deleteCustomDataTypesById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/datamaker": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Generate data based on template fields */ + post: operations["postDatamaker"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/endpointFolders": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Route to get all endpoint folders */ + get: operations["getEndpointFolders"]; + put?: never; + /** @description Route to create a new endpoint folder */ + post: operations["postEndpointFolders"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/endpointFolders/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Route to update an endpoint folder */ + put: operations["putEndpointFoldersById"]; + post?: never; + /** @description Route to delete an endpoint folder */ + delete: operations["deleteEndpointFoldersById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/endpoints": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all endpoints */ + get: operations["getEndpoints"]; + put?: never; + /** @description Create a new endpoint */ + post: operations["postEndpoints"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/endpoints/auth-resolve": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Resolve an endpoint's usable credentials: the Authorization header (decrypt Basic / exchange OAuth2), the auth type, and - for Basic auth - the decrypted username/password. Used by the desktop execution sidecar and by scenarios that need to authenticate to an external system with the endpoint's real credentials. Decryption stays central; access is gated by the same endpoint access check as the rest of the API. */ + post: operations["postEndpointsAuth-resolve"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/endpoints/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get an endpoint by ID */ + get: operations["getEndpointsById"]; + /** @description Update an endpoint */ + put: operations["putEndpointsById"]; + post?: never; + /** @description Delete an endpoint */ + delete: operations["deleteEndpointsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/execute-python": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Execute a Python file from a URL using the datamaker runner. By default waits for completion, set async=true for immediate return. */ + post: operations["postExecute-python"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/export/db": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Export to Database */ + post: operations["postExportDb"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/export/rest": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Export to REST API */ + post: operations["postExportRest"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/feedback": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all feedback */ + get: operations["getFeedback"]; + put?: never; + /** @description Create new feedback */ + post: operations["postFeedback"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/feedback/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update feedback */ + put: operations["putFeedbackById"]; + post?: never; + /** @description Delete feedback */ + delete: operations["deleteFeedbackById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/fields": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all fields */ + get: operations["getFields"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/generate/database-templates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Analyze a relational database and propose DataMaker templates + prompts */ + post: operations["postGenerateDatabase-templates"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/generate/openapi/{format}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Generate an OpenAPI spec from a JSON or YAML file. */ + post: operations["postGenerateOpenapiByFormat"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/generate/sensitive": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Classify template fields as sensitive (PII) data */ + post: operations["postGenerateSensitive"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/generate/template": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Generate a template from JSON or CSV data. */ + post: operations["postGenerateTemplate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/getcsrftoken": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Get CSRF token from SAP system */ + post: operations["postGetcsrftoken"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all integrations */ + get: operations["getIntegrations"]; + put?: never; + /** @description Create a new integration */ + post: operations["postIntegrations"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/test": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Probe an integration's connection (no persistence). Returns whether the origin + credentials are reachable and accepted. */ + post: operations["postIntegrationsTest"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get an integration by ID */ + get: operations["getIntegrationsById"]; + /** @description Update an integration */ + put: operations["putIntegrationsById"]; + post?: never; + /** @description Delete an integration */ + delete: operations["deleteIntegrationsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/endpoints": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a DataMaker endpoint for one of this integration's OData services, linked to the integration so it INHERITS the system credentials (no auth is stored on the endpoint itself). The service root URL is resolved from the Gateway catalog by service id. Use this instead of creating a raw endpoint - a standalone endpoint has no credentials and SAP will reject it (401). */ + post: operations["postIntegrationsByIdEndpoints"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/jira/createmeta": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Create-metadata for a project (?project=KEY required): without ?issueTypeId= lists the project's issue types; with it, that type's fields incl. which are required and their allowed values. Call before creating an issue so the payload is valid. */ + get: operations["getIntegrationsByIdJiraCreatemeta"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/jira/issues": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a Jira issue (e.g. a defect from a failed scenario run). Body: projectKey, issueType (name, e.g. Bug), summary, optional description (plain text - converted to ADF), labels, priority. Returns the new key + browse URL. Blocked when the connection is read-only. */ + post: operations["postIntegrationsByIdJiraIssues"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/jira/issues/{issueKey}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Read one Jira issue by key (e.g. PROJ-123): summary, status, description flattened to plain text, labels, links, parent. The richest input for deriving test data from a story's acceptance criteria. */ + get: operations["getIntegrationsByIdJiraIssuesByIssueKey"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/jira/issues/{issueKey}/comment": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Add a plain-text comment to a Jira issue (converted to ADF). Blocked when the connection is read-only. */ + post: operations["postIntegrationsByIdJiraIssuesByIssueKeyComment"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/jira/issues/{issueKey}/transitions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List the workflow transitions currently available on a Jira issue (id + name + target status). Read-only; use the POST variant to apply one. */ + get: operations["getIntegrationsByIdJiraIssuesByIssueKeyTransitions"]; + put?: never; + /** @description Apply a workflow transition to a Jira issue (transitionId from the GET variant). Blocked when the connection is read-only. */ + post: operations["postIntegrationsByIdJiraIssuesByIssueKeyTransitions"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/jira/projects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List the Jira projects visible to this integration's credentials. Query: ?q= filters by name/key; ?limit= caps the count. Returns id, key (use in JQL and issue creation), name, type. */ + get: operations["getIntegrationsByIdJiraProjects"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/jira/search": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Search Jira issues with JQL (?jql= required, ?limit= caps the count, default 25). Returns compact issues (key, summary, status, type, priority, assignee, url) plus nextPageToken when more pages exist. */ + get: operations["getIntegrationsByIdJiraSearch"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/services": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List the OData services registered on the SAP system this integration points at (Gateway CATALOGSERVICE), using the integration's stored credentials. Lets the agent discover what a connected system exposes before any per-service endpoint exists. Query: ?q= filters by id/description; ?status=active|inactive live-probes reachability; ?limit= caps the count. */ + get: operations["getIntegrationsByIdServices"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/onprem/checkin-all": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Repository-level check-in: commit ALL checked-out objects in a Tosca On-Prem workspace in one call (the workspace-level CheckInAll task - GET {ws}/task/CheckInAll). Individual writes already self-commit; use this to flush changes deliberately left checked out, or a workspace showing pending check-outs. Body: { workspace, comment? }. */ + post: operations["postIntegrationsByIdToscaOnpremCheckin-all"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/onprem/execution-entries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Add a test case to a Tosca On-Prem execution list (the CreateExecutionEntry 'drop' task), checked out -> created -> checked in. Create the execution list itself via POST .../tosca/onprem/objects with objType 'ExecutionList'. NOTE: classic Tosca does not RUN tests via REST (a Tosca agent/DEX does); read verdicts back via GET .../objects/:id. Body: { workspace, executionListId, testCaseId, comment? }. */ + post: operations["postIntegrationsByIdToscaOnpremExecution-entries"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/onprem/objects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a child object (TestSheet, Instance, Attribute, ExecutionList, TestCase, Folder, ...) under a parent on a Tosca On-Prem system, optionally setting attributes. The parent is checked out, the object created (+ attributes set), then checked in. Body: { workspace, parentId, objType, attributes?, comment? }. */ + post: operations["postIntegrationsByIdToscaOnpremObjects"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/onprem/objects/{objectId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Read a Tosca On-Prem object's attribute map. Use to inspect EXECUTION RESULTS (Result / ActualLog / ExecutionResult) after a run. Query: ?workspace= (required). */ + get: operations["getIntegrationsByIdToscaOnpremObjectsByObjectId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/onprem/query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Run a TQL search against a Tosca On-Prem system and return the matching object ids. Scoped to ?from= object id when given, else the project root. Body: { workspace, tql, from? }. */ + post: operations["postIntegrationsByIdToscaOnpremQuery"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/onprem/workspaces": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List the workspaces on a connected Tosca On-Prem system. A workspace name is needed by the other on-prem write routes. */ + get: operations["getIntegrationsByIdToscaOnpremWorkspaces"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/playlist-runs/{playlistRunId}/testcase-runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List test case runs for a Tosca Cloud playlist run. ?space= overrides the default space; ?limit= caps the count. Returns id, displayName, testCaseId, state. */ + get: operations["getIntegrationsByIdToscaPlaylist-runsByPlaylistRunIdTestcase-runs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/playlists": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List Tosca Cloud playlists (execution containers). Query: ?q= filters by description (Contains); ?space= overrides the default space; ?limit= caps the count. Returns id, name, description, state. */ + get: operations["getIntegrationsByIdToscaPlaylists"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/playlists/{playlistId}/runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List runs of a Tosca Cloud playlist. ?space= overrides the default space; ?limit= caps the count. Returns id, name, state, createdAt. */ + get: operations["getIntegrationsByIdToscaPlaylistsByPlaylistIdRuns"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/testcase-runs/{testCaseRunId}/steps": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Read the executed step tree for a Tosca Cloud test case run (pass/fail per step, values, messages). ?space= overrides the default space. Returns an empty steps array when no step log exists (404 from Tosca is normal for older runs). */ + get: operations["getIntegrationsByIdToscaTestcase-runsByTestCaseRunIdSteps"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/testcases": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List Tosca Cloud test cases for this integration's system. Query: ?q= filters by description (Contains); ?space= overrides the default space; ?limit= caps the count. Returns id (use to read the design), name, description, status. */ + get: operations["getIntegrationsByIdToscaTestcases"]; + put?: never; + /** @description Create a new Tosca Cloud test case in this integration's space from a design payload (the model-based-test builder shape returned by GET .../tosca/testcases/:id). The typical flow is read a design, modify it to cover the data gaps found, then POST it here. Structural ids are cleared server-side so Tosca mints new ones; module references are preserved. Body: { name, design, space? }. */ + post: operations["postIntegrationsByIdToscaTestcases"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/testcases/{testCaseId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Read a single Tosca Cloud test case's design (model-based-test builder payload: configuration parameters, test step folders, module/attribute references, value ranges). The richest input for data-gap analysis. ?space= overrides the default space. */ + get: operations["getIntegrationsByIdToscaTestcasesByTestCaseId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/integrations/{id}/tosca/workspaces": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List the workspaces/spaces available on a connected Tosca system (on-prem returns the server's workspaces; Cloud enumerates the tenant's spaces). Returns { id, name }[]. Used to disambiguate which workspace to list test cases from. */ + get: operations["getIntegrationsByIdToscaWorkspaces"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/internal/workspace/{scenarioId}/files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List workspace files for worker sync */ + get: operations["getInternalWorkspaceByScenarioIdFiles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/internal/workspace/{scenarioId}/info": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get workspace info for worker */ + get: operations["getInternalWorkspaceByScenarioIdInfo"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/internal/workspace/{scenarioId}/sync": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Sync workspace metadata after worker run */ + post: operations["postInternalWorkspaceByScenarioIdSync"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/internal/workspace/{scenarioId}/upload": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Upload output file from worker */ + post: operations["postInternalWorkspaceByScenarioIdUpload"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keymaps": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List key maps for a project: one row per (mapName, object) with entry counts and last update */ + get: operations["getKeymaps"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keymaps/entries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Batch-upsert key map entries: records old-to-new key mappings on the (projectId, mapName, object, oldKey) unique key. Last write wins for newKey. */ + post: operations["postKeymapsEntries"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keymaps/lookup": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Batch lookup: translate source-system keys to target-system keys. Returns found mappings and the keys that have no mapping yet. POST because oldKeys can be large. */ + post: operations["postKeymapsLookup"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keymaps/{mapName}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Drop a key map (all its entries), optionally scoped to one object type via the `object` query param */ + delete: operations["deleteKeymapsByMapName"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/keymaps/{mapName}/entries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Paginated entries of a key map for inspection. Optional `object` filter; `page` is 1-based. */ + get: operations["getKeymapsByMapNameEntries"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/licenses": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all licenses activated for a team (keys are masked) */ + get: operations["getLicenses"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/licenses/activate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Activate a license key issued by auth.automators.com on this deployment */ + post: operations["postLicensesActivate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/licenses/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Effective license status for this deployment and (optionally) a team, including seat usage */ + get: operations["getLicensesStatus"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all scenario execution logs */ + get: operations["getLogs"]; + put?: never; + /** @description Create a new scenario execution log entry */ + post: operations["postLogs"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs/cleanup": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Delete scenario logs older than specified days (default 90) */ + delete: operations["deleteLogsCleanup"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs/job/{jobId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get scenario logs by BullMQ job ID */ + get: operations["getLogsJobByJobId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** @description Update a scenario log's terminal state (status/output/error) */ + patch: operations["patchLogsJobByJobId"]; + trace?: never; + }; + "/logs/job/{jobId}/append": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** @description Append new log entries to an existing scenario log (useful for streaming) */ + patch: operations["patchLogsJobByJobIdAppend"]; + trace?: never; + }; + "/logs/scenario/{scenarioId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all execution logs for a specific scenario */ + get: operations["getLogsScenarioByScenarioId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/logs/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a specific scenario log by ID */ + get: operations["getLogsById"]; + put?: never; + post?: never; + /** @description Delete a scenario log entry */ + delete: operations["deleteLogsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/masking-policies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all masking policies for the caller's team/project scope */ + get: operations["getMasking-policies"]; + put?: never; + /** @description Create a masking policy scoped to the caller's team/project */ + post: operations["postMasking-policies"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/masking-policies/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a masking policy by id */ + get: operations["getMasking-policiesById"]; + put?: never; + post?: never; + /** @description Delete a masking policy */ + delete: operations["deleteMasking-policiesById"]; + options?: never; + head?: never; + /** @description Update a masking policy */ + patch: operations["patchMasking-policiesById"]; + trace?: never; + }; + "/packs/catalog": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Proxy the Hub catalog index (static file on the downloads host). Returns { enabled: false } when HUB_CATALOG_URL is not configured (air-gapped deployments). */ + get: operations["getPacksCatalog"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/packs/catalog/install": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Fetch a pack from the catalog and install it. Catalog installs REQUIRE a valid ed25519 signature from a pinned publisher key. */ + post: operations["postPacksCatalogInstall"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/packs/export": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Build a .dmpack.json from selected assets. Strips ids, team/project bindings and endpoint references so the pack is portable; returns the pack with its checksum (unsigned - signing happens at publish time). */ + post: operations["postPacksExport"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/packs/import": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Import a .dmpack.json. dryRun=true returns the create/skip diff (with signature + requirement checks) without writing. Unsigned packs are allowed here (file installs) - the UI warns; catalog installs go through /packs/catalog/install which enforces signatures. */ + post: operations["postPacksImport"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/packs/installed": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List Hub packs installed for the current scope. */ + get: operations["getPacksInstalled"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/permissions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get the catalogue of assignable permission strings */ + get: operations["getPermissions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List plans in the active project */ + get: operations["getPlans"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/capability-catalog": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Derive a plan's capability-catalog baseline from the project's templates */ + get: operations["getPlansCapability-catalog"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/save": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a new plan */ + post: operations["postPlansSave"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a plan by id */ + get: operations["getPlansById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Delete a plan */ + delete: operations["deletePlansByPlanId"]; + options?: never; + head?: never; + /** @description Update a plan */ + patch: operations["patchPlansByPlanId"]; + trace?: never; + }; + "/plans/{planId}/check": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Run a plan's coverage checks and store the graded result as a check run */ + post: operations["postPlansByPlanIdCheck"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/run": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Execute an entity plan and produce artifacts */ + post: operations["postPlansByPlanIdRun"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List a plan's runs */ + get: operations["getPlansByPlanIdRuns"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/runs/{runId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a plan run with logs + artifacts */ + get: operations["getPlansByPlanIdRunsByRunId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/runs/{runId}/complete": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Finalize a plan run's terminal state (agent bookkeeping) */ + post: operations["postPlansByPlanIdRunsByRunIdComplete"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/runs/{runId}/files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Record a generated artifact for a plan run (agent bookkeeping) */ + post: operations["postPlansByPlanIdRunsByRunIdFiles"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/runs/{runId}/log": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Append a log line to a plan run (agent bookkeeping) */ + post: operations["postPlansByPlanIdRunsByRunIdLog"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/signoffs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List a plan's sign-off artifacts */ + get: operations["getPlansByPlanIdSignoffs"]; + put?: never; + /** @description Record an immutable sign-off on a coverage check run (waiver note required on a non-green verdict) */ + post: operations["postPlansByPlanIdSignoffs"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/plans/{planId}/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Transition a plan's status and optionally append a run-history entry */ + post: operations["postPlansByPlanIdStatus"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/preview": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Preview external endpoint (proxy for mixed content) */ + post: operations["postPreview"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/projects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all projects */ + get: operations["getProjects"]; + put?: never; + /** @description Create a new project */ + post: operations["postProjects"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/projects/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a project by id */ + get: operations["getProjectsById"]; + /** @description Update a project */ + put: operations["putProjectsById"]; + post?: never; + /** @description Delete a project */ + delete: operations["deleteProjectsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/roles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all roles for a team */ + get: operations["getRoles"]; + put?: never; + /** @description Create a custom role */ + post: operations["postRoles"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/roles/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update a custom role */ + put: operations["putRolesById"]; + post?: never; + /** @description Delete a custom role */ + delete: operations["deleteRolesById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenario-files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create scenario file from base64 content */ + post: operations["postScenario-files"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all scenarios */ + get: operations["getScenarios"]; + put?: never; + /** @description Create a new scenario generated by AI */ + post: operations["postScenarios"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/execute": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Execute a scenario by queueing it for execution. By default waits for completion (async=false), set async=true for immediate return with jobId. */ + post: operations["postScenariosExecute"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/from-chat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Generate a repeatable scenario from a chat thread. Reads the chat's agent-session turns (or a client-supplied thread snapshot), converts them into a single Python script via the LLM, and saves it like /scenarios/save. */ + post: operations["postScenariosFrom-chat"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/jobs/{jobId}/cancel": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Cancel a running scenario execution job */ + post: operations["postScenariosJobsByJobIdCancel"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/jobs/{jobId}/logs/stream": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Stream logs for a running job via Server-Sent Events */ + get: operations["getScenariosJobsByJobIdLogsStream"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/jobs/{jobId}/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get the status of a queued job */ + get: operations["getScenariosJobsByJobIdStatus"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/save": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Save a scenario coded by user */ + post: operations["postScenariosSave"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a scenario by id */ + get: operations["getScenariosById"]; + put?: never; + post?: never; + /** @description Delete a scenario */ + delete: operations["deleteScenariosById"]; + options?: never; + head?: never; + /** @description Update a scenario */ + patch: operations["patchScenariosById"]; + trace?: never; + }; + "/scenarios/{id}/diagram/regenerate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Regenerate the Mermaid flow diagram for a scenario. Accepts an optional { code } body (the current editor contents); otherwise the stored script is read from blob storage. */ + post: operations["postScenariosByIdDiagramRegenerate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/{id}/environment-variables": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get environment variables for a scenario */ + get: operations["getScenariosByIdEnvironment-variables"]; + put?: never; + /** @description Add an environment variable to a scenario */ + post: operations["postScenariosByIdEnvironment-variables"]; + delete?: never; + options?: never; + head?: never; + /** @description Update environment variables for a scenario */ + patch: operations["patchScenariosByIdEnvironment-variables"]; + trace?: never; + }; + "/scenarios/{id}/environment-variables/{key}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Delete an environment variable from a scenario */ + delete: operations["deleteScenariosByIdEnvironment-variablesByKey"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/{scenarioId}/files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List all workspace files for a scenario */ + get: operations["getScenariosByScenarioIdFiles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/{scenarioId}/files/upload": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Upload a file to the scenario workspace */ + post: operations["postScenariosByScenarioIdFilesUpload"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/{scenarioId}/files/{fileId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get file metadata and download URL */ + get: operations["getScenariosByScenarioIdFilesByFileId"]; + put?: never; + post?: never; + /** @description Delete a workspace file */ + delete: operations["deleteScenariosByScenarioIdFilesByFileId"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/scenarios/{scenarioId}/storage": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get storage usage for a scenario workspace */ + get: operations["getScenariosByScenarioIdStorage"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/diff": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Compare the endpoint's cached SAP/OData schema graph against live $metadata without updating the cache. Body (optional): { metadataUrl } to override the derived service-root URL. */ + post: operations["postSchema-graphByIdDiff"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/entity/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description The 1-hop neighborhood of an entity: properties (with labels, types, writability), keys, and incoming/outgoing navigations. Accepts the EntityType or EntitySet name. */ + get: operations["getSchema-graphByIdEntityByName"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/entity/{name}/connect": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Wire a template's lookup/code fields to LIVE SAP data (port of datamaker-sap-cli's `sap connect`). Creates a DataMaker endpoint for the entity set (reusing this endpoint's credentials) and upgrades the template's Custom/Words fields to 'API Response' generators that fetch from it at generation time. Body: { templateId } (required). Returns the new endpoint id + upgraded field names. */ + post: operations["postSchema-graphByIdEntityByNameConnect"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/entity/{name}/preview": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Preview real rows from the entity set (endpoint credentials), with OData metadata stripped - the raw data, not mined statistics. Use to eyeball what the system actually contains before building a template. Body (optional): { top } rows (default 10, max 50). Port of datamaker-sap-cli's `sap preview`. */ + post: operations["postSchema-graphByIdEntityByNamePreview"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/entity/{name}/sample": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Sample live rows from the entity set (endpoint credentials) and mine per-field value statistics: distinct values, frequencies, and which fields look like SAP code-lists (enum-like). Also lists the system's ValueHelp/code-list entity sets. Body (optional): { top } rows to sample (default 50, max 500). */ + post: operations["postSchema-graphByIdEntityByNameSample"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/entity/{name}/template": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a DataMaker template from a schema-graph entity: every property becomes a field with a generator inferred from its EDM type + SAP naming heuristics (port of datamaker-sap-cli's transform). Body (optional): { name } for the template name. Returns the created template id. */ + post: operations["postSchema-graphByIdEntityByNameTemplate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/path": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Shortest navigation path between two entities (how they relate), e.g. how SalesOrder connects to Product. Query: ?from=&to= */ + get: operations["getSchema-graphByIdPath"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/refresh": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Fetch the endpoint's OData $metadata (with its stored credentials), parse it into a schema knowledge graph and cache it. Body (optional): { metadataUrl } to override the derived service-root URL. */ + post: operations["postSchema-graphByIdRefresh"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/search": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Search the endpoint's cached schema graph for entities by name, business label (sap:label) or entity-set name. Query: ?q= */ + get: operations["getSchema-graphByIdSearch"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/schema-graph/{id}/services": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List the OData services registered on the SAP system this endpoint belongs to (Gateway CATALOGSERVICE), using the endpoint's stored credentials. Query: ?q= filters by id/description; ?status=active|inactive live-probes each service for reachability (port of the CLI's `sap catalog --active`); ?limit= caps the number of services returned. */ + get: operations["getSchema-graphByIdServices"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all saved sets for the caller's team/project scope */ + get: operations["getSets"]; + put?: never; + /** @description Create (save) a new set scoped to the caller's team/project */ + post: operations["postSets"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/sets/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a saved set by id */ + get: operations["getSetsById"]; + put?: never; + post?: never; + /** @description Delete a saved set */ + delete: operations["deleteSetsById"]; + options?: never; + head?: never; + /** @description Update a saved set */ + patch: operations["patchSetsById"]; + trace?: never; + }; + "/setup/teams": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a new team while also creating teamMember and project */ + post: operations["postSetupTeams"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/shortcuts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all shortcuts */ + get: operations["getShortcuts"]; + put?: never; + /** @description Create a new shortcut */ + post: operations["postShortcuts"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/shortcuts/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update a shortcut */ + put: operations["putShortcutsById"]; + post?: never; + /** @description Delete a shortcut */ + delete: operations["deleteShortcutsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/skills": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description List the team's skills (reusable agent instructions) plus the read-only built-in skills. Skills are team-wide. Query: ?teamId= (required). */ + get: operations["getSkills"]; + put?: never; + /** @description Create a team skill. */ + post: operations["postSkills"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/skills/import": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Create a team skill from an uploaded SKILL.md file (frontmatter name/title + description, markdown body). */ + post: operations["postSkillsImport"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/skills/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a single team skill by ID. */ + get: operations["getSkillsById"]; + /** @description Update a team skill. */ + put: operations["putSkillsById"]; + post?: never; + /** @description Delete a team skill. */ + delete: operations["deleteSkillsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/skills/{id}/export": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Download a team skill as a shareable SKILL.md file (frontmatter + markdown body). */ + get: operations["getSkillsByIdExport"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teamMembers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all team members */ + get: operations["getTeamMembers"]; + put?: never; + /** @description Create a new team member */ + post: operations["postTeamMembers"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teamMembers/invite": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Invite a new team member by email */ + post: operations["postTeamMembersInvite"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teamMembers/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update a team member */ + put: operations["putTeamMembersById"]; + post?: never; + /** @description Delete a team member */ + delete: operations["deleteTeamMembersById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teamMembers/{id}/roles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Assign a custom role to a team member */ + post: operations["postTeamMembersByIdRoles"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teamMembers/{id}/roles/{roleId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** @description Unassign a custom role from a team member */ + delete: operations["deleteTeamMembersByIdRolesByRoleId"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all teams */ + get: operations["getTeams"]; + put?: never; + /** @description Create a new team */ + post: operations["postTeams"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/teams/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update a team */ + put: operations["putTeamsById"]; + post?: never; + /** @description Delete a team */ + delete: operations["deleteTeamsById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templateFolders": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all template folders */ + get: operations["getTemplateFolders"]; + put?: never; + /** @description Create a new template folder */ + post: operations["postTemplateFolders"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templateFolders/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update a template folder */ + put: operations["putTemplateFoldersById"]; + post?: never; + /** @description Delete a template folder */ + delete: operations["deleteTemplateFoldersById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all datamaker templates */ + get: operations["getTemplates"]; + put?: never; + /** @description Create a new datamaker template */ + post: operations["postTemplates"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/templates/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a datamaker template by id */ + get: operations["getTemplatesById"]; + /** @description Update a template */ + put: operations["putTemplatesById"]; + post?: never; + /** @description Delete a template */ + delete: operations["deleteTemplatesById"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/upload": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Upload an image, PDF, or JSON file to R2 storage */ + post: operations["postUpload"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/upload-csv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Upload a CSV file to R2 storage and return a presigned URL */ + post: operations["postUpload-csv"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/upload-csv-batch": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Upload multiple CSV files (e.g. a folder) to R2 with content-hash deduplication. Re-uploading identical content is a no-op. */ + post: operations["postUpload-csv-batch"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/upload-text": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Upload text content to R2 storage. When chatId is provided, also registers the upload as a chat asset in the same request so the S3 blob and the ChatAsset row stay in sync. */ + post: operations["postUpload-text"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get all users */ + get: operations["getUsers"]; + put?: never; + /** @description Create a new user */ + post: operations["postUsers"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/users/logout": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Logout user and clear authentication cookie */ + post: operations["postUsersLogout"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/users/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get the current user */ + get: operations["getUsersMe"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/users/me/permissions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get the current user's effective permissions for a team */ + get: operations["getUsersMePermissions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/users/me/preferences": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get the current user's UI preferences */ + get: operations["getUsersMePreferences"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** @description Update the current user's UI preferences */ + patch: operations["patchUsersMePreferences"]; + trace?: never; + }; + "/users/provision": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Handle user account provisioning */ + post: operations["postUsersProvision"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/users/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** @description Update a user */ + put: operations["putUsersById"]; + post?: never; + /** @description Delete a user */ + delete: operations["deleteUsersById"]; + options?: never; + head?: never; + /** @description Partially update a user */ + patch: operations["patchUsersById"]; + trace?: never; + }; + "/validate/apiKey": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Test API key authentication */ + get: operations["getValidateApiKey"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/workspace-files/by-key": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Get a workspace file by its storage key with presigned URL */ + get: operations["getWorkspace-filesBy-key"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + ApiError: { + code?: string; + details?: string; + error: string; + }; + DeletedResult: { + message: string; + }; + KeyMapDeleteResult: { + /** @description Entries removed */ + deleted: number; + message: string; + }; + KeyMapEntriesPage: { + entries: components["schemas"]["KeyMapEntry"][]; + mapName: string; + /** @description 1-based */ + page: number; + pageSize: number; + /** @description Entries matching the filter, not this page */ + total: number; + }; + KeyMapEntry: { + newKey: string; + object: string; + oldKey: string; + runId: string | null; + /** @description ISO-8601 timestamp */ + updatedAt: string; + }; + KeyMapLookupResult: { + mapName: string; + mappings: { + [key: string]: string; + }; + missing: string[]; + object: string; + }; + KeyMapSummary: { + entryCount: number; + mapName: string; + /** @description The domain object type, e.g. Material */ + object: string; + /** @description ISO-8601 timestamp */ + updatedAt: string | null; + }; + KeyMapUpsertResult: { + mapName: string; + object: string; + /** @description Rows inserted or updated */ + upserted: number; + }; + MaskingPolicy: { + consistent: boolean; + /** @description ISO-8601 timestamp */ + createdAt: string; + createdBy: string | null; + description: string | null; + fields?: unknown; + id: string; + keyMapName: string | null; + name: string; + projectId: string; + reversible: boolean; + teamId: string; + /** @description ISO-8601 timestamp */ + updatedAt: string; + }; + Plan: { + /** @description ISO-8601 timestamp */ + createdAt: string; + createdBy: string | null; + createdFrom: string | null; + env: string | null; + history: { + by?: string; + /** @default */ + note: string; + /** @enum {string} */ + status: "draft" | "approved" | "running" | "completed" | "failed"; + when: string; + }[]; + id: string; + /** @enum {string|null} */ + origin: "chat" | "blueprint" | "intake" | "gap analysis" | null; + owner: string | null; + projectId: string; + rows: number; + spec: { + approval?: { + reason: string; + role: string; + }; + capabilities?: { + expectedCount?: number; + expectedSumCents?: number; + group?: string; + /** @default false */ + hidden: boolean; + key: string; + name: string; + /** @default */ + note: string; + setId?: string; + /** + * @default derived + * @enum {string} + */ + source: "derived" | "manual"; + sumField?: string; + template?: string; + templateId?: string; + }[]; + /** @default [] */ + constraints: string[]; + coverage?: { + count: number; + family: string; + items: string[]; + }[]; + coverageConfig?: { + /** @default 14 */ + freshnessDays: number; + /** + * @default release + * @enum {string} + */ + mode: "release" | "migration"; + sourceSystem?: string; + /** @default 0 */ + sumToleranceCents: number; + targetSystem?: string; + }; + /** @default [] */ + entities: { + endpointId?: string; + key: string; + name: string; + /** @default */ + note: string; + template: string; + templateId?: string; + volume: number; + }[]; + /** @default [] */ + expectations: string[]; + flow?: { + loop?: string | null; + phase: string; + steps: { + fields?: string[]; + from: string; + iface: string; + kind: string; + msg: string; + reachable?: boolean; + scaffold?: { + entity: string; + fields: string[]; + ops: string[]; + }; + /** @enum {string} */ + status: "mapped" | "likely" | "custom" | "unknown"; + to: string; + why?: string; + }[]; + }[]; + /** @default [] */ + gaps: { + action?: string; + iface?: string; + /** @default */ + note: string; + scaffold?: { + entity: string; + fields: string[]; + ops: string[]; + }; + title: string; + /** @enum {string} */ + type: "connect" | "custom" | "input" | "blocker" | "gap" | "stale"; + }[]; + /** @default [] */ + integrations: { + /** @enum {string} */ + access: "read" | "write"; + /** @default */ + detail: string; + system: string; + via: string; + }[]; + /** @enum {string} */ + kind?: "entity" | "flow" | "task" | "mapping"; + /** @default [] */ + lanes: string[]; + lifecycle?: { + mode: string; + refresh: string; + replenish: string; + }; + mappingConfig?: { + keyMapName?: string; + maskingPolicyId?: string; + maskingPolicyName?: string; + sourceObject?: string; + sourceSystem?: string; + targetObject?: string; + targetSystem?: string; + }; + mappings?: { + /** @default false */ + generate: boolean; + keyMapName?: string; + maskingPolicyId?: string; + /** @default */ + note: string; + sourceField?: string; + /** + * @default open + * @enum {string} + */ + status: "mapped" | "open" | "needs-review"; + targetField: string; + /** @default */ + transform: string; + }[]; + /** @default [] */ + steps: string[]; + tasks?: { + note?: string; + phase: string; + tasks: { + /** @default [] */ + deps: string[]; + /** @default */ + detail: string; + key?: string; + /** @enum {string} */ + priority?: "P0" | "P1" | "P2" | "P3"; + title: string; + }[]; + }[]; + version?: { + by: string; + n: number; + when: string; + }; + }; + /** @enum {string} */ + status: "draft" | "approved" | "running" | "completed" | "failed"; + summary: string | null; + targets: string[]; + teamId: string; + title: string; + /** @description ISO-8601 timestamp */ + updatedAt: string; + write: boolean; + }; + PlanDeleteResult: { + success: boolean; + }; + Project: { + avatar: string | null; + /** @description ISO-8601 timestamp */ + createdAt: string; + createdBy: string; + description: string | null; + id: string; + name: string; + teamId: string; + }; + Set: { + /** @description ISO-8601 timestamp */ + createdAt: string; + createdBy: string | null; + data?: unknown; + description: string | null; + id: string; + locked: boolean; + name: string; + projectId: string; + rowCount: number; + teamId: string; + /** @description ISO-8601 timestamp */ + updatedAt: string; + }; + SetDetail: { + createdByName: string | null; + } & components["schemas"]["Set"]; + Template: { + /** @description ISO-8601 timestamp */ + createdAt: string; + createdBy: string | null; + dbOrderIdx: number; + fields?: unknown; + id: string; + name: string; + projectId: string | null; + seed: number | null; + simulationConfig?: null; + teamId: string | null; + templateFolderId: string | null; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getAddressAvailability: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getAddressCities: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getAddressCountries: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getAddressPostcodes: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getAddressRegions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getAgentApprovals: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postAgentApprovals: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + chatId?: string; + rowCount: number; + targetKind?: string; + targetRef?: string; + tool: string; + }; + }; + }; + responses: never; + }; + postAgentApprovalsByIdDeny: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postAgentApprovalsByIdGrant: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postAnalyze-image": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postAnalyze-pdf": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getApiKeys: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postApiKeys: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + putApiKeysById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + deleteApiKeysById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getAuditEvents: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postAuditEvents: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + category?: string; + chatId?: string; + decision?: string; + durationMs?: number; + error?: string; + finishedAt?: string; + inputDigest?: unknown; + sdkSessionId?: string; + startedAt?: string; + status?: string; + targetKind?: string; + targetRef?: string; + tool: string; + trackingId?: string; + }; + }; + }; + responses: never; + }; + postAuthLogout: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postAuthRefresh: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postAuthSession: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getBlobByKey: { + parameters: { + query?: never; + header?: never; + path: { + key: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getChat-assets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postChat-assets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + chatId: string; + filename: string; + mimeType?: string; + s3Key: string; + size?: number; + /** @enum {string} */ + source?: "agent" | "upload"; + }; + }; + }; + responses: never; + }; + "deleteChat-assetsById": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getChats: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postChats: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id: string; + messages?: unknown; + /** @default New Chat */ + title?: string; + }; + }; + }; + responses: never; + }; + getChatsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + putChatsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + messages?: unknown; + title?: string; + }; + }; + }; + responses: never; + }; + deleteChatsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getConnections: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postConnections: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + connectionString: string; + createdBy: string; + endpointFolderId?: string | null; + id?: string; + name: string; + projectId: string; + readOnly?: boolean; + teamId: string; + /** @enum {string} */ + type: "db2" | "postgresql" | "mysql" | "mssql" | "mongodb" | "oracle"; + }; + }; + }; + responses: never; + }; + getConnectionsTables: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postConnectionsTest: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + connectionString: string; + /** @enum {string} */ + type: "db2" | "postgresql" | "mysql" | "mssql" | "mongodb" | "oracle"; + }; + }; + }; + responses: never; + }; + getConnectionsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + putConnectionsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + connectionString: string; + createdBy: string; + endpointFolderId?: string | null; + id?: string; + name: string; + projectId: string; + readOnly?: boolean; + teamId: string; + /** @enum {string} */ + type: "db2" | "postgresql" | "mysql" | "mssql" | "mongodb" | "oracle"; + }; + }; + }; + responses: never; + }; + deleteConnectionsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getCustomDataTypes: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postCustomDataTypes: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdBy: string; + fieldConfig?: unknown; + id?: string; + name: string; + projectId: string; + teamId: string; + }; + }; + }; + responses: never; + }; + putCustomDataTypesById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdBy: string; + fieldConfig?: unknown; + id?: string; + name: string; + projectId: string; + teamId: string; + }; + }; + }; + responses: never; + }; + deleteCustomDataTypesById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postDatamaker: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getEndpointFolders: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postEndpointFolders: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdAt?: string; + createdBy?: string; + id?: string; + name: string; + projectId: string; + teamId: string; + }; + }; + }; + responses: never; + }; + putEndpointFoldersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + deleteEndpointFoldersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getEndpoints: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postEndpoints: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdBy: string; + endpointFolderId?: string | null; + headers?: unknown; + id?: string; + integrationId?: string | null; + meta?: unknown; + /** @enum {string} */ + method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE"; + name: string; + projectId: string; + queryParams?: unknown; + teamId: string; + url: string; + }; + }; + }; + responses: never; + }; + "postEndpointsAuth-resolve": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getEndpointsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + putEndpointsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdBy: string; + endpointFolderId?: string | null; + headers?: unknown; + id?: string; + integrationId?: string | null; + meta?: unknown; + /** @enum {string} */ + method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE"; + name: string; + projectId: string; + queryParams?: unknown; + teamId: string; + url: string; + }; + }; + }; + responses: never; + }; + deleteEndpointsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postExecute-python": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @default false */ + async?: boolean; + projectId?: string; + /** Format: uri */ + requirementsUrl?: string; + /** Format: uri */ + url: string; + }; + }; + }; + responses: never; + }; + postExportDb: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postExportRest: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getFeedback: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postFeedback: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + comment?: string; + createdBy: string; + /** @enum {string} */ + feeling: "EXCITED" | "HAPPY" | "SAD" | "HATE"; + id?: string; + }; + }; + }; + responses: never; + }; + putFeedbackById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + comment?: string; + createdBy: string; + /** @enum {string} */ + feeling: "EXCITED" | "HAPPY" | "SAD" | "HATE"; + id?: string; + }; + }; + }; + responses: never; + }; + deleteFeedbackById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getFields: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postGenerateDatabase-templates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postGenerateOpenapiByFormat: { + parameters: { + query?: never; + header?: never; + path: { + format: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postGenerateSensitive: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postGenerateTemplate: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postGetcsrftoken: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + authorization?: unknown; + endpointId?: string; + /** Format: uri */ + sapUrl: string; + }; + }; + }; + responses: never; + }; + getIntegrations: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postIntegrations: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + auth?: unknown; + createdBy: string; + endpointFolderId?: string | null; + headers?: unknown; + id?: string; + kind?: string; + name: string; + origin: string; + projectId: string; + scope?: string | null; + teamId: string; + }; + }; + }; + responses: never; + }; + postIntegrationsTest: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + auth?: unknown; + id?: string; + kind?: string; + origin: string; + }; + }; + }; + responses: never; + }; + getIntegrationsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + putIntegrationsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + auth?: unknown; + createdBy: string; + endpointFolderId?: string | null; + headers?: unknown; + id?: string; + kind?: string; + name: string; + origin: string; + projectId: string; + scope?: string | null; + teamId: string; + }; + }; + }; + responses: never; + }; + deleteIntegrationsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postIntegrationsByIdEndpoints: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + entitySet?: string; + name?: string; + service: string; + }; + }; + }; + responses: never; + }; + getIntegrationsByIdJiraCreatemeta: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postIntegrationsByIdJiraIssues: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + description?: string; + issueType: string; + labels?: string[]; + priority?: string; + projectKey: string; + summary: string; + }; + }; + }; + responses: never; + }; + getIntegrationsByIdJiraIssuesByIssueKey: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + issueKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postIntegrationsByIdJiraIssuesByIssueKeyComment: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + issueKey: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + text: string; + }; + }; + }; + responses: never; + }; + getIntegrationsByIdJiraIssuesByIssueKeyTransitions: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + issueKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postIntegrationsByIdJiraIssuesByIssueKeyTransitions: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + issueKey: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + transitionId: string; + }; + }; + }; + responses: never; + }; + getIntegrationsByIdJiraProjects: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getIntegrationsByIdJiraSearch: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getIntegrationsByIdServices: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postIntegrationsByIdToscaOnpremCheckin-all": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + comment?: string; + workspace: string; + }; + }; + }; + responses: never; + }; + "postIntegrationsByIdToscaOnpremExecution-entries": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + comment?: string; + executionListId: string; + testCaseId: string; + workspace: string; + }; + }; + }; + responses: never; + }; + postIntegrationsByIdToscaOnpremObjects: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + attributes?: { + Name: string; + Value: string; + }[]; + comment?: string; + objType: string; + parentId: string; + workspace: string; + }; + }; + }; + responses: never; + }; + getIntegrationsByIdToscaOnpremObjectsByObjectId: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + objectId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postIntegrationsByIdToscaOnpremQuery: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + from?: string; + tql: string; + workspace: string; + }; + }; + }; + responses: never; + }; + getIntegrationsByIdToscaOnpremWorkspaces: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getIntegrationsByIdToscaPlaylist-runsByPlaylistRunIdTestcase-runs": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + playlistRunId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getIntegrationsByIdToscaPlaylists: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getIntegrationsByIdToscaPlaylistsByPlaylistIdRuns: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + playlistId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getIntegrationsByIdToscaTestcase-runsByTestCaseRunIdSteps": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + testCaseRunId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getIntegrationsByIdToscaTestcases: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postIntegrationsByIdToscaTestcases: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + design: { + [key: string]: unknown; + }; + name: string; + space?: string; + }; + }; + }; + responses: never; + }; + getIntegrationsByIdToscaTestcasesByTestCaseId: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + testCaseId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getIntegrationsByIdToscaWorkspaces: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getInternalWorkspaceByScenarioIdFiles: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getInternalWorkspaceByScenarioIdInfo: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postInternalWorkspaceByScenarioIdSync: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + files: { + /** @enum {string} */ + action: "created" | "updated" | "deleted"; + filename: string; + mimeType?: string; + size: number; + }[]; + }; + }; + }; + responses: never; + }; + postInternalWorkspaceByScenarioIdUpload: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getKeymaps: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description One row per (mapName, object), ordered by both */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["KeyMapSummary"][]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postKeymapsEntries: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description Old-to-new key pairs to upsert */ + entries: { + /** @description The key minted in the target system */ + newKey: string; + /** @description The key in the source system */ + oldKey: string; + }[]; + /** @description Logical map name grouping entries, e.g. 'sap-material-migration' */ + mapName: string; + /** @description The domain object type, e.g. 'Material' or 'BusinessPartner' */ + object: string; + /** @description The project this map belongs to (falls back to the key/session scope) */ + projectId?: string; + /** @description Optional run/source metadata: the scenario run or job that minted the keys */ + runId?: string; + }; + }; + }; + responses: { + /** @description How many rows were inserted or updated */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["KeyMapUpsertResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The entries could not be upserted */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postKeymapsLookup: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description The map to look up in */ + mapName: string; + /** @description The domain object type */ + object: string; + /** @description Source-system keys to translate */ + oldKeys: string[]; + /** @description The project the map belongs to (falls back to the key/session scope) */ + projectId?: string; + }; + }; + }; + responses: { + /** @description Resolved mappings, plus the keys with no mapping yet */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["KeyMapLookupResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + deleteKeymapsByMapName: { + parameters: { + query?: never; + header?: never; + path: { + mapName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The map was dropped, with the number of entries removed */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["KeyMapDeleteResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The key map could not be deleted */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getKeymapsByMapNameEntries: { + parameters: { + query?: never; + header?: never; + path: { + mapName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description One page of entries, with the total for the filter */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["KeyMapEntriesPage"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getLicenses: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postLicensesActivate: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + key: string; + teamId: string; + }; + }; + }; + responses: never; + }; + getLicensesStatus: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getLogs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postLogs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description Error message if failed */ + error?: string; + /** @description The BullMQ job ID */ + jobId: string; + /** + * @description Log entries + * @default [] + */ + logs?: string[]; + /** @description Final execution output */ + output?: string; + /** @description The scenario ID being executed */ + scenarioId: string; + /** + * @description Current status of the scenario run + * @enum {string} + */ + status: "queued" | "running" | "completed" | "failed"; + }; + }; + }; + responses: never; + }; + deleteLogsCleanup: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getLogsJobByJobId: { + parameters: { + query?: never; + header?: never; + path: { + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + patchLogsJobByJobId: { + parameters: { + query?: never; + header?: never; + path: { + jobId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description ISO timestamp the run finished */ + completedAt?: string | null; + /** @description Error message, if failed */ + error?: string | null; + /** @description Final run output */ + output?: string | null; + /** @description Terminal status (completed/failed) */ + status?: string; + }; + }; + }; + responses: never; + }; + patchLogsJobByJobIdAppend: { + parameters: { + query?: never; + header?: never; + path: { + jobId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description New log entries to append */ + logs: string[]; + /** @description Updated status */ + status?: string; + }; + }; + }; + responses: never; + }; + getLogsScenarioByScenarioId: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getLogsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + deleteLogsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getMasking-policies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Policies in scope */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MaskingPolicy"][]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + "postMasking-policies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description Default: same source value masks to the same output */ + consistent?: boolean; + /** @description Short description of the policy (e.g. GDPR profile) */ + description?: string; + /** @description Per-field strategy rows: field matcher + strategy + overrides */ + fields?: { + consistent?: boolean; + detectedAs?: string; + field: string; + note?: string; + reversible?: boolean; + /** @enum {string} */ + strategy: "faker-replace" | "hash" | "tokenize" | "redact" | "preserve-format"; + }[]; + /** @description Key map name (#2787) scoping consistency to one run's key space */ + keyMapName?: string; + name: string; + /** @description The project ID this policy belongs to */ + projectId?: string; + /** @description Default: masked values can be translated back (tokenization) */ + reversible?: boolean; + }; + }; + }; + responses: { + /** @description The created policy */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MaskingPolicy"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The policy could not be created */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + "getMasking-policiesById": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The policy */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MaskingPolicy"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No policy with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + "deleteMasking-policiesById": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The policy was deleted */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeletedResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No policy with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The policy could not be deleted */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + "patchMasking-policiesById": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + consistent?: boolean; + description?: string | null; + fields?: { + consistent?: boolean; + detectedAs?: string; + field: string; + note?: string; + reversible?: boolean; + /** @enum {string} */ + strategy: "faker-replace" | "hash" | "tokenize" | "redact" | "preserve-format"; + }[]; + keyMapName?: string | null; + name?: string; + reversible?: boolean; + }; + }; + }; + responses: { + /** @description The updated policy */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MaskingPolicy"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No policy with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The policy could not be updated */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getPacksCatalog: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postPacksCatalogInstall: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @default false */ + confirm?: boolean; + /** @default false */ + dryRun?: boolean; + name: string; + projectId: string; + }; + }; + }; + responses: never; + }; + postPacksExport: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @default [] */ + datatypeIds?: string[]; + manifest: { + description: string; + license?: string; + name: string; + publisher: string; + /** @default [] */ + requires?: { + /** @constant */ + kind: "integration"; + note?: string; + type: string; + }[]; + version: string; + }; + /** @default [] */ + planIds?: string[]; + projectId: string; + /** @default [] */ + scenarioIds?: string[]; + /** @default [] */ + skillIds?: string[]; + /** @default [] */ + templateIds?: string[]; + }; + }; + }; + responses: never; + }; + postPacksImport: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @default false */ + confirm?: boolean; + /** @default false */ + dryRun?: boolean; + pack?: unknown; + projectId: string; + }; + }; + }; + responses: never; + }; + getPacksInstalled: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getPermissions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getPlans: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Plans in the active project */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Plan"][]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + "getPlansCapability-catalog": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postPlansSave: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdFrom?: string; + env?: string; + /** @default [] */ + history?: { + by?: string; + /** @default */ + note?: string; + /** @enum {string} */ + status: "draft" | "approved" | "running" | "completed" | "failed"; + when: string; + }[]; + /** @enum {string} */ + origin?: "chat" | "blueprint" | "intake" | "gap analysis"; + owner?: string; + spec?: { + approval?: { + reason: string; + role: string; + }; + capabilities?: { + expectedCount?: number; + expectedSumCents?: number; + group?: string; + /** @default false */ + hidden?: boolean; + key: string; + name: string; + /** @default */ + note?: string; + setId?: string; + /** + * @default derived + * @enum {string} + */ + source?: "derived" | "manual"; + sumField?: string; + template?: string; + templateId?: string; + }[]; + /** @default [] */ + constraints?: string[]; + coverage?: { + count: number; + family: string; + items: string[]; + }[]; + coverageConfig?: { + /** @default 14 */ + freshnessDays?: number; + /** + * @default release + * @enum {string} + */ + mode?: "release" | "migration"; + sourceSystem?: string; + /** @default 0 */ + sumToleranceCents?: number; + targetSystem?: string; + }; + /** @default [] */ + entities?: { + endpointId?: string; + key: string; + name: string; + /** @default */ + note?: string; + template: string; + templateId?: string; + volume: number; + }[]; + /** @default [] */ + expectations?: string[]; + flow?: { + loop?: string | null; + phase: string; + steps: { + fields?: string[]; + from: string; + iface: string; + kind: string; + msg: string; + reachable?: boolean; + scaffold?: { + entity: string; + fields: string[]; + ops: string[]; + }; + /** @enum {string} */ + status: "mapped" | "likely" | "custom" | "unknown"; + to: string; + why?: string; + }[]; + }[]; + /** @default [] */ + gaps?: { + action?: string; + iface?: string; + /** @default */ + note?: string; + scaffold?: { + entity: string; + fields: string[]; + ops: string[]; + }; + title: string; + /** @enum {string} */ + type: "connect" | "custom" | "input" | "blocker" | "gap" | "stale"; + }[]; + /** @default [] */ + integrations?: { + /** @enum {string} */ + access: "read" | "write"; + /** @default */ + detail?: string; + system: string; + via: string; + }[]; + /** @enum {string} */ + kind?: "entity" | "flow" | "task" | "mapping"; + /** @default [] */ + lanes?: string[]; + lifecycle?: { + mode: string; + refresh: string; + replenish: string; + }; + mappingConfig?: { + keyMapName?: string; + maskingPolicyId?: string; + maskingPolicyName?: string; + sourceObject?: string; + sourceSystem?: string; + targetObject?: string; + targetSystem?: string; + }; + mappings?: { + /** @default false */ + generate?: boolean; + keyMapName?: string; + maskingPolicyId?: string; + /** @default */ + note?: string; + sourceField?: string; + /** + * @default open + * @enum {string} + */ + status?: "mapped" | "open" | "needs-review"; + targetField: string; + /** @default */ + transform?: string; + }[]; + /** @default [] */ + steps?: string[]; + tasks?: { + note?: string; + phase: string; + tasks: { + /** @default [] */ + deps?: string[]; + /** @default */ + detail?: string; + key?: string; + /** @enum {string} */ + priority?: "P0" | "P1" | "P2" | "P3"; + title: string; + }[]; + }[]; + version?: { + by: string; + n: number; + when: string; + }; + }; + /** + * @default draft + * @enum {string} + */ + status?: "draft" | "approved" | "running" | "completed" | "failed"; + summary?: string; + /** @default [] */ + targets?: string[]; + title: string; + /** @default false */ + write?: boolean; + }; + }; + }; + responses: { + /** @description The created plan */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Plan"]; + }; + }; + /** @description The creating team member could not be resolved */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getPlansById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The plan */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Plan"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No plan with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + deletePlansByPlanId: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The plan was deleted */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PlanDeleteResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No plan with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + patchPlansByPlanId: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdFrom?: string; + env?: string; + /** @default [] */ + history?: { + by?: string; + /** @default */ + note?: string; + /** @enum {string} */ + status: "draft" | "approved" | "running" | "completed" | "failed"; + when: string; + }[]; + /** @enum {string} */ + origin?: "chat" | "blueprint" | "intake" | "gap analysis"; + owner?: string; + spec?: { + approval?: { + reason: string; + role: string; + }; + capabilities?: { + expectedCount?: number; + expectedSumCents?: number; + group?: string; + /** @default false */ + hidden?: boolean; + key: string; + name: string; + /** @default */ + note?: string; + setId?: string; + /** + * @default derived + * @enum {string} + */ + source?: "derived" | "manual"; + sumField?: string; + template?: string; + templateId?: string; + }[]; + /** @default [] */ + constraints?: string[]; + coverage?: { + count: number; + family: string; + items: string[]; + }[]; + coverageConfig?: { + /** @default 14 */ + freshnessDays?: number; + /** + * @default release + * @enum {string} + */ + mode?: "release" | "migration"; + sourceSystem?: string; + /** @default 0 */ + sumToleranceCents?: number; + targetSystem?: string; + }; + /** @default [] */ + entities?: { + endpointId?: string; + key: string; + name: string; + /** @default */ + note?: string; + template: string; + templateId?: string; + volume: number; + }[]; + /** @default [] */ + expectations?: string[]; + flow?: { + loop?: string | null; + phase: string; + steps: { + fields?: string[]; + from: string; + iface: string; + kind: string; + msg: string; + reachable?: boolean; + scaffold?: { + entity: string; + fields: string[]; + ops: string[]; + }; + /** @enum {string} */ + status: "mapped" | "likely" | "custom" | "unknown"; + to: string; + why?: string; + }[]; + }[]; + /** @default [] */ + gaps?: { + action?: string; + iface?: string; + /** @default */ + note?: string; + scaffold?: { + entity: string; + fields: string[]; + ops: string[]; + }; + title: string; + /** @enum {string} */ + type: "connect" | "custom" | "input" | "blocker" | "gap" | "stale"; + }[]; + /** @default [] */ + integrations?: { + /** @enum {string} */ + access: "read" | "write"; + /** @default */ + detail?: string; + system: string; + via: string; + }[]; + /** @enum {string} */ + kind?: "entity" | "flow" | "task" | "mapping"; + /** @default [] */ + lanes?: string[]; + lifecycle?: { + mode: string; + refresh: string; + replenish: string; + }; + mappingConfig?: { + keyMapName?: string; + maskingPolicyId?: string; + maskingPolicyName?: string; + sourceObject?: string; + sourceSystem?: string; + targetObject?: string; + targetSystem?: string; + }; + mappings?: { + /** @default false */ + generate?: boolean; + keyMapName?: string; + maskingPolicyId?: string; + /** @default */ + note?: string; + sourceField?: string; + /** + * @default open + * @enum {string} + */ + status?: "mapped" | "open" | "needs-review"; + targetField: string; + /** @default */ + transform?: string; + }[]; + /** @default [] */ + steps?: string[]; + tasks?: { + note?: string; + phase: string; + tasks: { + /** @default [] */ + deps?: string[]; + /** @default */ + detail?: string; + key?: string; + /** @enum {string} */ + priority?: "P0" | "P1" | "P2" | "P3"; + title: string; + }[]; + }[]; + version?: { + by: string; + n: number; + when: string; + }; + }; + /** + * @default draft + * @enum {string} + */ + status?: "draft" | "approved" | "running" | "completed" | "failed"; + summary?: string; + /** @default [] */ + targets?: string[]; + title?: string; + /** @default false */ + write?: boolean; + }; + }; + }; + responses: { + /** @description The updated plan */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Plan"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No plan with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postPlansByPlanIdCheck: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postPlansByPlanIdRun: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getPlansByPlanIdRuns: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getPlansByPlanIdRunsByRunId: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + runId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postPlansByPlanIdRunsByRunIdComplete: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + runId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + error?: string; + /** @default 0 */ + rows?: number; + /** @enum {string} */ + status: "completed" | "failed"; + }; + }; + }; + responses: never; + }; + postPlansByPlanIdRunsByRunIdFiles: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + runId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + content: string; + entity: string; + filename: string; + /** @default application/json */ + mimeType?: string; + }; + }; + }; + responses: never; + }; + postPlansByPlanIdRunsByRunIdLog: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + runId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** + * @default info + * @enum {string} + */ + level?: "info" | "warn" | "error"; + message: string; + }; + }; + }; + responses: never; + }; + getPlansByPlanIdSignoffs: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postPlansByPlanIdSignoffs: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + note?: string; + runId: string; + }; + }; + }; + responses: never; + }; + postPlansByPlanIdStatus: { + parameters: { + query?: never; + header?: never; + path: { + planId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + history?: { + by?: string; + /** @default */ + note?: string; + /** @enum {string} */ + status: "draft" | "approved" | "running" | "completed" | "failed"; + when: string; + }; + /** @enum {string} */ + status: "draft" | "approved" | "running" | "completed" | "failed"; + }; + }; + }; + responses: never; + }; + postPreview: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getProjects: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Projects the caller can access */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Project"][]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postProjects: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + avatar?: string; + description?: string; + id?: string; + name: string; + teamId: string; + }; + }; + }; + responses: { + /** @description The created project */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Project"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getProjectsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The project */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Project"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No project with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + putProjectsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + avatar?: string; + description?: string; + id?: string; + name: string; + teamId: string; + }; + }; + }; + responses: { + /** @description The updated project */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Project"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No project with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + deleteProjectsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The project was deleted */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeletedResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No project with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getRoles: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postRoles: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + description?: string; + name: string; + /** @default [] */ + permissions?: string[]; + teamId: string; + }; + }; + }; + responses: never; + }; + putRolesById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + description?: string | null; + name?: string; + permissions?: string[]; + }; + }; + }; + responses: never; + }; + deleteRolesById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postScenario-files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + content: string; + description?: string; + folderId?: string; + mimeType?: string; + name: string; + projectId?: string; + scenarioId: string; + size: number; + teamId: string; + }; + }; + }; + responses: never; + }; + getScenarios: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postScenarios: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdAt?: string; + /** @description A valid team member id */ + createdBy?: string; + /** @description Short description of what this scenario does */ + description?: string; + name: string; + presignedUrl?: string; + /** @description The project ID this scenario belongs to */ + projectId?: string; + requirementsUrl?: string; + /** @description The team ID this scenario belongs to */ + teamId?: string; + /** @description Execution timeout in seconds (60–3600) */ + timeoutSeconds?: number; + }; + }; + }; + responses: never; + }; + postScenariosExecute: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @default false */ + async?: boolean; + /** @description Optional inline code to execute instead of saved script */ + code?: string; + /** @description The project ID this scenario belongs to */ + projectId: string; + /** @description The scenario ID to execute */ + scenarioId?: string; + /** + * @description What initiated the run. UI clients omit this (defaults to 'manual'). The chat agent must send 'agent' so the run can be visually distinguished in scenario history. + * @default manual + * @enum {string} + */ + source?: "manual" | "agent" | "mcp"; + }; + }; + }; + responses: never; + }; + "postScenariosFrom-chat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description The chat whose thread should become a scenario */ + chatId: string; + /** @description The project the chat and scenario belong to */ + projectId: string; + /** @description Optional client-side thread snapshot (richer than the persisted row: includes tool-call summaries) */ + thread?: { + turns: { + prompt: string; + reply: string; + toolSummaries?: string[]; + }[]; + }; + /** @description Execution timeout in seconds (60–3600) */ + timeoutSeconds?: number; + }; + }; + }; + responses: never; + }; + postScenariosJobsByJobIdCancel: { + parameters: { + query?: never; + header?: never; + path: { + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getScenariosJobsByJobIdLogsStream: { + parameters: { + query?: never; + header?: never; + path: { + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getScenariosJobsByJobIdStatus: { + parameters: { + query?: never; + header?: never; + path: { + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postScenariosSave: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + code: string; + name?: string; + /** @description Execution timeout in seconds (60–3600) */ + timeoutSeconds?: number; + }; + }; + }; + responses: never; + }; + getScenariosById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + deleteScenariosById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + patchScenariosById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdAt?: string; + /** @description A valid team member id */ + createdBy?: string; + /** @description Short description of what this scenario does */ + description?: string; + name: string; + presignedUrl?: string; + /** @description The project ID this scenario belongs to */ + projectId?: string; + requirementsUrl?: string; + /** @description The team ID this scenario belongs to */ + teamId?: string; + /** @description Execution timeout in seconds (60–3600) */ + timeoutSeconds?: number; + }; + }; + }; + responses: never; + }; + postScenariosByIdDiagramRegenerate: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getScenariosByIdEnvironment-variables": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postScenariosByIdEnvironment-variables": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + key: string; + value: string; + }; + }; + }; + responses: never; + }; + "patchScenariosByIdEnvironment-variables": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + environmentVariables: { + [key: string]: string; + }; + }; + }; + }; + responses: never; + }; + "deleteScenariosByIdEnvironment-variablesByKey": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + key: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getScenariosByScenarioIdFiles: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postScenariosByScenarioIdFilesUpload: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getScenariosByScenarioIdFilesByFileId: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + fileId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + deleteScenariosByScenarioIdFilesByFileId: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + fileId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getScenariosByScenarioIdStorage: { + parameters: { + query?: never; + header?: never; + path: { + scenarioId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postSchema-graphByIdDiff": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getSchema-graphByIdEntityByName": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postSchema-graphByIdEntityByNameConnect": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postSchema-graphByIdEntityByNamePreview": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postSchema-graphByIdEntityByNameSample": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postSchema-graphByIdEntityByNameTemplate": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getSchema-graphByIdPath": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postSchema-graphByIdRefresh": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getSchema-graphByIdSearch": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getSchema-graphByIdServices": { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getSets: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Sets in scope, newest first */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Set"][]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postSets: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @description The saved rows payload (JSON) */ + data?: unknown; + /** @description Short description of the set */ + description?: string; + /** @description Freeze the set on creation (snapshot semantics) */ + locked?: boolean; + name: string; + /** @description The project ID this set belongs to */ + projectId?: string; + /** @description Row count; derived from `data` when omitted */ + rowCount?: number; + }; + }; + }; + responses: { + /** @description The created set */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Set"]; + }; + }; + /** @description The payload exceeds the inline size cap (10,000 rows / 5 MB) */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The set could not be created */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getSetsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The set, enriched with the creator's display name */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SetDetail"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No set with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + deleteSetsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The set was deleted */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeletedResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The set is locked; unlock it before deleting */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The set could not be deleted */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + patchSetsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + data?: unknown; + description?: string | null; + /** @description Lock (freeze) or unlock the set. Locking is always allowed; other edits are rejected while locked. */ + locked?: boolean; + name?: string; + rowCount?: number; + }; + }; + }; + responses: { + /** @description The updated set */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Set"]; + }; + }; + /** @description The payload exceeds the inline size cap (10,000 rows / 5 MB) */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The set is locked; unlock it before editing */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The set could not be updated */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postSetupTeams: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getShortcuts: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postShortcuts: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + context: "GLOBAL" | "TEMPLATE_PAGE" | "EDIT_TEMPLATE"; + function: string; + id: string; + keys: string[]; + userId: string; + }; + }; + }; + responses: never; + }; + putShortcutsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + context: "GLOBAL" | "TEMPLATE_PAGE" | "EDIT_TEMPLATE"; + function: string; + id: string; + keys: string[]; + userId: string; + }; + }; + }; + responses: never; + }; + deleteShortcutsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getSkills: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postSkills: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + body: string; + description: string; + enabled?: boolean; + name: string; + projectId?: string | null; + teamId: string; + }; + }; + }; + responses: never; + }; + postSkillsImport: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + content: string; + enabled?: boolean; + projectId?: string | null; + teamId: string; + }; + }; + }; + responses: never; + }; + getSkillsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + putSkillsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + body?: string; + description?: string; + enabled?: boolean; + name?: string; + }; + }; + }; + responses: never; + }; + deleteSkillsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getSkillsByIdExport: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getTeamMembers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postTeamMembers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id?: string; + /** @enum {string} */ + role: "MEMBER" | "ADMIN" | "OWNER"; + teamId: string; + userId: string; + }; + }; + }; + responses: never; + }; + postTeamMembersInvite: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: email */ + email: string; + /** + * @default MEMBER + * @enum {string} + */ + role?: "MEMBER" | "ADMIN" | "OWNER"; + teamId: string; + }; + }; + }; + responses: never; + }; + putTeamMembersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** @enum {string} */ + role: "MEMBER" | "ADMIN" | "OWNER"; + }; + }; + }; + responses: never; + }; + deleteTeamMembersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postTeamMembersByIdRoles: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + roleId: string; + }; + }; + }; + responses: never; + }; + deleteTeamMembersByIdRolesByRoleId: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + roleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getTeams: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postTeams: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + avatar?: string; + createdAt?: string; + id?: string; + name: string; + updatedAt?: string; + }; + }; + }; + responses: never; + }; + putTeamsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + avatar?: string; + createdAt?: string; + id?: string; + name: string; + updatedAt?: string; + }; + }; + }; + responses: never; + }; + deleteTeamsById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getTemplateFolders: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postTemplateFolders: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdBy: string; + id?: string; + isDatabase?: boolean; + name: string; + projectId: string; + teamId: string; + }; + }; + }; + responses: never; + }; + putTemplateFoldersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdBy?: string; + id?: string; + isDatabase?: boolean; + name: string; + projectId?: string; + teamId?: string; + }; + }; + }; + responses: never; + }; + deleteTemplateFoldersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getTemplates: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Templates in the caller's team/project scope */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Template"][]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postTemplates: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdAt?: string; + /** @description A valid team member id */ + createdBy?: string; + /** @description Not sure if this is needed */ + dbOrderIdx?: number; + /** @default [] */ + fields?: { + active: boolean; + name: string; + nested?: { + [key: string]: unknown; + }[]; + options?: unknown; + type: string; + }[]; + name: string; + projectId: string; + /** @default null */ + seed?: number | null; + simulationConfig?: { + isSimulationVisible: boolean; + period: number; + }; + teamId: string; + /** @default null */ + templateFolderId?: string | null; + }; + }; + }; + responses: { + /** @description The created template */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Template"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + getTemplatesById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The template */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Template"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No template with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + putTemplatesById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + createdAt?: string; + /** @description A valid team member id */ + createdBy?: string; + /** @description Not sure if this is needed */ + dbOrderIdx?: number; + /** @default [] */ + fields?: { + active: boolean; + name: string; + nested?: { + [key: string]: unknown; + }[]; + options?: unknown; + type: string; + }[]; + name: string; + projectId: string; + /** @default null */ + seed?: number | null; + simulationConfig?: { + isSimulationVisible: boolean; + period: number; + }; + teamId: string; + /** @default null */ + templateFolderId?: string | null; + }; + }; + }; + responses: { + /** @description The updated template */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Template"]; + }; + }; + /** @description The template has no team */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No template with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + deleteTemplatesById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The template was deleted */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeletedResult"]; + }; + }; + /** @description Not authenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description The caller lacks the required permission */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + /** @description No template with that id in the caller's scope */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiError"]; + }; + }; + }; + }; + postUpload: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postUpload-csv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postUpload-csv-batch": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "postUpload-text": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + chatId?: string; + filename: string; + mimeType?: string; + /** @enum {string} */ + source?: "agent" | "upload"; + text: string; + }; + }; + }; + responses: never; + }; + getUsers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postUsers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + autoSave?: boolean; + avatar?: string; + createdAt?: string; + /** Format: email */ + email: string; + firstName: string; + id: string; + lastName: string; + }; + }; + }; + responses: never; + }; + postUsersLogout: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getUsersMe: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getUsersMePermissions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getUsersMePreferences: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + patchUsersMePreferences: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + postUsersProvision: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + putUsersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + autoSave?: boolean; + avatar?: string; + createdAt?: string; + /** Format: email */ + email: string; + firstName: string; + id: string; + lastName: string; + }; + }; + }; + responses: never; + }; + deleteUsersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + patchUsersById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + getValidateApiKey: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; + "getWorkspace-filesBy-key": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: never; + }; +} diff --git a/src/index.test.ts b/src/index.test.ts index 2325c73..4464425 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,200 +1,156 @@ -import { DataMaker } from "./index"; -import { expect, test } from "vitest"; -import { CustomEndpoint, Data} from "./template"; - -const baseUrl = "https://cloud.datamaker.app/api"; - -test("Test creating an instance ", () => { - const datamaker = new DataMaker({ - apiKey: "DATAMAKER_API_KEY", +import { describe, expect, it, vi } from "vitest"; + +import { DataMaker, DataMakerError, MissingApiKeyError } from "./index.js"; + +/** + * A fetch stub that records what the SDK sent and answers what the test + * scripted. The assertions are as much about the REQUEST as the response: the + * entire job of this layer is turning a method call into the right HTTP call, + * so that is what has to be pinned. + */ +function stubFetch(response: { status?: number; body?: unknown } = {}): { + fetch: typeof globalThis.fetch; + calls: { url: string; init: RequestInit }[]; +} { + const calls: { url: string; init: RequestInit }[] = []; + const fetch = vi.fn( + async (url: string | URL | Request, init?: RequestInit) => { + calls.push({ url: String(url), init: init ?? {} }); + return new Response(JSON.stringify(response.body ?? {}), { + status: response.status ?? 200, + headers: { "Content-Type": "application/json" }, + }); + }, + ); + return { fetch: fetch as unknown as typeof globalThis.fetch, calls }; +} + + +/** + * The first request the SDK made. Throws rather than returning undefined so a + * test that made no request fails saying that, instead of failing later on a + * confusing property access. + */ +function firstCall(stub: { calls: { url: string; init: RequestInit }[] }) { + const call = stub.calls[0]; + if (!call) throw new Error("the SDK made no request"); + return call; +} + +const client = (over: Record = {}, stub = stubFetch()) => + new DataMaker({ + apiKey: "dm-test-key", + baseURL: "https://api.example.test", + fetch: stub.fetch, + ...over, }); - expect(datamaker).toBeInstanceOf(DataMaker); -}); +describe("authentication", () => { + it("sends the key as X-API-Key, matching datamaker-py", async () => { + const stub = stubFetch({ body: [] }); + await client({}, stub).sets.list(); -test("Test creating an instance with no api key", () => { - // save the environment variable, if any - const originalEnv = process.env["DATAMAKER_API_KEY"]; - // set the environment variable to test - process.env["DATAMAKER_API_KEY"] = "test"; - // instantiate the client - const datamaker = new DataMaker({}); - // test the instance - expect(datamaker).toBeInstanceOf(DataMaker); - expect(datamaker.apiKey).toBe("test"); - // restore the environment variable - process.env["DATAMAKER_API_KEY"] = originalEnv; -}); + const headers = firstCall(stub).init.headers as Record; + expect(headers["X-API-Key"]).toBe("dm-test-key"); + }); -test("Test creating an instance with no api key", () => { - // save the environment variable - const originalEnv = process.env["DATAMAKER_API_KEY"]; - // delete the environment variable - delete process.env["DATAMAKER_API_KEY"]; + it("refuses to construct without a key rather than failing at the first call", () => { + // A client that constructs cleanly and then 401s on every call reports the + // problem far from its cause. + expect( + () => new DataMaker({ apiKey: undefined, fetch: stubFetch().fetch }), + ).toThrow(MissingApiKeyError); + }); - expect(() => { - new DataMaker({}); - }).toThrow(/DATAMAKER_API_KEY environment variable is missing/); + it("sends team and project scope only when given", async () => { + const bare = stubFetch({ body: [] }); + await client({}, bare).sets.list(); + expect(firstCall(bare).init.headers).not.toHaveProperty("X-Team-Id"); - // restore the environment variable - process.env["DATAMAKER_API_KEY"] = originalEnv; + const scoped = stubFetch({ body: [] }); + await client({ teamId: "t1", projectId: "p1" }, scoped).sets.list(); + const headers = firstCall(scoped).init.headers as Record; + expect(headers["X-Team-Id"]).toBe("t1"); + expect(headers["X-Project-Id"]).toBe("p1"); + }); }); -test("Test setting options", () => { - const datamaker = new DataMaker({ - apiKey: "DATAMAKER_API_KEY", - timeout: 1000, - maxRetries: 3, - defaultHeaders: { "Content-Type": "application/gzip" }, - defaultQuery: { engine: "davinci" }, +describe("request building", () => { + it("drops undefined query params instead of sending the string 'undefined'", async () => { + const stub = stubFetch({ body: [] }); + await client({}, stub).templates.list({ projectId: undefined }); + expect(firstCall(stub).url).toBe("https://api.example.test/templates"); }); - expect(datamaker.options.apiKey).toBe("DATAMAKER_API_KEY"); - expect(datamaker.options.timeout).toBe(1000); - expect(datamaker.options.maxRetries).toBe(3); - expect(datamaker.options.defaultHeaders).toEqual({ - "Content-Type": "application/gzip", + it("encodes path parameters", async () => { + const stub = stubFetch({ body: {} }); + await client({}, stub).keymaps.entries("sap/material migration"); + expect(firstCall(stub).url).toContain( + "/keymaps/sap%2Fmaterial%20migration/entries", + ); }); - expect(datamaker.options.defaultQuery).toEqual({ engine: "davinci" }); - // check instance properties - expect(datamaker.apiKey).toBe("DATAMAKER_API_KEY"); - expect(Object.values(datamaker.headers)).toContain("application/gzip"); - expect(Object.keys(datamaker.headers)).toContain("Authorization"); - expect(Object.values(datamaker.headers)).toContain("DATAMAKER_API_KEY"); -}); + it("does not send a body on GET", async () => { + const stub = stubFetch({ body: [] }); + await client({}, stub).projects.list(); + expect(firstCall(stub).init.body).toBeUndefined(); + }); -test("Setting apikey from environment variable", () => { - const datamaker = new DataMaker({}); - expect(datamaker.apiKey.slice(0, 3)).toEqual("dm-"); + it("trims a trailing slash off the base URL so paths do not double up", async () => { + const stub = stubFetch({ body: [] }); + await client({ baseURL: "https://api.example.test/" }, stub).projects.list(); + expect(firstCall(stub).url).toBe("https://api.example.test/projects"); + }); }); -test("Basic data generation", async () => { - const datamaker = new DataMaker({}); - const res = await datamaker - .generate({ - quantity: 1, - fields: [ - { - name: "first_name", - type: "First Name", - }, - { - name: "last_name", - type: "Last Name", - }, - { - name: "email", - type: "Derived", - options: { - value: "{{first_name}}@automators.com", - }, - }, - ], +describe("errors", () => { + it("carries the status and the server's own message", async () => { + const stub = stubFetch({ + status: 409, + body: { error: "Set is locked - unlock it before deleting." }, }); + const dm = client({}, stub); - expect(res.length).toBe(1); - expect(res[0].first_name).toBeDefined(); - expect(res[0].last_name).toBeDefined(); - expect(res[0].email).toBeDefined(); - expect(res[0].email).toContain(res[0].first_name); -}); + await expect(dm.sets.delete("s1")).rejects.toThrow(DataMakerError); + await expect(dm.sets.delete("s1")).rejects.toMatchObject({ + status: 409, + message: "Set is locked - unlock it before deleting.", + }); + }); -test('Generate data from template in account', async () => { - const quantity = 2; - const datamaker = new DataMaker({}); - const result = await datamaker - .generateFromTemplateId("clrupt3c7000218qdcaxh9i9i", quantity); - - expect(result.length).toBe(quantity); - expect(result[0]["id"]).toBeDefined(); - expect(result[0]["name"]).toBeDefined(); - expect(result[0]["type"]).toBeDefined(); - expect(result[0]["connectionString"]).toBeDefined(); - expect(result[0]["readOnly"]).toBeDefined(); - expect(result[0]["createdBy"]).toBeDefined(); - expect(result[0]["teamId"]).toBeDefined(); -}); + it("still reports the status when the body is not JSON", async () => { + // A proxy timeout answers HTML. The status is the useful part and must not + // be replaced by a JSON parse error. + const fetch = vi.fn( + async () => new Response("504 Gateway Timeout", { status: 504 }), + ) as unknown as typeof globalThis.fetch; -test('Send multiple generated data to API endpoint from account', async () => { - const datamaker = new DataMaker({}); - const headers: any = { - "Authorization": process.env["DATAMAKER_API_KEY"], - "Content-type": "application/json", - "Credentials": "omit" - }; - const data = await datamaker.generateFromTemplateId("clrupt3c7000218qdcaxh9i9i", 2); - const result: Data[] = await datamaker.exportToApi("clryyx7f10004ki5yhdbnhv5y", data); - - expect(result[0]?.name).toBeDefined(); - expect(result[0]?.name).equal(data[0].name); - expect(result[0]?.connectionString).toBeDefined(); - expect(result[0]?.connectionString).equal(data[0].connectionString); - expect(result[0]?.createdBy).toBeDefined(); - expect(result[0]?.createdBy).equal(data[0].createdBy); - - for (const entry of result) { - const deleteResult = await fetch(`${baseUrl}/connections/${entry.id}`, { - method: "DELETE", - headers: headers - }); - const deleteData = await deleteResult.json(); - expect(deleteData.id).equal(entry.id); - }; + const dm = new DataMaker({ apiKey: "k", baseURL: "https://x.test", fetch }); + await expect(dm.sets.list()).rejects.toMatchObject({ status: 504 }); + }); }); -test('Send generated data to API endpoint defined in code', async () => { - const datamaker = new DataMaker({}); - const headers: any = { - "Authorization": process.env["DATAMAKER_API_KEY"], - "Content-type": "application/json", - "Credentials": "omit" - }; - const endpoint: CustomEndpoint = { - method: "POST", - url: `${baseUrl}/connections`, - headers: headers - }; - - const data = await datamaker.generateFromTemplateId("clrupt3c7000218qdcaxh9i9i", 1); - const result: Data[] = await datamaker.exportToApi(endpoint, data); - - expect(result[0]?.name).toBeDefined(); - expect(result[0]?.name).equal(data[0].name); - expect(result[0]?.connectionString).toBeDefined(); - expect(result[0]?.connectionString).equal(data[0].connectionString); - expect(result[0]?.createdBy).toBeDefined(); - expect(result[0]?.createdBy).equal(data[0].createdBy); - - for (const entry of result) { - const deleteResult = await fetch(`${baseUrl}/connections/${entry.id}`, { - method: "DELETE", - headers: headers +describe("resource surface", () => { + it("save is an alias for create, matching datamaker-py's save_set", async () => { + const stub = stubFetch({ body: { id: "s1" } }); + await client({}, stub).sets.save({ name: "golden", data: [{ a: 1 }] }); + + expect(firstCall(stub).init.method).toBe("POST"); + expect(firstCall(stub).url).toBe("https://api.example.test/sets"); + expect(JSON.parse(String(firstCall(stub).init.body))).toEqual({ + name: "golden", + data: [{ a: 1 }], }); - const deleteData = await deleteResult.json(); - expect(deleteData.id).equal(entry.id); - }; -}); + }); -test("Export generated data into DB saved in account", async () => { - const datamaker = new DataMaker({}); - const headers: any = { - "Authorization": process.env["DEV_ACCOUNT_API"], - "Content-type": "application/json", - "Credentials": "omit" - }; - - const data = await datamaker.generateFromTemplateId("cls08ncye0001h7piad743zaa", 1); - await datamaker.exportToDB("clryufquy0001qvvvb4b6tyzz", "Connection", data); - - for (const entry of data) { - const deleteConnection = await fetch(`https://dev.datamaker.app/api/connections/${entry.id}`, { - method: "DELETE", - headers: headers + it("keymap lookup posts, because oldKeys can be large", async () => { + const stub = stubFetch({ body: { mappings: {}, missing: [] } }); + await client({}, stub).keymaps.lookup({ + mapName: "m", + object: "Material", + oldKeys: ["A", "B"], }); - - expect(deleteConnection.status).toBe(200); - const deleteData = await deleteConnection.json(); - expect(deleteData.id).toBe(entry.id); - }; -}); \ No newline at end of file + expect(firstCall(stub).init.method).toBe("POST"); + expect(firstCall(stub).url).toBe("https://api.example.test/keymaps/lookup"); + }); +}); diff --git a/src/index.ts b/src/index.ts index 56081ec..85ce1bd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,282 +1,64 @@ -import { DefaultQuery, Fetch } from "./core"; -import { AccountTemplate, Fields, Template, Endpoint, CustomEndpoint, Data, DBQuery } from "./template"; -import * as Errors from "./error"; -import { readEnv } from "./utils"; -import { fetchDatamaker } from "./utils"; - -interface ClientOptions { - /** - * Defaults to process.env['DATAMAKER_API_KEY']. - */ - apiKey?: string; - - /** - * Override the default base URL for the API, e.g., "https://Core.example.com/v2/" - */ - baseURL?: string; - - /** - * The maximum amount of time (in milliseconds) that the client should wait for a response - * from the server before timing out a single request. - * - * Note that request timeouts are retried by default, so in a worst-case scenario you may wait - * much longer than this timeout before the promise succeeds or fails. - */ - timeout?: number; - - /** - * Specify a custom `fetch` function implementation. - * - * If not provided, we use `node-fetch` on Node.js and otherwise expect that `fetch` is - * defined globally. - */ - fetch?: Fetch | undefined; - - /** - * The maximum number of times that the client will retry a request in case of a - * temporary failure, like a network error or a 5XX error from the server. - * - * @default 2 - */ - maxRetries?: number; - - /** - * Default headers to include with every request to the Core. - * - * These can be removed in individual requests by explicitly setting the - * header to `undefined` or `null` in request options. - */ - defaultHeaders?: HeadersInit; - - /** - * Default query parameters to include with every request to the Core. - * - * These can be removed in individual requests by explicitly setting the - * param to `undefined` in request options. - */ - defaultQuery?: DefaultQuery; +/** + * The official TypeScript client for the DataMaker API. + * + * ```ts + * import { DataMaker } from "@automators/datamaker"; + * + * const dm = new DataMaker({ apiKey: process.env.DATAMAKER_API_KEY }); + * + * const sets = await dm.sets.list(); + * const set = await dm.sets.save({ name: "golden customers", data: rows }); + * const { mappings, missing } = await dm.keymaps.lookup({ + * mapName: "sap-material-migration", + * object: "Material", + * oldKeys: ["OLD-1", "OLD-2"], + * }); + * ``` + * + * Types come from the API's own OpenAPI document, generated into + * `src/generated/schema.ts`. They are not hand-maintained, which is the fix + * for how this package fell 2.5 years behind the API. + */ +import { HttpClient, type ClientOptions } from "./core.js"; +import { + KeyMapsClient, + MaskingPoliciesClient, + PlansClient, + ProjectsClient, + SetsClient, + TemplatesClient, +} from "./resources.js"; + +export class DataMaker { + /** The transport, exposed for endpoints the typed resources do not cover yet. */ + readonly http: HttpClient; + + readonly projects: ProjectsClient; + readonly templates: TemplatesClient; + readonly sets: SetsClient; + readonly keymaps: KeyMapsClient; + readonly maskingPolicies: MaskingPoliciesClient; + readonly plans: PlansClient; + + constructor(options: ClientOptions = {}) { + this.http = new HttpClient(options); + this.projects = new ProjectsClient(this.http); + this.templates = new TemplatesClient(this.http); + this.sets = new SetsClient(this.http); + this.keymaps = new KeyMapsClient(this.http); + this.maskingPolicies = new MaskingPoliciesClient(this.http); + this.plans = new PlansClient(this.http); + } } -// create datamaker class object -class DataMaker { - readonly apiKey: string; - headers: HeadersInit; - options: ClientOptions; - - /** - * API Client for interfacing with the DataMaker Core. - * - * @param {string} [opts.apiKey==process.env['DATAMAKER_API_KEY'] ?? undefined] - * @param {string} [opts.baseURL] - Override the default base URL for the Core. - * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out. - * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections. - * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation. - * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request. - * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the Core. - * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the Core. - */ - constructor({ - apiKey = readEnv("DATAMAKER_API_KEY"), - ...opts - }: ClientOptions = {}) { - if (apiKey === undefined) { - throw new Errors.DataMakerError( - "The DATAMAKER_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new DataMaker({ apiKey: 'My API Key' })." - ); - } - const options: ClientOptions = { - apiKey, - ...opts, - baseURL: opts.baseURL ?? `https://cloud.datamaker.app/api`, - }; - - this.apiKey = apiKey; - this.options = options; - this.headers = { - "Content-Type": "application/json", - Authorization: `${this.apiKey}`, - ...this.options.defaultHeaders, - }; - }; - /** - * Generate data from custom template. - * @param template - * @returns - */ - async generate(template: Template) { - if (!template) { - throw new Errors.DataMakerError( - "You must provide a template to generate data." - ); - }; - - if (!template.quantity) { - template.quantity = 1; - }; - return (await fetchDatamaker(this.options.baseURL, this.headers, template)).json(); - }; - /** - * Generate data using template from you Datamaker account. As arguments provide ID of a template from your account and a number of entries to be generated. - * Requires Datamaker api key to be defined in your project. - * @param templateId - * @param quantity - * @returns - */ - async generateFromTemplateId(templateId: string, quantity: number = 1) { - const url = `${this.options.baseURL}/templates`; - - const fetchTemplate = await fetch(url, { - method: "GET", - headers: this.headers - }); - - const templateData = await fetchTemplate.json(); - let template = templateData.find((temp: AccountTemplate) => temp.id === templateId); - - if (!templateData) { - throw new Errors.DataMakerError( - "No templates found in your account." - ); - }; - - if (!template) { - throw new Errors.DataMakerError( - "You must provide ID of a template from your account." - ); - }; - - template.quantity = quantity; - return (await fetchDatamaker(this.options.baseURL, this.headers, template)).json(); - }; - /** - * Send data to an endpoint. In parameters provide with endpoint compatible data as array of objects - * and with API endpoint either as ID of an endpoint from your account or as an object. - * @param api - * @param data - * @returns - */ - async exportToApi(api: string | CustomEndpoint, data: object[]) { - const url = `${this.options.baseURL}/endpoints`; - let targetEndpoint: Endpoint | CustomEndpoint; - let result: Array<{}> = []; - let headers: any = this.headers; - - if (typeof api == "string") { - const fetchEnpoints = await fetch(url, { - method: "GET", - headers: this.headers - }); - - const endpointData = await fetchEnpoints.json(); - const endpoint = endpointData.find((endpoint: Endpoint) => endpoint.id === api); - targetEndpoint = endpoint; - - if (Object.keys(endpoint.headers).length > 0) { - headers = endpoint.headers; - }; - - } else { - targetEndpoint = api; - if(api.headers) { - headers = api.headers; - }; - }; - - for (const entry of data) { - const apiCall = await fetch(targetEndpoint.url, { - method: targetEndpoint.method, - headers, - body: JSON.stringify(entry) - }); - - const callData = await apiCall.json(); - result.push(callData); - }; - - if (result) return result; - - throw new Errors.DataMakerError( - "Something went wrong." - ); - }; - - /** - * Export data to database saved in your Datamaker account. In parameters provide with DB Bridge connection ID, - * name of database table to export data into and with data to be exported. - * @param connectionId - * @param tableName - * @param data - * @returns - */ - async exportToDB(connectionId: string, tableName: string, data: object[]) { - try { - // Fetch connection details - const fetchConnection = await fetch(`${this.options.baseURL}/connections`, { - method: "GET", - headers: this.headers - }); - - if (!fetchConnection.ok) { - throw new Errors.DataMakerError("Failed to fetch connection details."); - }; - - const connectionsData = await fetchConnection.json(); - const connection = connectionsData.find((db: Data) => db.id === connectionId); - - if (!connection) { - throw new Errors.DataMakerError("Connection not found."); - }; - - // Test connection - const testBody: { connectionString: string, type: string } = { - connectionString: connection.connectionString, - type: connection.type - }; - - const testConnection = await fetch(`${this.options.baseURL}/connections/test`, { - method: "POST", - headers: this.headers, - body: JSON.stringify(testBody) - }); - - if (testConnection.status !== 200) { - throw new Errors.DataMakerError( - "Your connection is not working." - ); - }; - - // Loop through each entry in the data array and construct values to be pushed to DB - let values: string[] = []; - - for (const entry of data) { - const entryValues = Object.values(entry).map(value => `'${value}'`).join(", "); - values.push(`(${entryValues})`); - }; - - const body: DBQuery = { - connectionId: connection.id, - query: `INSERT INTO "${tableName}" (${Object.keys(data[0]!).map(key => `"${key}"`).join(", ")}) VALUES ${values.join(", ")};` - }; - - // Push to DB - const push = await fetch(`${this.options.baseURL}/export/db`, { - method: "POST", - headers: this.headers, - body: JSON.stringify(body) - }); - - if (!push.ok) { - throw new Errors.DataMakerError("Failed to export data to DB."); - }; - - const pushData = await push.json(); - return pushData; - - } catch (error) { - console.log(error); - throw error; - }; - }; -}; - -export { DataMaker, ClientOptions, Fields, Template, CustomEndpoint, Data }; \ No newline at end of file +export { + HttpClient, + DataMakerError, + MissingApiKeyError, + DEFAULT_BASE_URL, +} from "./core.js"; +export type { ClientOptions, RequestOptions, ApiErrorBody } from "./core.js"; +export * from "./resources.js"; +export type { components, paths } from "./generated/schema.js"; + +export default DataMaker; diff --git a/src/resources.ts b/src/resources.ts new file mode 100644 index 0000000..0b7efb3 --- /dev/null +++ b/src/resources.ts @@ -0,0 +1,240 @@ +/** + * The resource clients. + * + * Every type here comes from `generated/schema.ts`, which is generated from + * the API's own `openapi.json`. Nothing in this file restates a field name or + * a nullability: if the API changes, regenerating changes these types, and + * anything that no longer lines up fails to compile. That is the whole point - + * the previous version of this SDK drifted 2.5 years behind precisely because + * its types were hand-copied. + * + * Method names deliberately mirror `datamaker-py` (`list`, `get`, `create`, + * `update`, `delete`, `save`), so the two SDKs read the same way and one set + * of docs covers both. + */ +import type { HttpClient } from "./core.js"; +import type { components } from "./generated/schema.js"; + +type Schemas = components["schemas"]; + +export type Project = Schemas["Project"]; +export type Template = Schemas["Template"]; +export type Set = Schemas["Set"]; +export type SetDetail = Schemas["SetDetail"]; +export type MaskingPolicy = Schemas["MaskingPolicy"]; +export type Plan = Schemas["Plan"]; +export type KeyMapSummary = Schemas["KeyMapSummary"]; +export type KeyMapEntry = Schemas["KeyMapEntry"]; +export type KeyMapEntriesPage = Schemas["KeyMapEntriesPage"]; +export type KeyMapLookupResult = Schemas["KeyMapLookupResult"]; +export type KeyMapUpsertResult = Schemas["KeyMapUpsertResult"]; +export type DeletedResult = Schemas["DeletedResult"]; + +/** Scope a list call to one project. Most keys already imply one. */ +export interface ListOptions { + projectId?: string; +} + +export class ProjectsClient { + constructor(private readonly http: HttpClient) {} + + list() { + return this.http.get("/projects"); + } + get(id: string) { + return this.http.get(`/projects/${encodeURIComponent(id)}`); + } + create(body: { name: string; description?: string; avatar?: string }) { + return this.http.post("/projects", body); + } + update(id: string, body: Partial<{ name: string; description: string; avatar: string }>) { + return this.http.put(`/projects/${encodeURIComponent(id)}`, body); + } + delete(id: string) { + return this.http.delete(`/projects/${encodeURIComponent(id)}`); + } +} + +export class TemplatesClient { + constructor(private readonly http: HttpClient) {} + + list(options: ListOptions = {}) { + return this.http.get("/templates", { query: { ...options } }); + } + get(id: string) { + return this.http.get