diff --git a/.gitignore b/.gitignore index 37679659..5f544cd0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +# Claude Code + +.claude/ +CLAUDE.md + # Macs .DS_Store diff --git a/.npmrc b/.npmrc index f8b3d7de..e662682d 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ auto-install-peers=true -engine-strict=true +engine-strict=false diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 3de7a63e..ba18d021 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -66,36 +66,32 @@ export default defineConfig({ starlightOpenAPI([ { base: 'apis/resource-server', - schema: - '../open-payments-specifications/openapi/resource-server.yaml', + schema: './public/specs/resource-server.yaml', sidebar: { label: 'Open Payments' } }, { base: 'es/apis/resource-server', - schema: - '../open-payments-specifications/openapi/resource-server.yaml', + schema: './public/specs/resource-server.yaml', sidebar: { label: 'Open Payments' } }, { base: 'apis/wallet-address-server', - schema: - '../open-payments-specifications/openapi/wallet-address-server.yaml', + schema: './public/specs/wallet-address-server.yaml', sidebar: { label: 'Wallet Addresses' } }, { base: 'es/apis/wallet-address-server', - schema: - '../open-payments-specifications/openapi/wallet-address-server.yaml', + schema: './public/specs/wallet-address-server.yaml', sidebar: { label: 'Wallet Addresses' } }, { base: 'apis/auth-server', - schema: '../open-payments-specifications/openapi/auth-server.yaml', + schema: './public/specs/auth-server.yaml', sidebar: { label: 'Open Payments Authorization Server' } }, { base: 'es/apis/auth-server', - schema: '../open-payments-specifications/openapi/auth-server.yaml', + schema: './public/specs/auth-server.yaml', sidebar: { label: 'Open Payments Authorization Server' } } ]), @@ -104,7 +100,9 @@ export default defineConfig({ errorOnFallbackPages: false, exclude: [ '/apis/{auth-server,resource-server,wallet-address-server}/**/*', - '/es/apis/{auth-server,resource-server,wallet-address-server}/**/*' + '/es/apis/{auth-server,resource-server,wallet-address-server}/**/*', + '/apis/scalar/**', + '/apis/redoc/**' ] }), starlightFullViewMode() @@ -398,6 +396,52 @@ export default defineConfig({ } ] }, + { + label: 'Demo: Spec improvements', + link: '/resources/spec-improvements' + }, + { + label: 'Demo: Redoc', + collapsed: false, + items: [ + { + label: 'Resource Server', + link: '/apis/redoc/resource-server', + attrs: { target: '_blank', rel: 'noopener noreferrer' } + }, + { + label: 'Auth Server', + link: '/apis/redoc/auth-server', + attrs: { target: '_blank', rel: 'noopener noreferrer' } + }, + { + label: 'Wallet Address Server', + link: '/apis/redoc/wallet-address-server', + attrs: { target: '_blank', rel: 'noopener noreferrer' } + } + ] + }, + { + label: 'Demo: Scalar', + collapsed: false, + items: [ + { + label: 'Resource Server', + link: '/apis/scalar/resource-server', + attrs: { target: '_blank', rel: 'noopener noreferrer' } + }, + { + label: 'Auth Server', + link: '/apis/scalar/auth-server', + attrs: { target: '_blank', rel: 'noopener noreferrer' } + }, + { + label: 'Wallet Address Server', + link: '/apis/scalar/wallet-address-server', + attrs: { target: '_blank', rel: 'noopener noreferrer' } + } + ] + }, { label: 'API specifications', collapsed: true, diff --git a/docs/package.json b/docs/package.json index 9b56031c..6784a5f8 100644 --- a/docs/package.json +++ b/docs/package.json @@ -8,12 +8,15 @@ "build": "astro build", "preview": "astro preview", "astro": "astro", + "build:redoc": "redocly build-docs public/specs/resource-server.yaml --output public/apis/redoc/resource-server/index.html && redocly build-docs public/specs/auth-server.yaml --output public/apis/redoc/auth-server/index.html && redocly build-docs public/specs/wallet-address-server.yaml --output public/apis/redoc/wallet-address-server/index.html", "format": "prettier --write '**/*.{js,mjs,ts,tsx,json,md,mdx,astro}' && eslint --max-warnings=0 --fix .", "lint": "prettier --check '**/*.{js,mjs,ts,tsx,json,md,mdx,astro}' && eslint --max-warnings=0 . " }, "dependencies": { "@astrojs/starlight": "^0.37.4", "@interledger/docs-design-system": "^0.11.0", + "@scalar/astro": "^0.2.4", + "@scalar/core": "^0.4.4", "astro": "5.17.1", "katex": "^0.16.28", "mermaid": "^11.12.2", @@ -28,6 +31,7 @@ "devDependencies": { "@eslint/js": "^9.39.2", "@prettier/plugin-php": "^0.24.0", + "@redocly/cli": "^2.24.1", "@typescript-eslint/parser": "^8.54.0", "astro-eslint-parser": "^1.2.2", "eslint": "^9.39.2", diff --git a/docs/public/apis/redoc/auth-server/index.html b/docs/public/apis/redoc/auth-server/index.html new file mode 100644 index 00000000..be91f91f --- /dev/null +++ b/docs/public/apis/redoc/auth-server/index.html @@ -0,0 +1,541 @@ + + + + + + Open Payments Authorization Server + + + + + + + + + +

Open Payments Authorization Server (1.3.0)

Download OpenAPI specification:

E-mail: tech@interledger.org License: Apache-2.0

Open Payments Authorization Server

+

The authorization server handles grant requests and access token management for the Open Payments protocol, using GNAP (Grant Negotiation and Authorization Protocol).

+

Endpoints:

+
    +
  • POST / — initiate a grant request
  • +
  • POST /continue/{id} — continue a pending grant request
  • +
  • DELETE /continue/{id} — cancel a pending grant request
  • +
  • POST /token/{id} — rotate an access token
  • +
  • DELETE /token/{id} — revoke an access token
  • +
+

For an overview of how Open Payments authorization works, see the Authorization concepts page.

+

grant

Grant operations

+

Grant Request

Make a new grant request

+
Request Body schema: application/json
required
Any of
required
client (string) or client (object) or client (object) (client)
object (interact-request)

The client instance declares the parameters for interaction methods that it can support using the interact field.

+
required
object
object (subject)

Information about the subject for which the client is requesting information.

+

Responses

Request samples

Content type
application/json
Example
{}

Response samples

Content type
application/json
Example
{}

Continuation Request

Continue a grant request during or after user interaction.

+
Authorizations:
GNAP
path Parameters
id
required
string

The unique reference ID of the grant request continuation.

+
Request Body schema: application/json
interact_ref
string

The interaction reference generated for this +interaction by the AS.

+

Responses

Request samples

Content type
application/json
{
  • "interact_ref": "ad82597c-bbfa-4eb0-b72e-328e005b8689"
}

Response samples

Content type
application/json
Example
{}

Cancel Grant

Cancel a grant request or delete a grant client side.

+
Authorizations:
GNAP
path Parameters
id
required
string

The unique reference ID of the grant request continuation.

+

Responses

Response samples

Content type
application/json
Example
{
  • "error": {
    }
}

token

Token operations

+

Rotate Access Token

Management endpoint to rotate access token.

+
Authorizations:
GNAP
path Parameters
id
required
string

The unique reference of the access token to be managed.

+

Responses

Response samples

Content type
application/json
{}

Revoke Access Token

Management endpoint to revoke access token.

+
Authorizations:
GNAP
path Parameters
id
required
string

The unique reference of the access token to be managed.

+

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}
+ + + + diff --git a/docs/public/apis/redoc/resource-server/index.html b/docs/public/apis/redoc/resource-server/index.html new file mode 100644 index 00000000..f0f94cdb --- /dev/null +++ b/docs/public/apis/redoc/resource-server/index.html @@ -0,0 +1,720 @@ + + + + + + Open Payments + + + + + + + + + +

Open Payments (1.3.0)

Download OpenAPI specification:

E-mail: tech@interledger.org License: Apache-2.0

An API for open access to financial accounts to send and receive payments.

+

The resource server manages the core transaction resources of the Open Payments protocol: incoming payments, outgoing payments, and quotes. All resources are scoped to a wallet address and require an access token issued by the authorization server.

+

Endpoints:

+
    +
  • /incoming-payments — create and manage incoming payments
  • +
  • /outgoing-payments — create and manage outgoing payment instructions
  • +
  • /quotes — request a quote for a specific send or receive amount
  • +
+

For a full overview of these resources, see the Resources concepts page.

+

incoming-payment

incoming payment operations

+

Create an Incoming Payment

A client MUST create an incoming payment resource before it is possible to send any payments to the wallet address.

+

When a client creates an incoming payment the receiving Account Servicing Entity generates unique payment details that can be used to address payments to the account and returns these details to the client as properties of the new incoming payment. Any payments received using those details are then associated with the incoming payment.

+

All of the input parameters are optional.

+

For example, the client could use the metadata property to store an external reference on the incoming payment and this can be shared with the account holder to assist with reconciliation.

+

If incomingAmount is specified and the total received using the payment details equals or exceeds the specified incomingAmount, then the receiving Account Servicing Entity MUST reject any further payments and set completed to true.

+

If an expiresAt value is defined, and the current date and time on the receiving Account Servicing Entity's systems exceeds that value, the receiving Account Servicing Entity MUST reject any further payments.

+
Authorizations:
GNAP
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+
Request Body schema: application/json
required

A subset of the incoming payments schema is accepted as input to create a new incoming payment.

+

The incomingAmount must use the same assetCode and assetScale as the wallet address.

+
walletAddress
required
string <uri> (walletAddress)

The URL of an Open Payments wallet address

+
object (amount)

The maximum amount that should be paid into the wallet address under this incoming payment.

+
expiresAt
string <date-time>

The date and time when payments into the incoming payment must no longer be accepted.

+
object

Additional metadata associated with the incoming payment. (Optional)

+

Responses

Request samples

Content type
application/json
{
  • "incomingAmount": {
    },
  • "metadata": {
    }
}

Response samples

Content type
application/json
{}

List Incoming Payments

List all incoming payments on the wallet address

+
Authorizations:
GNAP
query Parameters
wallet-address
required
string

URL of a wallet address hosted by a Rafiki instance.

+
cursor
string non-empty

The cursor key to list from.

+
first
integer [ 1 .. 100 ]

The number of items to return after the cursor.

+
last
integer [ 1 .. 100 ]

The number of items to return before the cursor.

+
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+

Responses

Response samples

Content type
application/json
Example
{}

Get an Incoming Payment

A client can fetch the latest state of an incoming payment to determine the amount received into the wallet address.

+
Authorizations:
GNAP
path Parameters
id
required
string

Sub-resource identifier

+
header Parameters
Signature-Input
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+

Responses

Response samples

Content type
application/json
{}

Complete an Incoming Payment

A client with the appropriate permissions MAY mark a non-expired incoming payment as completed indicating that the client is not going to make any further payments toward this incoming payment, even though the full incomingAmount may not have been received.

+

This indicates to the receiving Account Servicing Entity that it can begin any post processing of the payment such as generating account statements or notifying the account holder of the completed payment.

+
Authorizations:
GNAP
path Parameters
id
required
string

Sub-resource identifier

+
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+

Responses

Response samples

Content type
application/json
{}

outgoing-payment

outgoing payment operations

+

Create an Outgoing Payment

An outgoing payment is a sub-resource of a wallet address. It represents a payment from the wallet address.

+

Once created, it is already authorized and SHOULD be processed immediately. If payment fails, the Account Servicing Entity must mark the outgoing payment as failed.

+
Authorizations:
GNAP
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+
Request Body schema: application/json
required

A subset of the outgoing payments schema is accepted as input to create a new outgoing payment.

+

The debitAmount must use the same assetCode and assetScale as the wallet address.

+

Either provide a quoteId to create an outgoing payment based on a quote or provide incomingPayment and debitAmount to create an outgoing payment directly from an incoming payment.

+
One of
walletAddress
required
string <uri> (walletAddress)

The URL of an Open Payments wallet address

+
quoteId
required
string <uri>

The URL of the quote defining this payment's amounts.

+
object

Additional metadata associated with the outgoing payment. (Optional)

+

Responses

Request samples

Content type
application/json
Example
{}

Response samples

Content type
application/json
{}

List Outgoing Payments

List all outgoing payments on the wallet address

+
Authorizations:
GNAP
query Parameters
wallet-address
required
string

URL of a wallet address hosted by a Rafiki instance.

+
cursor
string non-empty

The cursor key to list from.

+
first
integer [ 1 .. 100 ]

The number of items to return after the cursor.

+
last
integer [ 1 .. 100 ]

The number of items to return before the cursor.

+
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+

Responses

Response samples

Content type
application/json
Example
{}

Get an Outgoing Payment

A client can fetch the latest state of an outgoing payment.

+
Authorizations:
GNAP
path Parameters
id
required
string

Sub-resource identifier

+
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+

Responses

Response samples

Content type
application/json
{}

Get spent amounts for current outgoing payment grant

Returns the spent amounts for the current outgoing payment grant corresponding to the presented GNAP access token, if any. If a grant was created with an interval (recurring), the amounts returned are for the current interval.

+
Authorizations:
GNAP
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+

Responses

Response samples

Content type
application/json
Example
{
  • "spentReceiveAmount": {
    },
  • "spentDebitAmount": {
    }
}

quote

quote operations

+

Create a Quote

A quote is a sub-resource of a wallet address. It represents a quote for a payment from the wallet address.

+
Authorizations:
GNAP
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+
Request Body schema: application/json
required

A subset of the quotes schema is accepted as input to create a new quote.

+

The quote must be created with a (debitAmount xor receiveAmount) unless the receiver is an Incoming Payment which has an incomingAmount.

+
One of
walletAddress
required
string <uri> (walletAddress)

The URL of an Open Payments wallet address

+
receiver
required
string <uri> (receiver) ^(https|http)://(.+)/incoming-payments/(.+)$

The URL of the incoming payment that is being paid.

+
method
required
string (payment-method)
Value: "ilp"

Responses

Request samples

Content type
application/json
Example

Response samples

Content type
application/json
{}

Get a Quote

A client can fetch the latest state of a quote.

+
Authorizations:
GNAP
path Parameters
id
required
string

Sub-resource identifier

+
header Parameters
Signature-Input
required
string
Examples: Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"

The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member's key is the label that uniquely identifies the message signature within the context of the HTTP message. The member's value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See ietf-httpbis-message-signatures for more details.

+
Signature
required
string
Examples: Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:

The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.

+

Responses

Response samples

Content type
application/json
{}
+ + + + diff --git a/docs/public/apis/redoc/wallet-address-server/index.html b/docs/public/apis/redoc/wallet-address-server/index.html new file mode 100644 index 00000000..7b3c4e47 --- /dev/null +++ b/docs/public/apis/redoc/wallet-address-server/index.html @@ -0,0 +1,387 @@ + + + + + + Wallet Address API + + + + + + + + + +

Wallet Address API (1.3.0)

Download OpenAPI specification:

E-mail: tech@interledger.org License: Apache-2.0

The wallet address server exposes publicly accessible information about an Open Payments wallet address, including basic account details and the cryptographic keys used to verify requests from this wallet address.

+

Endpoints:

+
    +
  • GET / — retrieve public details for a wallet address
  • +
  • GET /jwks.json — retrieve the JSON Web Key Set (JWKS) for a wallet address
  • +
+

For an overview of wallet addresses and how they work in Open Payments, see the Wallet addresses concepts page.

+

wallet-address

wallet address operations

+

Get a Wallet Address

Retrieve the public information of the Wallet Address.

+

This endpoint should be open to anonymous requests as it allows clients to verify a Wallet Address URL and get the basic information required to construct new transactions and discover the grant request URL.

+

The content should be slow changing and cacheable for long periods. Servers SHOULD use cache control headers.

+

Responses

Response samples

Content type
application/json
{}

Get the keys bound to a Wallet Address

Retrieve the public keys of the Wallet Address.

+

Responses

Response samples

Content type
application/json
No sample
+ + + + diff --git a/docs/public/specs/auth-server.yaml b/docs/public/specs/auth-server.yaml new file mode 100644 index 00000000..52edbb65 --- /dev/null +++ b/docs/public/specs/auth-server.yaml @@ -0,0 +1,903 @@ +openapi: 3.1.0 +info: + title: Open Payments Authorization Server + version: '1.3.0' + license: + name: Apache 2.0 + identifier: Apache-2.0 + summary: Open Payments Authorization Server + description: |- + The authorization server handles grant requests and access token management for the Open Payments protocol, using [GNAP](https://datatracker.ietf.org/doc/html/draft-ietf-gnap-core-protocol) (Grant Negotiation and Authorization Protocol). + + **Endpoints:** + - `POST /` — initiate a grant request + - `POST /continue/{id}` — continue a pending grant request + - `DELETE /continue/{id}` — cancel a pending grant request + - `POST /token/{id}` — rotate an access token + - `DELETE /token/{id}` — revoke an access token + + For an overview of how Open Payments authorization works, see [the Authorization concepts page](https://openpayments.dev/concepts/auth). + contact: + email: tech@interledger.org +servers: + - url: 'https://auth.interledger-test.dev' +tags: + - name: grant + description: Grant operations + - name: token + description: Token operations +paths: + /: + post: + summary: Grant Request + operationId: post-request + responses: + '200': + description: OK + content: + application/json: + schema: + oneOf: + - title: 'Pending interaction' + properties: + interact: + $ref: '#/components/schemas/interact-response' + continue: + $ref: '#/components/schemas/continue' + required: + - interact + - continue + - title: 'Approved' + properties: + access_token: + $ref: '#/components/schemas/access_token' + continue: + $ref: '#/components/schemas/continue' + required: + - access_token + - continue + type: object + examples: + Interaction instructions: + value: + interact: + redirect: 'https://auth.interledger-test.dev/4CF492MLVMSW9MKMXKHQ' + finish: 4105340a-05eb-4290-8739-f9e2b463bfa7 + continue: + access_token: + value: 33OMUKMKSKU80UPRY5NM + uri: 'https://auth.interledger-test.dev/continue/4CF492MLVMSW9MKMXKHQ' + wait: 30 + Grant: + value: + access_token: + value: OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0 + manage: 'https://auth.interledger-test.dev/token/dd17a202-9982-4ed9-ae31-564947fb6379' + expires_in: 3600 + access: + - type: incoming-payment + actions: + - create + - read + identifier: 'https://ilp.interledger-test.dev/bob' + continue: + access_token: + value: 33OMUKMKSKU80UPRY5NM + uri: 'https://auth.interledger-test.dev/continue/4CF492MLVMSW9MKMXKHQ' + '400': + description: Bad Request + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/error-invalid-request' + - $ref: '#/components/schemas/error-invalid-client' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/error-invalid-client' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error-request-denied' + requestBody: + content: + application/json: + schema: + anyOf: + - title: with Access Token + type: object + properties: + client: + $ref: '#/components/schemas/client' + interact: + $ref: '#/components/schemas/interact-request' + access_token: + type: object + required: [access] + properties: + access: + $ref: '#/components/schemas/access' + subject: + $ref: '#/components/schemas/subject' + required: [client, access_token] + - title: with Subject + type: object + properties: + client: + $ref: '#/components/schemas/client' + interact: + $ref: '#/components/schemas/interact-request' + access_token: + type: object + required: [access] + properties: + access: + $ref: '#/components/schemas/access' + subject: + $ref: '#/components/schemas/subject' + required: [client, interact, subject] + examples: + Grant request for creating and reading recurring fixed payment: + value: + access_token: + access: + - type: outgoing-payment + actions: + - create + - read + identifier: 'https://ilp.interledger-test.dev/alice' + limits: + receiver: 'https://ilp.interledger-test.dev/incoming-payments/45a0d0ee-26dc-4c66-89e0-01fbf93156f7' + interval: 'R12/2019-08-24T14:15:22Z/P1M' + debitAmount: + value: '500' + assetCode: USD + assetScale: 2 + client: 'https://webmonize.com/.well-known/pay' + interact: + start: + - redirect + finish: + method: redirect + uri: 'https://webmonize.com/return/876FGRD8VC' + nonce: 4edb2194-dbdf-46bb-9397-d5fd57b7c8a7 + Grant request for creating and reading incoming payments: + value: + access_token: + access: + - type: incoming-payment + actions: + - create + - read + identifier: 'http://ilp.interledger-test.dev/bob' + client: 'https://webmonize.com/.well-known/pay' + Grant request with directed identity (JWK): + value: + access_token: + access: + - type: incoming-payment + actions: + - create + - read + identifier: 'http://ilp.interledger-test.dev/bob' + client: + jwk: + kid: example-key-1 + alg: EdDSA + use: sig + kty: OKP + crv: Ed25519 + x: 11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo + Grant request for subject information: + value: + subject: + sub_ids: + - id: 'https://ilp.interledger-test.dev/alice' + format: 'uri' + client: 'https://webmonize.com/.well-known/pay' + interact: + start: + - redirect + finish: + method: redirect + uri: 'https://webmonize.com/return/876FGRD8VC' + nonce: 4edb2194-dbdf-46bb-9397-d5fd57b7c8a7 + description: '' + required: true + description: Make a new grant request + security: [] + tags: + - grant + parameters: [] + '/continue/{id}': + parameters: + - schema: + type: string + name: id + in: path + required: true + description: The unique reference ID of the grant request continuation. + post: + summary: Continuation Request + operationId: post-continue + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + properties: + access_token: + $ref: '#/components/schemas/access_token' + subject: + $ref: '#/components/schemas/subject' + continue: + $ref: '#/components/schemas/continue' + required: + - continue + examples: + Continuing after a completed interaction (returning access token): + value: + access_token: + value: OS9M2PMHKUR64TB8N6BW7OZB8CDFONP219RP1LT0 + manage: 'https://auth.interledger-test.dev/token/dd17a202-9982-4ed9-ae31-564947fb6379' + expires_in: 3600 + access: + - type: outgoing-payment + actions: + - create + - read + identifier: 'https://ilp.interledger-test.dev/alice' + limits: + receiver: 'https://ilp.interledger-test.dev/bob/incoming-payments/48884225-b393-4872-90de-1b737e2491c2' + interval: 'R12/2019-08-24T14:15:22Z/P1M' + debitAmount: + value: '500' + assetCode: USD + assetScale: 2 + continue: + access_token: + value: 33OMUKMKSKU80UPRY5NM + uri: 'https://auth.interledger-test.dev/continue/4CF492MLVMSW9MKMXKHQ' + wait: 30 + Continuing after a completed interaction (returning subject information): + value: + subject: + sub_ids: + - id: 'https://ilp.interledger-test.dev/alice' + format: uri + continue: + access_token: + value: 33OMUKMKSKU80UPRY5NM + uri: 'https://auth.interledger-test.dev/continue/4CF492MLVMSW9MKMXKHQ' + wait: 30 + Continuing during pending interaction: + value: + continue: + access_token: + value: 33OMUKMKSKU80UPRY5NM + uri: 'https://auth.interledger-test.dev/continue/4CF492MLVMSW9MKMXKHQ' + wait: 30 + '400': + description: Bad Request + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/error-too-fast' + - $ref: '#/components/schemas/error-invalid-client' + '401': + description: Unauthorized + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/error-invalid-client' + - $ref: '#/components/schemas/error-invalid-continuation' + - $ref: '#/components/schemas/error-request-denied' + '404': + description: Not Found + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/error-invalid-continuation' + - $ref: '#/components/schemas/error-invalid-request' + requestBody: + content: + application/json: + schema: + type: object + properties: + interact_ref: + type: string + description: |- + The interaction reference generated for this + interaction by the AS. + examples: + Interaction Reference: + value: + interact_ref: ad82597c-bbfa-4eb0-b72e-328e005b8689 + description: Continue a grant request during or after user interaction. + tags: + - grant + delete: + summary: Cancel Grant + operationId: delete-continue + responses: + '204': + description: No Content + '401': + description: Unauthorized + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/error-invalid-client' + - $ref: '#/components/schemas/error-invalid-continuation' + - $ref: '#/components/schemas/error-invalid-request' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/error-invalid-request' + description: Cancel a grant request or delete a grant client side. + tags: + - grant + '/token/{id}': + parameters: + - schema: + type: string + name: id + in: path + required: true + description: The unique reference of the access token to be managed. + post: + summary: Rotate Access Token + operationId: post-token + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + access_token: + $ref: '#/components/schemas/access_token' + required: + - access_token + examples: + New access token: + value: + access_token: + value: OZB8CDFONP219RP1LT0OS9M2PMHKUR64TB8N6BW7 + manage: 'https://auth.interledger-test.dev/token/8f69de01-5bf9-4603-91ed-eeca101081f1' + expires_in: 3600 + access: + - type: outgoing-payment + actions: + - create + - read + identifier: 'https://ilp.interledger-test.dev/alice' + limits: + interval: 'R12/2019-08-24T14:15:22Z/P1M' + receiver: 'https://ilp.interledger-test.dev/bob/incoming-payments/48884225-b393-4872-90de-1b737e2491c2' + debitAmount: + value: '500' + assetCode: USD + assetScale: 2 + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/error-invalid-rotation' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/error-invalid-client' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/error-invalid-rotation' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error-request-denied' + description: Management endpoint to rotate access token. + tags: + - token + delete: + summary: Revoke Access Token + operationId: delete-token + description: Management endpoint to revoke access token. + responses: + '204': + description: No Content + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/error-invalid-client' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error-request-denied' + tags: + - token +components: + schemas: + amount: + title: amount + type: object + properties: + value: + type: string + format: uint64 + description: 'The value is an unsigned 64-bit integer amount, represented as a string.' + assetCode: + title: Asset code + type: string + description: The assetCode is a code that indicates the underlying asset. An ISO4217 currency code should be used whenever possible. The ISO4217 representation of the US Dollar is USD. + assetScale: + title: Asset scale + type: integer + minimum: 0 + maximum: 255 + description: The number of decimal places that defines the scale of the smallest divisible unit for the given asset code. It determines how an integer amount is scaled to derive the actual monetary value. For example, USD has an asset scale of 2 with the smallest unit being 0.01. An integer amount of `1000` with an `assetCode` of `USD` and `assetScale` of `2` translates to $10.00. + required: + - value + - assetCode + - assetScale + receiver: + title: Receiver + type: string + description: The URL of the incoming payment that is being paid. + format: uri + pattern: '^(https|http)://(.+)/incoming-payments/(.+)$' + examples: + - 'https://ilp.interledger-test.dev/incoming-payments/08394f02-7b7b-45e2-b645-51d04e7c330c' + - 'http://ilp.interledger-test.dev/incoming-payments/08394f02-7b7b-45e2-b645-51d04e7c330c' + - 'https://ilp.interledger-test.dev/incoming-payments/1' + access: + type: array + description: A description of the rights associated with this access token. + items: + $ref: '#/components/schemas/access-item' + uniqueItems: true + maxItems: 3 + access-item: + oneOf: + - $ref: '#/components/schemas/access-incoming' + - $ref: '#/components/schemas/access-outgoing' + - $ref: '#/components/schemas/access-quote' + description: The access associated with the access token is described using objects that each contain multiple dimensions of access. + unevaluatedProperties: false + access-incoming: + title: access-incoming + type: object + properties: + type: + type: string + enum: + - incoming-payment + description: The type of resource request as a string. This field defines which other fields are allowed in the request object. + actions: + type: array + description: The types of actions the client instance will take at the RS as an array of strings. + items: + type: string + enum: + - create + - complete + - read + - read-all + - list + - list-all + uniqueItems: true + identifier: + type: string + format: uri + description: A string identifier indicating a specific resource at the RS. + required: + - type + - actions + access-outgoing: + title: access-outgoing + type: object + properties: + type: + type: string + enum: + - outgoing-payment + description: The type of resource request as a string. This field defines which other fields are allowed in the request object. + actions: + type: array + description: The types of actions the client instance will take at the RS as an array of strings. + items: + type: string + enum: + - create + - read + - read-all + - list + - list-all + uniqueItems: true + identifier: + type: string + format: uri + description: A string identifier indicating a specific resource at the RS. + limits: + $ref: '#/components/schemas/limits-outgoing' + required: + - type + - actions + - identifier + access-quote: + title: access-quote + type: object + properties: + type: + type: string + enum: + - quote + description: The type of resource request as a string. This field defines which other fields are allowed in the request object. + actions: + type: array + description: The types of actions the client instance will take at the RS as an array of strings. + items: + type: string + enum: + - create + - read + - read-all + uniqueItems: true + required: + - type + - actions + access_token: + title: access_token + type: object + description: A single access token or set of access tokens that the client instance can use to call the RS on behalf of the RO. + properties: + value: + type: string + description: The value of the access token as a string. The value is opaque to the client instance. The value SHOULD be limited to ASCII characters to facilitate transmission over HTTP headers within other protocols without requiring additional encoding. + manage: + type: string + format: uri + description: The management URI for this access token. This URI MUST NOT include the access token value and SHOULD be different for each access token issued in a request. + expires_in: + type: integer + description: The number of seconds in which the access will expire. The client instance MUST NOT use the access token past this time. An RS MUST NOT accept an access token past this time. + access: + $ref: '#/components/schemas/access' + required: + - value + - manage + - access + additionalProperties: false + client: + title: client + description: |- + Client identification for grant requests. + + When sending a non-continuation request to the AS, the client instance MUST identify itself by including the client field of the request and by signing the request. + + Can be either: + - A wallet address string (backwards compatible format) + - An object with either `jwk` (for directed identity) or `walletAddress` (mutually exclusive) + + When using a wallet address string or the `walletAddress` property: + A JSON Web Key Set document, including the public key that the client instance will use to protect this request and any continuation requests at the AS and any user-facing information about the client instance used in interactions, MUST be available at the wallet address + `/jwks.json` url. + + When using the `jwk` property (directed identity approach): + The client instance provides its public key directly in the request, eliminating the need for the AS to fetch it from a wallet address. This approach enhances privacy by not requiring the client to expose a persistent wallet address identifier. The `jwk` property can only be used for non-interactive grant requests (i.e.: incoming payments). + + If sending a grant initiation request that requires RO interaction, the wallet address MUST serve necessary client display information. + oneOf: + - title: 'Wallet address string (deprecated)' + type: string + format: uri + description: 'DEPRECATED: This string format of the client wallet address is maintained only for backwards compatibility. Migrate to the object form with `jwk` or `walletAddress`.' + deprecated: true + - title: 'Wallet address object' + type: object + required: [walletAddress] + properties: + walletAddress: + type: string + format: uri + description: Wallet address of the client instance that is making this request. + additionalProperties: false + - title: 'Directed identity (JWK)' + type: object + required: [jwk] + properties: + jwk: + $ref: '#/components/schemas/json-web-key' + additionalProperties: false + continue: + title: continue + type: object + description: 'If the AS determines that the request can be continued with additional requests, it responds with the continue field.' + properties: + access_token: + type: object + description: 'A unique access token for continuing the request, called the "continuation access token".' + required: + - value + properties: + value: + type: string + uri: + type: string + format: uri + description: The URI at which the client instance can make continuation requests. + wait: + type: integer + description: The amount of time in integer seconds the client instance MUST wait after receiving this request continuation response and calling the continuation URI. + required: + - access_token + - uri + interact-request: + title: interact + type: object + properties: + start: + type: array + description: Indicates how the client instance can start an interaction. + items: + type: string + enum: + - redirect + finish: + type: object + description: Indicates how the client instance can receive an indication that interaction has finished at the AS. + properties: + method: + type: string + enum: + - redirect + description: The callback method that the AS will use to contact the client instance. + uri: + type: string + format: uri + description: Indicates the URI that the AS will either send the RO to after interaction or send an HTTP POST request. + nonce: + type: string + description: 'Unique value to be used in the calculation of the "hash" query parameter sent to the callback URI, must be sufficiently random to be unguessable by an attacker. MUST be generated by the client instance as a unique value for this request.' + required: + - method + - uri + - nonce + required: + - start + description: The client instance declares the parameters for interaction methods that it can support using the interact field. + interact-response: + title: interact-response + type: object + properties: + redirect: + type: string + format: uri + description: The URI to direct the end user to. + finish: + type: string + description: Unique key to secure the callback. + required: + - redirect + - finish + interval: + title: Interval + type: string + description: '[ISO8601 repeating interval](https://en.wikipedia.org/wiki/ISO_8601#Repeating_intervals)' + examples: + - 'R11/2022-08-24T14:15:22Z/P1M' + - 'R/2017-03-01T13:00:00Z/2018-05-11T15:30:00Z' + - 'R-1/P1Y2M10DT2H30M/2022-05-11T15:30:00Z' + limits-outgoing: + title: limits-outgoing + description: Open Payments specific property that defines the limits under which outgoing payments can be created. + anyOf: + - title: 'No amount limit' + type: object + properties: + receiver: + $ref: '#/components/schemas/receiver' + interval: + $ref: '#/components/schemas/interval' + - title: 'Debit amount limit' + type: object + properties: + receiver: + $ref: '#/components/schemas/receiver' + interval: + $ref: '#/components/schemas/interval' + debitAmount: + description: 'All amounts are maxima, i.e. multiple payments can be created under a grant as long as the total amounts of these payments do not exceed the maximum amount per interval as specified in the grant.' + $ref: '#/components/schemas/amount' + required: + - debitAmount + - title: 'Receive amount limit' + type: object + properties: + receiver: + $ref: '#/components/schemas/receiver' + interval: + $ref: '#/components/schemas/interval' + receiveAmount: + description: 'All amounts are maxima, i.e. multiple payments can be created under a grant as long as the total amounts of these payments do not exceed the maximum amount per interval as specified in the grant.' + $ref: '#/components/schemas/amount' + required: + - receiveAmount + error-invalid-client: + title: Invalid client + type: object + properties: + error: + type: object + properties: + description: + type: string + code: + type: string + enum: + - invalid_client + error-invalid-request: + title: Invalid request + type: object + properties: + error: + type: object + properties: + description: + type: string + code: + type: string + enum: + - invalid_request + error-request-denied: + title: Request denied + type: object + properties: + error: + type: object + properties: + description: + type: string + code: + type: string + enum: + - request_denied + error-too-fast: + title: Too fast + type: object + properties: + error: + type: object + properties: + description: + type: string + code: + type: string + enum: + - too_fast + error-invalid-continuation: + title: Invalid continuation + type: object + properties: + error: + type: object + properties: + description: + type: string + code: + type: string + enum: + - invalid_continuation + error-invalid-rotation: + title: Invalid rotation + type: object + properties: + error: + type: object + properties: + description: + type: string + code: + type: string + enum: + - invalid_rotation + subject: + title: subject + type: object + description: Information about the subject for which the client is requesting information. + properties: + sub_ids: + type: array + description: A list of subject identifiers. + items: + type: object + properties: + id: + type: string + description: Specific identifier for the subject for which the client is requesting information. + format: + type: string + description: The format of subject identifier that the client can accept. + enum: + - uri + required: + - id + - format + minItems: 1 + maxItems: 1 + required: + - sub_ids + json-web-key: + type: object + properties: + kid: + type: string + alg: + type: string + description: 'The cryptographic algorithm family used with the key. The only allowed value is `EdDSA`. ' + enum: + - EdDSA + use: + type: string + enum: + - sig + kty: + type: string + enum: + - OKP + crv: + description: 'The cryptographic curve used with the key. This parameter identifies the elliptic curve (for EC keys) or the Edwards curve (for OKP keys). The only allowed value is `Ed25519`.' + type: string + enum: + - Ed25519 + x: + type: string + pattern: '^[a-zA-Z0-9-_]+$' + description: The base64 url-encoded public key. + required: + - kid + - alg + - kty + - crv + - x + title: Ed25519 Public Key + description: A JWK representation of an Ed25519 Public Key + examples: + - kid: key-1 + alg: EdDSA + use: sig + kty: OKP + crv: Ed25519 + x: 11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo + securitySchemes: + GNAP: + name: Authorization + type: apiKey + in: header +security: + - GNAP: [] diff --git a/docs/public/specs/resource-server.yaml b/docs/public/specs/resource-server.yaml new file mode 100644 index 00000000..01aeb62f --- /dev/null +++ b/docs/public/specs/resource-server.yaml @@ -0,0 +1,1487 @@ +openapi: 3.1.0 +info: + title: Open Payments + version: '1.3.0' + license: + name: Apache 2.0 + identifier: Apache-2.0 + description: |- + The resource server manages the core transaction resources of the Open Payments protocol: incoming payments, outgoing payments, and quotes. All resources are scoped to a wallet address and require an access token issued by the authorization server. + + **Endpoints:** + - `/incoming-payments` — create and manage incoming payments + - `/outgoing-payments` — create and manage outgoing payment instructions + - `/quotes` — request a quote for a specific send or receive amount + + For a full overview of these resources, see [the Resources concepts page](https://openpayments.dev/concepts/resources). + summary: An API for open access to financial accounts to send and receive payments. + contact: + email: tech@interledger.org +servers: + - url: 'https://ilp.interledger-test.dev' + description: 'Server for wallet address subresources (ie https://ilp.interledger-test.dev/alice)' + - url: 'https://ilp.interledger-test.dev/.well-known/pay' + description: 'Server for when the wallet address has no pathname (ie https://ilp.interledger-test.dev)' +tags: + - name: incoming-payment + description: incoming payment operations + - name: outgoing-payment + description: outgoing payment operations + - name: quote + description: quote operations +paths: + /incoming-payments: + post: + summary: Create an Incoming Payment + tags: + - incoming-payment + operationId: create-incoming-payment + responses: + '201': + description: Incoming Payment Created + content: + application/json: + schema: + $ref: '#/components/schemas/incoming-payment-with-methods' + examples: + New Incoming Payment for $25: + value: + id: 'https://ilp.interledger-test.dev/incoming-payments/08394f02-7b7b-45e2-b645-51d04e7c330c' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingAmount: + value: '2500' + assetCode: USD + assetScale: 2 + receivedAmount: + value: '0' + assetCode: USD + assetScale: 2 + completed: false + expiresAt: '2022-02-03T23:20:50.52Z' + metadata: + externalRef: INV2022-02-0137 + createdAt: '2022-03-12T23:20:50.52Z' + methods: + - type: ilp + ilpAddress: g.ilp.iwuyge987y.98y08y + sharedSecret: 1c7eaXa4rd2fFOBl1iydvCT1tV5TbM3RW1WLCafu_JA + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + walletAddress: + $ref: '#/components/schemas/walletAddress' + incomingAmount: + $ref: '#/components/schemas/amount' + description: The maximum amount that should be paid into the wallet address under this incoming payment. + expiresAt: + type: string + description: The date and time when payments into the incoming payment must no longer be accepted. + format: date-time + writeOnly: true + metadata: + type: object + additionalProperties: true + description: Additional metadata associated with the incoming payment. (Optional) + required: + - walletAddress + examples: + Create incoming payment for $25 to pay invoice INV2022-02-0137: + value: + walletAddress: 'https://openpayments.guide/alice/' + incomingAmount: + value: '2500' + assetCode: USD + assetScale: 2 + metadata: + externalRef: INV2022-02-0137 + description: |- + A subset of the incoming payments schema is accepted as input to create a new incoming payment. + + The `incomingAmount` must use the same `assetCode` and `assetScale` as the wallet address. + required: true + description: |- + A client MUST create an **incoming payment** resource before it is possible to send any payments to the wallet address. + + When a client creates an **incoming payment** the receiving Account Servicing Entity generates unique payment details that can be used to address payments to the account and returns these details to the client as properties of the new **incoming payment**. Any payments received using those details are then associated with the **incoming payment**. + + All of the input parameters are _optional_. + + For example, the client could use the `metadata` property to store an external reference on the **incoming payment** and this can be shared with the account holder to assist with reconciliation. + + If `incomingAmount` is specified and the total received using the payment details equals or exceeds the specified `incomingAmount`, then the receiving Account Servicing Entity MUST reject any further payments and set `completed` to `true`. + + If an `expiresAt` value is defined, and the current date and time on the receiving Account Servicing Entity's systems exceeds that value, the receiving Account Servicing Entity MUST reject any further payments. + parameters: + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + get: + summary: List Incoming Payments + operationId: list-incoming-payments + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + pagination: + $ref: '#/components/schemas/page-info' + result: + type: array + items: + $ref: '#/components/schemas/incoming-payment' + additionalProperties: false + examples: + forward pagination: + value: + pagination: + startCursor: 241de237-f989-42be-926d-c0c1fca57708 + endCursor: 315581f8-9967-45a0-9cd3-87b60b6d6414 + hasPreviousPage: false + hasNextPage: true + result: + - id: 'https://ilp.interledger-test.dev/incoming-payments/016da9d5-c9a4-4c80-a354-86b915a04ff8' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingAmount: + value: '250' + assetCode: USD + assetScale: 2 + receivedAmount: + value: '250' + assetCode: USD + assetScale: 2 + metadata: + description: 'Hi Mo, this is for the cappuccino I bought for you the other day.' + externalRef: Coffee w/ Mo on 10 March 22 + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + completed: true + - id: 'https://ilp.interledger-test.dev/incoming-payments/32abc219-3dc3-44ec-a225-790cacfca8fa' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + receivedAmount: + value: '100' + assetCode: USD + assetScale: 2 + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: 'I love your website, Alice! Thanks for the great content' + completed: false + backward pagination: + value: + pagination: + startCursor: 241de237-f989-42be-926d-c0c1fca57708 + endCursor: 315581f8-9967-45a0-9cd3-87b60b6d6414 + hasPreviousPage: true + hasNextPage: false + result: + - id: 'https://ilp.interledger-test.dev/incoming-payments/32abc219-3dc3-44ec-a225-790cacfca8fa' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + receivedAmount: + value: '100' + assetCode: USD + assetScale: 2 + completed: true + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: 'I love your website, Alice! Thanks for the great content' + - id: 'https://ilp.interledger-test.dev/incoming-payments/016da9d5-c9a4-4c80-a354-86b915a04ff8' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingAmount: + value: '250' + assetCode: USD + assetScale: 2 + receivedAmount: + value: '250' + assetCode: USD + assetScale: 2 + completed: true + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: 'Hi Mo, this is for the cappuccino I bought for you the other day.' + externalRef: Coffee w/ Mo on 10 March 22 + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + description: List all incoming payments on the wallet address + parameters: + - $ref: '#/components/parameters/wallet-address' + - $ref: '#/components/parameters/cursor' + - $ref: '#/components/parameters/first' + - $ref: '#/components/parameters/last' + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + tags: + - incoming-payment + /outgoing-payments: + post: + summary: Create an Outgoing Payment + tags: + - outgoing-payment + operationId: create-outgoing-payment + responses: + '201': + description: Outgoing Payment Created + content: + application/json: + schema: + $ref: '#/components/schemas/outgoing-payment-with-spent-amounts' + examples: + New Fixed Send Outgoing Payment for $25: + value: + id: 'https://ilp.interledger-test.dev/outgoing-payments/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/bob/incoming-payments/48884225-b393-4872-90de-1b737e2491c2' + debitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + sentAmount: + value: '0' + assetCode: USD + assetScale: 2 + grantSpentDebitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + grantSpentReceiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + metadata: + description: Thank you for the shoes. + createdAt: '2022-03-12T23:20:50.52Z' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + requestBody: + content: + application/json: + examples: + Create an outgoing payment based on a quote: + value: + walletAddress: 'https://ilp.interledger-test.dev/alice/' + quoteId: 'https://ilp.interledger-test.dev/quotes/ab03296b-0c8b-4776-b94e-7ee27d868d4d' + metadata: + externalRef: INV2022-02-0137 + Create an outgoing payment based on an incoming payment: + value: + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingPayment: 'https://ilp.interledger-test.dev/incoming-payments/8d4e4776-2e55-4e5a-bcbe-8348ed1e86de' + debitAmount: + value: '2500' + assetCode: USD + assetScale: 2 + metadata: + externalRef: INV2022-02-0137 + schema: + oneOf: + - title: 'From quote' + type: object + properties: + walletAddress: + $ref: '#/components/schemas/walletAddress' + quoteId: + type: string + format: uri + description: The URL of the quote defining this payment's amounts. + metadata: + type: object + additionalProperties: true + description: Additional metadata associated with the outgoing payment. (Optional) + required: + - quoteId + - walletAddress + additionalProperties: false + - title: 'From incoming payment' + type: object + properties: + walletAddress: + $ref: '#/components/schemas/walletAddress' + incomingPayment: + type: string + format: uri + description: The URL of the incoming payment this outgoing payment will fulfill. + debitAmount: + description: The fixed amount that would be sent from the sending wallet address given a successful outgoing payment. + $ref: '#/components/schemas/amount' + metadata: + type: object + additionalProperties: true + description: Additional metadata associated with the outgoing payment. (Optional) + required: + - incomingPayment + - debitAmount + - walletAddress + additionalProperties: false + description: |- + A subset of the outgoing payments schema is accepted as input to create a new outgoing payment. + + The `debitAmount` must use the same `assetCode` and `assetScale` as the wallet address. + + Either provide a `quoteId` to create an outgoing payment based on a quote or provide `incomingPayment` and `debitAmount` to create an outgoing payment directly from an incoming payment. + required: true + description: |- + An **outgoing payment** is a sub-resource of a wallet address. It represents a payment from the wallet address. + + Once created, it is already authorized and SHOULD be processed immediately. If payment fails, the Account Servicing Entity must mark the **outgoing payment** as `failed`. + parameters: + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + description: Create a new outgoing payment at the wallet address. + get: + summary: List Outgoing Payments + operationId: list-outgoing-payments + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + pagination: + $ref: '#/components/schemas/page-info' + result: + type: array + items: + $ref: '#/components/schemas/outgoing-payment' + examples: + forward pagination: + value: + pagination: + startCursor: 241de237-f989-42be-926d-c0c1fca57708 + endCursor: 315581f8-9967-45a0-9cd3-87b60b6d6414 + hasPreviousPage: false + hasNextPage: true + result: + - id: 'https://ilp.interledger-test.dev/outgoing-payments/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/aplusvideo/incoming-payments/45d495ad-b763-4882-88d7-aa14d261686e' + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + debitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + sentAmount: + value: '2500' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: APlusVideo subscription + externalRef: 'customer: 847458475' + - id: 'https://ilp.interledger-test.dev/outgoing-payments/0cffa5a4-58fd-4cc8-8e01-7145c72bf07c' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/shoeshop/incoming-payments/2fe92c6f-ef0d-487c-8759-3784eae6bce9' + debitAmount: + value: '7126' + assetCode: USD + assetScale: 2 + receiveAmount: + value: '7026' + assetCode: USD + assetScale: 2 + sentAmount: + value: '7026' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: Thank you for your purchase at ShoeShop! + externalRef: INV2022-8943756 + backward pagination: + value: + pagination: + startCursor: 241de237-f989-42be-926d-c0c1fca57708 + endCursor: 315581f8-9967-45a0-9cd3-87b60b6d6414 + hasPreviousPage: true + hasNextPage: false + result: + - id: 'https://ilp.interledger-test.dev/outgoing-payments/0cffa5a4-58fd-4cc8-8e01-7145c72bf07c' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/shoeshop/incoming-payments/2fe92c6f-ef0d-487c-8759-3784eae6bce9' + debitAmount: + value: '7126' + assetCode: USD + assetScale: 2 + receiveAmount: + value: '7026' + assetCode: USD + assetScale: 2 + sentAmount: + value: '7026' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: Thank you for your purchase at ShoeShop! + externalRef: INV2022-8943756 + - id: 'https://ilp.interledger-test.dev/outgoing-payments/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/aplusvideo/incoming-payments/45d495ad-b763-4882-88d7-aa14d261686e' + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + debitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + sentAmount: + value: '2500' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: APlusVideo subscription + externalRef: 'customer: 847458475' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + description: List all outgoing payments on the wallet address + parameters: + - $ref: '#/components/parameters/wallet-address' + - $ref: '#/components/parameters/cursor' + - $ref: '#/components/parameters/first' + - $ref: '#/components/parameters/last' + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + tags: + - outgoing-payment + /quotes: + post: + summary: Create a Quote + tags: + - quote + operationId: create-quote + responses: + '201': + description: Quote Created + content: + application/json: + schema: + $ref: '#/components/schemas/quote' + examples: + New Fixed Send Quote for $25: + value: + id: 'https://ilp.interledger-test.dev/quotes/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + receiver: 'https://ilp.interledger-test.dev/aplusvideo/incoming-payments/45d495ad-b763-4882-88d7-aa14d261686e' + debitAmount: + value: '2500' + assetCode: USD + assetScale: 2 + receiveAmount: + value: '2198' + assetCode: EUR + assetScale: 2 + method: ilp + createdAt: '2022-03-12T23:20:50.52Z' + expiresAt: '2022-04-12T23:20:50.52Z' + '400': + description: No amount was provided and no amount could be inferred from the receiver. + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + requestBody: + content: + application/json: + examples: + Create quote for an `receiver` that is an Incoming Payment with an `incomingAmount`: + value: + walletAddress: 'https://ilp.interledger-test.dev/alice' + receiver: 'https://ilp.interledger-test.dev/incoming-payments/37a0d0ee-26dc-4c66-89e0-01fbf93156f7' + method: ilp + Create fixed-send amount quote for $25: + value: + walletAddress: 'https://ilp.interledger-test.dev/alice' + receiver: 'https://ilp.interledger-test.dev/incoming-payments/37a0d0ee-26dc-4c66-89e0-01fbf93156f7' + method: ilp + debitAmount: + value: '2500' + assetCode: USD + assetScale: 2 + Create fixed-receive amount quote for $25: + value: + walletAddress: 'https://ilp.interledger-test.dev/alice' + receiver: 'https://ilp.interledger-test.dev/incoming-payments/37a0d0ee-26dc-4c66-89e0-01fbf93156f7' + method: ilp + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + schema: + oneOf: + - title: 'Receiver with incoming amount' + description: Create quote for an `receiver` that is an Incoming Payment with an `incomingAmount` + properties: + walletAddress: + $ref: '#/components/schemas/walletAddress' + receiver: + $ref: '#/components/schemas/receiver' + method: + $ref: '#/components/schemas/payment-method' + required: + - walletAddress + - receiver + - method + additionalProperties: false + - title: 'With fixed-receive amount' + description: Create a quote with a fixed-receive amount + properties: + walletAddress: + $ref: '#/components/schemas/walletAddress' + receiver: + $ref: '#/components/schemas/receiver' + method: + $ref: '#/components/schemas/payment-method' + receiveAmount: + description: The fixed amount that would be paid into the receiving wallet address given a successful outgoing payment. + $ref: '#/components/schemas/amount' + required: + - walletAddress + - receiver + - method + - receiveAmount + additionalProperties: false + - title: 'With fixed-send amount' + description: Create a quote with a fixed-send amount + properties: + walletAddress: + $ref: '#/components/schemas/walletAddress' + receiver: + $ref: '#/components/schemas/receiver' + method: + $ref: '#/components/schemas/payment-method' + debitAmount: + description: The fixed amount that would be sent from the sending wallet address given a successful outgoing payment. + $ref: '#/components/schemas/amount' + required: + - walletAddress + - receiver + - method + - debitAmount + additionalProperties: false + description: |- + A subset of the quotes schema is accepted as input to create a new quote. + + The quote must be created with a (`debitAmount` xor `receiveAmount`) unless the `receiver` is an Incoming Payment which has an `incomingAmount`. + required: true + description: A **quote** is a sub-resource of a wallet address. It represents a quote for a payment from the wallet address. + parameters: + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + description: Create a new quote at the wallet address. + '/incoming-payments/{id}': + get: + summary: Get an Incoming Payment + tags: + - incoming-payment + operationId: get-incoming-payment + responses: + '200': + description: Incoming Payment Found + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/incoming-payment-with-methods' + - $ref: '#/components/schemas/public-incoming-payment' + examples: + Incoming Payment for $25 with $12.34 received so far: + value: + id: 'https://ilp.interledger-test.dev/incoming-payments/2f1b0150-db73-49e8-8713-628baa4a17ff' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingAmount: + value: '2500' + assetCode: USD + assetScale: 2 + receivedAmount: + value: '1234' + assetCode: USD + assetScale: 2 + completed: false + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: Thanks for the flowers! + externalRef: INV-12876 + methods: + - type: ilp + ilpAddress: g.ilp.iwuyge987y.98y08y + sharedSecret: 1c7eaXa4rd2fFOBl1iydvCT1tV5TbM3RW1WLCafu_JA + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + description: Incoming Payment Not Found + parameters: + - $ref: '#/components/parameters/optional-signature-input' + - $ref: '#/components/parameters/optional-signature' + description: A client can fetch the latest state of an incoming payment to determine the amount received into the wallet address. + parameters: + - $ref: '#/components/parameters/id' + '/incoming-payments/{id}/complete': + post: + summary: Complete an Incoming Payment + tags: + - incoming-payment + operationId: complete-incoming-payment + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/incoming-payment' + additionalProperties: false + examples: + Completed Incoming Payment: + value: + id: 'https://ilp.interledger-test.dev/incoming-payments/016da9d5-c9a4-4c80-a354-86b915a04ff8' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingAmount: + value: '250' + assetCode: USD + assetScale: 2 + receivedAmount: + value: '250' + assetCode: USD + assetScale: 2 + completed: true + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: 'Hi Mo, this is for the cappuccino I bought for you the other day.' + externalRef: Coffee w/ Mo on 10 March 2 + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + description: Incoming Payment Not Found + description: |- + A client with the appropriate permissions MAY mark a non-expired **incoming payment** as `completed` indicating that the client is not going to make any further payments toward this **incoming payment**, even though the full `incomingAmount` may not have been received. + + This indicates to the receiving Account Servicing Entity that it can begin any post processing of the payment such as generating account statements or notifying the account holder of the completed payment. + parameters: + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + parameters: + - $ref: '#/components/parameters/id' + '/outgoing-payments/{id}': + get: + summary: Get an Outgoing Payment + tags: + - outgoing-payment + operationId: get-outgoing-payment + responses: + '200': + description: Outgoing Payment Found + content: + application/json: + schema: + $ref: '#/components/schemas/outgoing-payment' + examples: + Outgoing Payment with a fixed send amount of $25: + value: + id: 'https://ilp.interledger-test.dev/bob/outgoing-payments/3859b39e-4666-4ce5-8745-72f1864c5371' + walletAddress: 'https://ilp.interledger-test.dev/bob/' + failed: false + receiver: 'https://ilp.interledger-test.dev/incoming-payments/2f1b0150-db73-49e8-8713-628baa4a17ff' + debitAmount: + value: '2500' + assetCode: USD + assetScale: 2 + receiveAmount: + value: '2198' + assetCode: EUR + assetScale: 2 + sentAmount: + value: '1205' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: Thanks for the flowers! + externalRef: INV-12876 + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + description: Outgoing Payment Not Found + description: A client can fetch the latest state of an outgoing payment. + parameters: + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + parameters: + - $ref: '#/components/parameters/id' + '/quotes/{id}': + get: + summary: Get a Quote + tags: + - quote + operationId: get-quote + responses: + '200': + description: Quote Found + content: + application/json: + schema: + $ref: '#/components/schemas/quote' + examples: + Quote with a fixed send amount of $25: + value: + id: 'https://ilp.interledger-test.dev/bob/quotes/3859b39e-4666-4ce5-8745-72f1864c5371' + walletAddress: 'https://ilp.interledger-test.dev/bob/' + receiver: 'https://ilp.interledger-test.dev/incoming-payments/2f1b0150-db73-49e8-8713-628baa4a17ff' + debitAmount: + value: '2500' + assetCode: USD + assetScale: 2 + receiveAmount: + value: '2198' + assetCode: EUR + assetScale: 2 + method: ilp + createdAt: '2022-03-12T23:20:50.52Z' + expiresAt: '2022-04-12T23:20:50.52Z' + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + '404': + $ref: '#/components/responses/404' + description: Quote Not Found + description: A client can fetch the latest state of a quote. + parameters: + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' + parameters: + - $ref: '#/components/parameters/id' + '/outgoing-payment-grant': + get: + summary: Get spent amounts for current outgoing payment grant + tags: + - outgoing-payment + operationId: get-outgoing-payment-grant + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + required: + - spentReceiveAmount + - spentDebitAmount + properties: + spentReceiveAmount: + anyOf: + - $ref: '#/components/schemas/amount' + - type: 'null' + spentDebitAmount: + anyOf: + - $ref: '#/components/schemas/amount' + - type: 'null' + examples: + Grant spent amounts: + value: + spentReceiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + spentDebitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + No spent amounts: + value: + spentReceiveAmount: null + spentDebitAmount: null + '401': + $ref: '#/components/responses/401' + '403': + $ref: '#/components/responses/403' + description: |- + Returns the spent amounts for the current outgoing payment grant corresponding to the presented GNAP access token, if any. If a grant was created with an interval (recurring), the amounts returned are for the current interval. + parameters: + - $ref: '#/components/parameters/signature-input' + - $ref: '#/components/parameters/signature' +components: + schemas: + amount: + title: amount + type: object + properties: + value: + type: string + format: uint64 + description: 'The value is an unsigned 64-bit integer amount, represented as a string.' + assetCode: + title: Asset code + type: string + description: The assetCode is a code that indicates the underlying asset. An ISO4217 currency code should be used whenever possible. The ISO4217 representation of the US Dollar is USD. + assetScale: + title: Asset scale + type: integer + minimum: 0 + maximum: 255 + description: The number of decimal places that defines the scale of the smallest divisible unit for the given asset code. It determines how an integer amount is scaled to derive the actual monetary value. For example, USD has an asset scale of 2 with the smallest unit being 0.01. An integer amount of `1000` with an `assetCode` of `USD` and `assetScale` of `2` translates to $10.00. + required: + - value + - assetCode + - assetScale + walletAddress: + title: Wallet Address + type: string + description: 'The URL of an Open Payments wallet address' + format: uri + receiver: + title: Receiver + type: string + description: The URL of the incoming payment that is being paid. + format: uri + pattern: '^(https|http)://(.+)/incoming-payments/(.+)$' + examples: + - 'https://ilp.interledger-test.dev/incoming-payments/08394f02-7b7b-45e2-b645-51d04e7c330c' + - 'http://ilp.interledger-test.dev/incoming-payments/08394f02-7b7b-45e2-b645-51d04e7c330c' + - 'https://ilp.interledger-test.dev/incoming-payments/1' + incoming-payment: + title: Incoming Payment + description: 'An **incoming payment** resource represents a payment that will be, is currently being, or has been received by the account.' + type: object + examples: + - id: 'https://ilp.interledger-test.dev/incoming-payments/016da9d5-c9a4-4c80-a354-86b915a04ff8' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingAmount: + value: '250' + assetCode: USD + assetScale: 2 + receivedAmount: + value: '250' + assetCode: USD + assetScale: 2 + completed: true + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: 'Hi Mo, this is for the cappuccino I bought for you the other day.' + externalRef: Coffee w/ Mo on 10 March 22 + - id: 'https://ilp.interledger-test.dev/incoming-payments/456da9d5-c9a4-4c80-a354-86b915a04ff8' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + incomingAmount: + value: '2500' + assetCode: USD + assetScale: 2 + receivedAmount: + value: '0' + assetCode: USD + assetScale: 2 + expiresAt: '2022-04-12T23:20:50.52Z' + createdAt: '2022-03-12T23:20:50.52Z' + properties: + id: + type: string + format: uri + description: The URL identifying the incoming payment. + readOnly: true + walletAddress: + type: string + format: uri + description: The URL of the wallet address this payment is being made into. + readOnly: true + completed: + type: boolean + description: Describes whether the incoming payment has completed receiving fund. + default: false + incomingAmount: + $ref: '#/components/schemas/amount' + description: The maximum amount that should be paid into the wallet address under this incoming payment. + receivedAmount: + $ref: '#/components/schemas/amount' + description: The total amount that has been paid into the wallet address under this incoming payment. + expiresAt: + type: string + description: The date and time when payments under this incoming payment will no longer be accepted. + format: date-time + metadata: + type: object + additionalProperties: true + description: Additional metadata associated with the incoming payment. (Optional) + createdAt: + type: string + format: date-time + description: The date and time when the incoming payment was created. + required: + - id + - walletAddress + - completed + - receivedAmount + - createdAt + incoming-payment-with-methods: + title: Incoming Payment with payment methods + description: An **incoming payment** resource with public details. + allOf: + - $ref: '#/components/schemas/incoming-payment' + - type: object + properties: + methods: + description: The list of payment methods supported by this incoming payment. + type: array + uniqueItems: true + minItems: 0 + items: + anyOf: + - $ref: '#/components/schemas/ilp-payment-method' + required: + - methods + public-incoming-payment: + title: Public Incoming Payment + description: An **incoming payment** resource with public details. + type: object + examples: + - receivedAmount: + value: '0' + assetCode: USD + assetScale: 2 + - authServer: 'https://auth.ilp.interledger-test.dev' + properties: + receivedAmount: + $ref: '#/components/schemas/amount' + authServer: + type: string + format: uri + description: The URL of the authorization server endpoint for getting grants and access tokens for this wallet address. + required: + - authServer + unresolvedProperites: false + outgoing-payment: + title: Outgoing Payment + description: 'An **outgoing payment** resource represents a payment that will be, is currently being, or has previously been, sent from the wallet address.' + type: object + examples: + - id: 'https://ilp.interledger-test.dev/outgoing-payments/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/aplusvideo/incoming-payments/45d495ad-b763-4882-88d7-aa14d261686e' + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + debitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + sentAmount: + value: '2500' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: APlusVideo subscription + externalRef: 'customer: 847458475' + - id: 'https://ilp.interledger-test.dev/outgoing-payments/0cffa5a4-58fd-4cc8-8e01-7145c72bf07c' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/shoeshop/2fe92c6f-ef0d-487c-8759-3784eae6bce9' + debitAmount: + value: '7126' + assetCode: USD + assetScale: 2 + sentAmount: + value: '7026' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: Thank you for your purchase at ShoeShop! + externalRef: INV2022-8943756 + additionalProperties: false + properties: + id: + type: string + format: uri + description: The URL identifying the outgoing payment. + readOnly: true + walletAddress: + type: string + format: uri + description: The URL of the wallet address from which this payment is sent. + readOnly: true + quoteId: + type: string + format: uri + description: The URL of the quote defining this payment's amounts. + readOnly: true + failed: + type: boolean + description: Describes whether the payment failed to send its full amount. + default: false + receiver: + $ref: '#/components/schemas/receiver' + description: The URL of the incoming payment that is being paid. + receiveAmount: + $ref: '#/components/schemas/amount' + description: The total amount that should be received by the receiver when this outgoing payment has been paid. + debitAmount: + $ref: '#/components/schemas/amount' + description: The total amount that should be deducted from the sender's account when this outgoing payment has been paid. + sentAmount: + $ref: '#/components/schemas/amount' + description: The total amount that has been sent under this outgoing payment. + metadata: + type: object + additionalProperties: true + description: Additional metadata associated with the outgoing payment. (Optional) + createdAt: + type: string + format: date-time + description: The date and time when the outgoing payment was created. + required: + - id + - walletAddress + - receiver + - receiveAmount + - debitAmount + - sentAmount + - createdAt + outgoing-payment-with-spent-amounts: + title: Outgoing Payment With Grant Spent Amounts + description: 'An **outgoing payment** resource represents a payment that will be, is currently being, or has previously been, sent from the wallet address.' + type: object + examples: + - id: 'https://ilp.interledger-test.dev/outgoing-payments/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/aplusvideo/incoming-payments/45d495ad-b763-4882-88d7-aa14d261686e' + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + debitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + sentAmount: + value: '2500' + assetCode: USD + assetScale: 2 + grantSpentDebitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: APlusVideo subscription + externalRef: 'customer: 847458475' + - id: 'https://ilp.interledger-test.dev/outgoing-payments/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + failed: false + receiver: 'https://ilp.interledger-test.dev/aplusvideo/incoming-payments/45d495ad-b763-4882-88d7-aa14d261686e' + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + debitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + sentAmount: + value: '2500' + assetCode: USD + assetScale: 2 + grantSpentReceiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + createdAt: '2022-03-12T23:20:50.52Z' + metadata: + description: APlusVideo subscription + externalRef: 'customer: 847458475' + properties: + id: + type: string + format: uri + description: The URL identifying the outgoing payment. + readOnly: true + walletAddress: + type: string + format: uri + description: The URL of the wallet address from which this payment is sent. + readOnly: true + quoteId: + type: string + format: uri + description: The URL of the quote defining this payment's amounts. + readOnly: true + failed: + type: boolean + description: Describes whether the payment failed to send its full amount. + default: false + receiver: + $ref: '#/components/schemas/receiver' + description: The URL of the incoming payment that is being paid. + receiveAmount: + $ref: '#/components/schemas/amount' + description: The total amount that should be received by the receiver when this outgoing payment has been paid. + debitAmount: + $ref: '#/components/schemas/amount' + description: The total amount that should be deducted from the sender's account when this outgoing payment has been paid. + sentAmount: + $ref: '#/components/schemas/amount' + description: The total amount that has been sent under this outgoing payment. + grantSpentDebitAmount: + $ref: '#/components/schemas/amount' + description: The total amount successfully deducted from the sender's account using the current outgoing payment grant. + grantSpentReceiveAmount: + $ref: '#/components/schemas/amount' + description: The total amount successfully received (by all receivers) using the current outgoing payment grant. + metadata: + type: object + additionalProperties: true + description: Additional metadata associated with the outgoing payment. (Optional) + createdAt: + type: string + format: date-time + description: The date and time when the outgoing payment was created. + required: + - id + - walletAddress + - receiver + - receiveAmount + - debitAmount + - sentAmount + - createdAt + quote: + title: Quote + description: A **quote** resource represents the quoted amount details with which an Outgoing Payment may be created. + type: object + examples: + - id: 'https://ilp.interledger-test.dev/quotes/ab03296b-0c8b-4776-b94e-7ee27d868d4d' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + receiver: 'https://ilp.interledger-test.dev/shoeshop/incoming-payments/2fe92c6f-ef0d-487c-8759-3784eae6bce9' + receiveAmount: + value: '2500' + assetCode: USD + assetScale: 2 + debitAmount: + value: '2600' + assetCode: USD + assetScale: 2 + sentAmount: + value: '2500' + assetCode: USD + assetScale: 2 + method: ilp + createdAt: '2022-03-12T23:20:50.52Z' + expiresAt: '2022-04-12T23:20:50.52Z' + - id: 'https://ilp.interledger-test.dev/quotes/8c68d3cc-0a0f-4216-98b4-4fa44a6c88cf' + walletAddress: 'https://ilp.interledger-test.dev/alice/' + receiver: 'https://ilp.interledger-test.dev/aplusvideo/incoming-payments/45d495ad-b763-4882-88d7-aa14d261686e' + debitAmount: + value: '7126' + assetCode: USD + assetScale: 2 + sentAmount: + value: '7026' + assetCode: USD + assetScale: 2 + method: ilp + createdAt: '2022-03-12T23:20:50.52Z' + expiresAt: '2022-04-12T23:20:50.52Z' + additionalProperties: false + properties: + id: + type: string + format: uri + description: The URL identifying the quote. + readOnly: true + walletAddress: + type: string + format: uri + description: The URL of the wallet address from which this quote's payment would be sent. + readOnly: true + receiver: + $ref: '#/components/schemas/receiver' + description: The URL of the incoming payment that the quote is created for. + receiveAmount: + $ref: '#/components/schemas/amount' + description: The total amount that should be received by the receiver when the corresponding outgoing payment has been paid. + debitAmount: + $ref: '#/components/schemas/amount' + description: "The total amount that should be deducted from the sender's account when the corresponding outgoing payment has been paid. " + method: + $ref: '#/components/schemas/payment-method' + expiresAt: + type: string + description: The date and time when the calculated `debitAmount` is no longer valid. + readOnly: true + createdAt: + type: string + format: date-time + description: The date and time when the quote was created. + required: + - id + - walletAddress + - receiver + - receiveAmount + - debitAmount + - createdAt + - method + page-info: + description: '' + type: object + examples: + - startCursor: 241de237-f989-42be-926d-c0c1fca57708 + endCursor: 315581f8-9967-45a0-9cd3-87b60b6d6414 + hasNextPage: true + hasPreviousPage: true + properties: + startCursor: + type: string + minLength: 1 + description: Cursor corresponding to the first element in the result array. + endCursor: + type: string + minLength: 1 + description: Cursor corresponding to the last element in the result array. + hasNextPage: + type: boolean + description: Describes whether the data set has further entries. + hasPreviousPage: + type: boolean + description: Describes whether the data set has previous entries. + required: + - hasNextPage + - hasPreviousPage + additionalProperties: false + payment-method: + type: string + enum: + - ilp + ilp-payment-method: + title: ILP payment method + type: object + additionalProperties: false + properties: + type: + type: string + enum: + - ilp + ilpAddress: + type: string + maxLength: 1023 + pattern: '^(g|private|example|peer|self|test[1-3]?|local)([.][a-zA-Z0-9_~-]+)+$' + description: The ILP address to use when establishing a STREAM connection. + sharedSecret: + type: string + pattern: '^[a-zA-Z0-9-_]+$' + description: The base64 url-encoded shared secret to use when establishing a STREAM connection. + required: + - type + - ilpAddress + - sharedSecret + examples: + - type: string + ilpAddress: string + sharedSecret: string + error-response: + type: object + properties: + error: + type: object + properties: + code: + type: string + description: + type: string + details: + type: object + additionalProperties: true + description: Additional details about the error. + required: + - description + - code + required: + - error + examples: + error-response-minimal: + value: + error: + code: 'invalid_request' + description: Error description + error-response-full: + value: + error: + code: 'invalid_request' + description: Error description + details: + anyKey: anyValue + securitySchemes: + GNAP: + name: Authorization + type: apiKey + in: header + description: |- + The API uses the Grant Negotiation and Authorization Protocol for authorization. An access token must be acquired from an authorization server before accessing the API and then provided in the request headers using the prefix `GNAP`. + + All requests must also be signed using a client key over some select headers and a digest of the request body. + responses: + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/error-response' + examples: + Detailed error response: + $ref: '#/components/examples/error-response-full' + Standard error response: + $ref: '#/components/examples/error-response-minimal' + '401': + description: Authorization required + headers: + WWW-Authenticate: + schema: + type: string + description: The address of the authorization server for grant requests in the format `GNAP as_uri=` + content: + application/json: + schema: + $ref: '#/components/schemas/error-response' + examples: + Detailed error response: + $ref: '#/components/examples/error-response-full' + Standard error response: + $ref: '#/components/examples/error-response-minimal' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/error-response' + examples: + Detailed error response: + $ref: '#/components/examples/error-response-full' + Standard error response: + $ref: '#/components/examples/error-response-minimal' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/error-response' + examples: + Detailed error response: + $ref: '#/components/examples/error-response-full' + Standard error response: + $ref: '#/components/examples/error-response-minimal' + parameters: + cursor: + schema: + type: string + minLength: 1 + name: cursor + in: query + description: The cursor key to list from. + first: + schema: + type: integer + minimum: 1 + maximum: 100 + name: first + in: query + description: The number of items to return after the cursor. + last: + schema: + type: integer + minimum: 1 + maximum: 100 + name: last + in: query + description: The number of items to return before the cursor. + id: + name: id + in: path + schema: + type: string + description: Sub-resource identifier + required: true + wallet-address: + name: wallet-address + in: query + schema: + type: string + description: 'URL of a wallet address hosted by a Rafiki instance.' + required: true + signature: + name: Signature + in: header + schema: + type: string + examples: + - 'Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:' + description: 'The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.' + required: true + signature-input: + name: Signature-Input + in: header + schema: + type: string + examples: + - 'Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"' + description: 'The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member''s key is the label that uniquely identifies the message signature within the context of the HTTP message. The member''s value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See [ietf-httpbis-message-signatures](https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-message-signatures#section-4.1) for more details.' + required: true + optional-signature: + name: Signature + in: header + schema: + type: string + examples: + - 'Signature: sig1=:EWJgAONk3D6542Scj8g51rYeMHw96cH2XiCMxcyL511wyemGcw==:' + description: 'The signature generated based on the Signature-Input, using the signing algorithm specified in the "alg" field of the JWK.' + optional-signature-input: + name: Signature-Input + in: header + schema: + type: string + examples: + - 'Signature-Input: sig1=("@method" "@target-uri" "content-digest" "content-length" "content-type");created=1618884473;keyid="gnap-rsa"' + description: 'The Signature-Input field is a Dictionary structured field containing the metadata for one or more message signatures generated from components within the HTTP message. Each member describes a single message signature. The member''s key is the label that uniquely identifies the message signature within the context of the HTTP message. The member''s value is the serialization of the covered components Inner List plus all signature metadata parameters identified by the label. The following components MUST be included: - "@method" - "@target-uri" - "authorization". When the message contains a request body, the covered components MUST also include the following: - "content-digest" The keyid parameter of the signature MUST be set to the kid value of the JWK. See [ietf-httpbis-message-signatures](https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-message-signatures#section-4.1) for more details.' +security: + - GNAP: [] diff --git a/docs/public/specs/wallet-address-server.yaml b/docs/public/specs/wallet-address-server.yaml new file mode 100644 index 00000000..96a5931f --- /dev/null +++ b/docs/public/specs/wallet-address-server.yaml @@ -0,0 +1,204 @@ +openapi: 3.1.0 +info: + title: Wallet Address API + version: '1.3.0' + license: + name: Apache 2.0 + identifier: Apache-2.0 + description: |- + The wallet address server exposes publicly accessible information about an Open Payments wallet address, including basic account details and the cryptographic keys used to verify requests from this wallet address. + + **Endpoints:** + - `GET /` — retrieve public details for a wallet address + - `GET /jwks.json` — retrieve the JSON Web Key Set (JWKS) for a wallet address + + For an overview of wallet addresses and how they work in Open Payments, see [the Wallet addresses concepts page](https://openpayments.dev/concepts/wallet-addresses). + contact: + email: tech@interledger.org +servers: + - url: 'https://ilp.interledger-test.dev/alice' + description: "Server for Alice's wallet address" + - url: 'https://ilp.interledger-test.dev/bob' + description: "Server for Bob's wallet address" +tags: + - name: wallet-address + description: wallet address operations +paths: + /: + get: + summary: Get a Wallet Address + tags: + - wallet-address + responses: + '200': + description: Wallet Address Found + content: + application/json: + schema: + $ref: '#/components/schemas/wallet-address' + examples: + Get wallet address for https://ilp.interledger-test.dev/alice: + value: + id: 'https://ilp.interledger-test.dev/alice' + publicName: Alice + assetCode: USD + assetScale: 2 + authServer: 'https://ilp.interledger-test.dev/auth' + resourceServer: 'https://ilp.interledger-test.dev/op' + '302': + description: If the `Accept` header is `text/html` in the request, the server may choose to redirect to an HTML page for the given wallet address. + headers: + Location: + description: 'The URL of the wallet address webpage.' + schema: + type: string + '404': + description: Wallet Address Not Found + operationId: get-wallet-address + description: |- + Retrieve the public information of the Wallet Address. + + This endpoint should be open to anonymous requests as it allows clients to verify a Wallet Address URL and get the basic information required to construct new transactions and discover the grant request URL. + + The content should be slow changing and cacheable for long periods. Servers SHOULD use cache control headers. + security: [] + x-internal: false + /jwks.json: + get: + summary: Get the keys bound to a Wallet Address + tags: + - wallet-address + responses: + '200': + description: JWKS Document Found + content: + application/json: + schema: + $ref: '#/components/schemas/json-web-key-set' + examples: {} + '404': + description: JWKS Document Not Found + operationId: get-wallet-address-keys + description: Retrieve the public keys of the Wallet Address. + security: [] + +components: + schemas: + wallet-address: + title: Wallet Address + type: object + description: A **wallet address** resource is the root of the API and contains the public details of the financial account represented by the Wallet Address that is also the service endpoint URL. + additionalProperties: true + examples: + - id: 'https://ilp.interledger-test.dev/alice' + publicName: Alice + assetCode: USD + assetScale: 2 + authServer: 'https://ilp.interledger-test.dev/auth' + resourceServer: 'https://ilp.interledger-test.dev/op' + properties: + id: + type: string + format: uri + description: The URL identifying the wallet address. + readOnly: true + publicName: + type: string + description: A public name for the account. This should be set by the account holder with their provider to provide a hint to counterparties as to the identity of the account holder. + readOnly: true + assetCode: + title: Asset code + type: string + description: The assetCode is a code that indicates the underlying asset. An ISO4217 currency code should be used whenever possible. The ISO4217 representation of the US Dollar is USD. + assetScale: + title: Asset scale + type: integer + minimum: 0 + maximum: 255 + description: The number of decimal places that defines the scale of the smallest divisible unit for the given asset code. It determines how an integer amount is scaled to derive the actual monetary value. For example, USD has an asset scale of 2 with the smallest unit being 0.01. An integer amount of `1000` with an `assetCode` of `USD` and `assetScale` of `2` translates to $10.00. + authServer: + type: string + format: uri + description: The URL of the authorization server endpoint for getting grants and access tokens for this wallet address. + readOnly: true + resourceServer: + type: string + format: uri + description: The URL of the resource server endpoint for performing Open Payments with this wallet address. + readOnly: true + required: + - id + - assetCode + - assetScale + - authServer + - resourceServer + json-web-key-set: + title: JSON Web Key Set document + type: object + description: 'A JSON Web Key Set document according to [rfc7517](https://datatracker.ietf.org/doc/html/rfc7517) listing the keys associated with this wallet address. These keys are used to sign requests made by this wallet address.' + additionalProperties: false + properties: + keys: + type: array + items: + $ref: '#/components/schemas/json-web-key' + readOnly: true + required: + - keys + examples: + - keys: + - kid: key-1 + alg: EdDSA + use: sig + kty: OKP + crv: Ed25519 + x: 11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo + json-web-key: + type: object + properties: + kid: + type: string + description: A unique identifier for the key. + alg: + type: string + description: 'The cryptographic algorithm family used with the key. The only allowed value is `EdDSA`. ' + enum: + - EdDSA + use: + type: string + description: The intended use of the key. The only allowed value is `sig` (signature). + enum: + - sig + kty: + type: string + description: The key type. Identifies the cryptographic algorithm family. The only allowed value is `OKP` (Octet Key Pair). + enum: + - OKP + crv: + type: string + description: The cryptographic curve used with the key. The only allowed value is `Ed25519`. + enum: + - Ed25519 + x: + type: string + pattern: '^[a-zA-Z0-9-_]+$' + description: The base64 url-encoded public key. + required: + - kid + - alg + - kty + - crv + - x + title: Ed25519 Public Key + description: A JWK representation of an Ed25519 Public Key + examples: + - kid: key-1 + use: sig + kty: OKP + crv: Ed25519 + x: 11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo + - kid: '2022-09-02' + use: sig + kty: OKP + crv: Ed25519 + x: oy0L_vTygNE4IogRyn_F5GmHXdqYVjIXkWs2jky7zsI diff --git a/docs/src/content/docs/resources/spec-improvements.mdx b/docs/src/content/docs/resources/spec-improvements.mdx new file mode 100644 index 00000000..5a5f1a52 --- /dev/null +++ b/docs/src/content/docs/resources/spec-improvements.mdx @@ -0,0 +1,148 @@ +--- +title: Proposed spec improvements +description: A summary of proposed changes to the Open Payments OpenAPI specs for developer and writer review. +--- + +This page documents proposed improvements to the OpenAPI spec files in the +[`interledger/open-payments-specifications`](https://github.com/interledger/open-payments-specifications) repository. + +These changes have been applied locally on the `demo/api-docs-exploration` branch for review purposes. **No changes have been pushed to the specifications repository.** Each item below should be reviewed with a developer before opening a PR over there to confirm no breaking changes are introduced. + +The changes are grouped by spec file. All three API reference tools on this branch (the existing Starlight plugin, Scalar, and Redoc) read from the same spec files and will reflect these changes automatically. + +--- + +## `auth-server.yaml` + +### Anonymous `oneOf` objects in grant request 200 response + +**Problem:** The 200 response for the grant request endpoint (`POST /`) uses a `oneOf` with two inline objects that have no `title` field. All three doc tools render these as generic labels like `"object"` or `"One of: object | object"`, which gives the reader no useful information about what each case represents. + +**Fix:** Added `title` fields to both objects: + +| Before | After | +| ------------------------------------------------------ | --------------------- | +| _(no title)_ — object with `interact` + `continue` | `Pending Interaction` | +| _(no title)_ — object with `access_token` + `continue` | `Approved` | + +This pattern is already used correctly elsewhere in the same spec (the request body uses `title: with Access Token` and `title: with Subject`). + +--- + +### Missing descriptions on `id` path parameters + +**Problem:** Both `/continue/{id}` and `/token/{id}` define an `id` path parameter with no `description` field. Doc tools display it as a required string with no context. + +**Fix:** Added descriptions: + +| Path | Description added | +| ---------------- | ------------------------------------------------------------ | +| `/continue/{id}` | `The unique reference ID of the grant request continuation.` | +| `/token/{id}` | `The unique reference of the access token to be managed.` | + +--- + +### Anonymous `anyOf` objects in `limits-outgoing` schema + +**Problem:** The `limits-outgoing` schema uses an `anyOf` with three untitled inline objects representing different payment limit configurations. + +**Fix:** Added titles — `No amount limit`, `Debit amount limit`, and `Receive amount limit`. + +--- + +### Missing `title` fields on error schemas + +**Problem:** All six error component schemas (`error-invalid-client`, `error-invalid-request`, `error-request-denied`, `error-too-fast`, `error-invalid-continuation`, `error-invalid-rotation`) had no `title` field. Since these are reused across multiple error response `oneOf`s throughout the spec, doc tools rendered every error response as `object | object`. + +**Fix:** Added a `title` to each schema (`Invalid client`, `Invalid request`, `Request denied`, `Too fast`, `Invalid continuation`, `Invalid rotation`). This fixes all error response displays in one place. + +--- + +### Anonymous `oneOf` objects on `client` schema (v1.3.0) + +**Problem:** A v1.3.0 upstream update added directed identity support, expanding the `client` field from a plain string to a `oneOf` with three options. None of the three had `title` fields. + +**Fix:** Added titles — `Wallet address string (deprecated)`, `Wallet address object`, and `Directed identity (JWK)`. + +--- + +### Updated `info.description` + +**Problem:** The original description was a single sentence describing the spec as "an opinionated GNAP Server API" with no further context. + +**Fix:** Replaced with an explanation of the auth server's role, a full endpoint list, and a link to the authorization concepts page. + +--- + +## `wallet-address-server.yaml` + +### Missing descriptions on `json-web-key` properties + +**Problem:** The `json-web-key` schema has four properties with no `description` field — `kid`, `use`, `kty`, and `crv`. The `alg` and `x` properties already have descriptions. The missing ones are particularly confusing for readers unfamiliar with JWK terminology. + +**Fix:** Added descriptions: + +| Property | Description added | +| -------- | -------------------------------------------------------------------------------------------------------------- | +| `kid` | `A unique identifier for the key.` | +| `use` | `The intended use of the key. The only allowed value is `sig` (signature).` | +| `kty` | `The key type. Identifies the cryptographic algorithm family. The only allowed value is OKP (Octet Key Pair).` | +| `crv` | `The cryptographic curve used with the key. The only allowed value is Ed25519.` | + +--- + +### 4. Removed `/did.json` endpoint and `did-document` schema + +**Problem:** The `/did.json` endpoint was defined in the spec with a 500 response described as "DID Document not yet implemented." It was intentionally excluded from the published docs sidebar, but its presence in the spec was misleading and caused it to appear in Scalar and Redoc. + +**Fix:** Removed the `/did.json` endpoint and the `did-document` schema entirely. Confirmed with Max — this feature is not planned and should not be in the spec. + +--- + +### Updated `info.description` + +**Problem:** The original description was a single sentence: "The Wallet Address API is a simple REST API to get basic details about a wallet address." + +**Fix:** Replaced with a description that covers both purposes of the server (account details and cryptographic keys), lists the two endpoints, and links to the wallet addresses concepts page. + +## `resource-server.yaml` + +### Orphaned `wallet-address` tag + +**Problem:** The top-level `tags` array in `resource-server.yaml` declares a `wallet-address` tag, but no operations in this spec use it. The wallet address operations (`GET /wallet-address`, `GET /wallet-address/keys`) live in `wallet-address-server.yaml`, where they belong. + +The orphaned tag causes all three doc tools to render an empty "Wallet Addresses" section in the resource server reference, which is confusing. + +**Fix:** Removed the `wallet-address` entry from the `tags` array. Confirmed safe to remove by Max. + +--- + +### Anonymous `oneOf` objects in create outgoing payment request body + +**Problem:** The request body for `POST /outgoing-payments` uses a `oneOf` with two inline objects and no `title` fields, causing doc tools to render them as generic `object | object` labels. + +**Fix:** Added titles — `From quote` and `From incoming payment` — which accurately describe the two ways to create an outgoing payment. + +--- + +### Anonymous `oneOf` objects in create quote request body + +**Problem:** Same issue as above. The request body for `POST /quotes` uses a `oneOf` with three untitled inline objects. + +**Fix:** Added titles — `Receiver with incoming amount`, `With fixed-receive amount`, and `With fixed-send amount`. + +--- + +### Missing `title` on `ilp-payment-method` schema + +**Problem:** The `ilp-payment-method` component schema had no `title`, causing it to render as a generic `object` in doc tools. + +**Fix:** Added `title: ILP payment method`. + +--- + +### Updated `info.description` + +**Problem:** The resource server description was a long multi-paragraph block originally written when all resources lived in a single spec. It still referenced wallet address as one of four resource types, which is no longer accurate. + +**Fix:** Replaced with a concise description scoped to the three actual resource types (incoming payments, outgoing payments, quotes), a brief endpoint list, and a link the resources concepts page. diff --git a/docs/src/pages/apis/redoc/auth-server.astro b/docs/src/pages/apis/redoc/auth-server.astro new file mode 100644 index 00000000..c78fc7e7 --- /dev/null +++ b/docs/src/pages/apis/redoc/auth-server.astro @@ -0,0 +1,16 @@ +--- +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const html = fs.readFileSync( + path.resolve( + __dirname, + '../../../../public/apis/redoc/auth-server/index.html' + ), + 'utf-8' +) +--- + + diff --git a/docs/src/pages/apis/redoc/resource-server.astro b/docs/src/pages/apis/redoc/resource-server.astro new file mode 100644 index 00000000..26f13b14 --- /dev/null +++ b/docs/src/pages/apis/redoc/resource-server.astro @@ -0,0 +1,16 @@ +--- +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const html = fs.readFileSync( + path.resolve( + __dirname, + '../../../../public/apis/redoc/resource-server/index.html' + ), + 'utf-8' +) +--- + + diff --git a/docs/src/pages/apis/redoc/wallet-address-server.astro b/docs/src/pages/apis/redoc/wallet-address-server.astro new file mode 100644 index 00000000..752bfdcc --- /dev/null +++ b/docs/src/pages/apis/redoc/wallet-address-server.astro @@ -0,0 +1,16 @@ +--- +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const html = fs.readFileSync( + path.resolve( + __dirname, + '../../../../public/apis/redoc/wallet-address-server/index.html' + ), + 'utf-8' +) +--- + + diff --git a/docs/src/pages/apis/scalar/auth-server.astro b/docs/src/pages/apis/scalar/auth-server.astro new file mode 100644 index 00000000..7f6f863d --- /dev/null +++ b/docs/src/pages/apis/scalar/auth-server.astro @@ -0,0 +1,17 @@ +--- + +--- + + + + + Auth Server API | Open Payments + + + + + + + + diff --git a/docs/src/pages/apis/scalar/resource-server.astro b/docs/src/pages/apis/scalar/resource-server.astro new file mode 100644 index 00000000..345853f0 --- /dev/null +++ b/docs/src/pages/apis/scalar/resource-server.astro @@ -0,0 +1,17 @@ +--- + +--- + + + + + Resource Server API | Open Payments + + + + + + + + diff --git a/docs/src/pages/apis/scalar/wallet-address-server.astro b/docs/src/pages/apis/scalar/wallet-address-server.astro new file mode 100644 index 00000000..e42b1568 --- /dev/null +++ b/docs/src/pages/apis/scalar/wallet-address-server.astro @@ -0,0 +1,18 @@ +--- + +--- + + + + + Wallet Address Server API | Open Payments + + + + + + + + diff --git a/open-payments-specifications b/open-payments-specifications index c1de3307..70a36970 160000 --- a/open-payments-specifications +++ b/open-payments-specifications @@ -1 +1 @@ -Subproject commit c1de33071c874f1c481d65f2220d791073a1cb6d +Subproject commit 70a36970f132dd483e691e9d3190741abfdc41fb diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d27bd3e..ccda58a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,12 @@ importers: '@interledger/docs-design-system': specifier: ^0.11.0 version: 0.11.0 + '@scalar/astro': + specifier: ^0.2.4 + version: 0.2.4(astro@5.17.1) + '@scalar/core': + specifier: ^0.4.4 + version: 0.4.4 astro: specifier: 5.17.1 version: 5.17.1(typescript@5.9.3) @@ -72,6 +78,9 @@ importers: '@prettier/plugin-php': specifier: ^0.24.0 version: 0.24.0(prettier@3.8.1) + '@redocly/cli': + specifier: ^2.24.1 + version: 2.24.1(@opentelemetry/api@1.9.0)(core-js@3.49.0) '@typescript-eslint/parser': specifier: ^8.54.0 version: 8.54.0(eslint@9.39.2)(typescript@5.9.3) @@ -322,7 +331,6 @@ packages: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - dev: false /@babel/helper-string-parser@7.27.1: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} @@ -332,7 +340,6 @@ packages: /@babel/helper-validator-identifier@7.28.5: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - dev: false /@babel/parser@7.28.5: resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} @@ -347,7 +354,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - dev: false /@babel/types@7.28.5: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} @@ -408,6 +414,20 @@ packages: dev: false optional: true + /@emotion/is-prop-valid@1.4.0: + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + dependencies: + '@emotion/memoize': 0.9.0 + dev: true + + /@emotion/memoize@0.9.0: + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + dev: true + + /@emotion/unitless@0.10.0: + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + dev: true + /@esbuild/aix-ppc64@0.25.2: resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} @@ -765,6 +785,10 @@ packages: levn: 0.4.1 dev: true + /@exodus/schemasafe@1.3.0: + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + dev: true + /@expressive-code/core@0.41.2: resolution: {integrity: sha512-AJW5Tp9czbLqKMzwudL9Rv4js9afXBxkSGLmCNPq1iRgAYcx9NkTPJiSNCesjKRWoVC328AdSu6fqrD22zDgDg==} dependencies: @@ -798,6 +822,11 @@ packages: '@expressive-code/core': 0.41.2 dev: false + /@faker-js/faker@7.6.0: + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + dev: true + /@humanfs/core@0.19.1: resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -831,7 +860,6 @@ packages: /@humanwhocodes/momoa@2.0.4: resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} engines: {node: '>=10.10.0'} - dev: false /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} @@ -1149,6 +1177,11 @@ packages: langium: 3.3.1 dev: false + /@noble/hashes@1.8.0: + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1170,6 +1203,141 @@ packages: fastq: 1.19.1 dev: true + /@opentelemetry/api-logs@0.202.0: + resolution: {integrity: sha512-fTBjMqKCfotFWfLzaKyhjLvyEyq5vDKTTFfBmx21btv3gvy8Lq6N5Dh2OzqeuN4DjtpSvNT1uNVfg08eD2Rfxw==} + engines: {node: '>=8.0.0'} + dependencies: + '@opentelemetry/api': 1.9.0 + dev: true + + /@opentelemetry/api@1.9.0: + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + dev: true + + /@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + dev: true + + /@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.34.0 + dev: true + + /@opentelemetry/exporter-trace-otlp-http@0.202.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-/hKE8DaFCJuaQqE1IxpgkcjOolUIwgi3TgHElPVKGdGRBSmJMTmN/cr6vWa55pCJIXPyhKvcMrbrya7DZ3VmzA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + dev: true + + /@opentelemetry/otlp-exporter-base@0.202.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-nMEOzel+pUFYuBJg2znGmHJWbmvMbdX5/RhoKNKowguMbURhz0fwik5tUKplLcUtl8wKPL1y9zPnPxeBn65N0Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) + dev: true + + /@opentelemetry/otlp-transformer@0.202.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-5XO77QFzs9WkexvJQL9ksxL8oVFb/dfi9NWQSq7Sv0Efr9x3N+nb1iklP1TeVgxqJ7m1xWiC/Uv3wupiQGevMw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + dev: true + + /@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + dev: true + + /@opentelemetry/sdk-logs@0.202.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-pv8QiQLQzk4X909YKm0lnW4hpuQg4zHwJ4XBd5bZiXcd9urvrJNoNVKnxGHPiDVX/GiLFvr5DMYsDBQbZCypRQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.202.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + dev: true + + /@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + dev: true + + /@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + dev: true + + /@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + dev: true + + /@opentelemetry/semantic-conventions@1.34.0: + resolution: {integrity: sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==} + engines: {node: '>=14'} + dev: true + /@oslojs/encoding@1.1.0: resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} dev: false @@ -1233,6 +1401,49 @@ packages: prettier: 3.8.1 dev: true + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: true + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: true + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: true + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: true + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: true + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: true + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: true + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: true + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: true + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: true + /@readme/better-ajv-errors@2.3.2(ajv@8.12.0): resolution: {integrity: sha512-T4GGnRAlY3C339NhoUpgJJFsMYko9vIgFAlhgV+/vEGFw66qEY4a4TRJIAZBcX/qT1pq5DvXSme+SQODHOoBrw==} engines: {node: '>=18'} @@ -1268,6 +1479,128 @@ packages: engines: {node: '>=18'} dev: false + /@redocly/ajv@8.11.2: + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + 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 + dev: true + + /@redocly/ajv@8.18.0: + resolution: {integrity: sha512-F+LMD2IDIXuHxgpLJh3nkLj9+tSaEzoUWd+7fONGq5pe2169FUDjpEkOfEpoGLz1sbZni/69p07OsecNfAOpqA==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + dev: true + + /@redocly/cli@2.24.1(@opentelemetry/api@1.9.0)(core-js@3.49.0): + resolution: {integrity: sha512-GTAKMPtyvO7vn3CrSp8Q5SJlMUr8q6wgMN/J4K5owphyp5gOQCZqMySyWcq+V5RPPXkTuIHZYEzgnecB6RF2bQ==} + engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} + hasBin: true + dependencies: + '@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.34.0 + '@redocly/openapi-core': 2.24.1 + '@redocly/respect-core': 2.24.1 + abort-controller: 3.0.0 + ajv: /@redocly/ajv@8.18.0 + ajv-formats: 3.0.1(@redocly/ajv@8.18.0) + colorette: 1.4.0 + cookie: 0.7.2 + dotenv: 16.4.7 + glob: 13.0.6 + handlebars: 4.7.8 + https-proxy-agent: 7.0.6 + mobx: 6.15.0 + picomatch: 4.0.3 + pluralize: 8.0.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + redoc: 2.5.1(core-js@3.49.0)(mobx@6.15.0)(react-dom@19.2.4)(react@19.2.4)(styled-components@6.3.9) + semver: 7.7.3 + set-cookie-parser: 2.7.2 + simple-websocket: 9.1.0 + styled-components: 6.3.9(react-dom@19.2.4)(react@19.2.4) + ulid: 3.0.2 + undici: 6.24.0 + yargs: 17.0.1 + transitivePeerDependencies: + - '@opentelemetry/api' + - bufferutil + - core-js + - encoding + - react-native + - supports-color + - utf-8-validate + dev: true + + /@redocly/config@0.22.0: + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + dev: true + + /@redocly/config@0.44.1: + resolution: {integrity: sha512-l6/ZE+/RBfNDdhzltau6cbW8+k5PgJbJBMqaBrlQlZQlmGBHMxqGyDaon4dPLj0jdi37gsMQ3yf95JBY/vaDSg==} + dependencies: + json-schema-to-ts: 2.7.2 + dev: true + + /@redocly/openapi-core@1.34.11: + resolution: {integrity: sha512-V09ayfnb5GyysmvARbt+voFZAjGcf7hSYxOYxSkCc4fbH/DTfq5YWoec8cflvmHHqyIFbqvmGKmYFzqhr9zxDg==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6 + js-levenshtein: 1.1.6 + js-yaml: 4.1.1 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + dev: true + + /@redocly/openapi-core@2.24.1: + resolution: {integrity: sha512-Iqc/4DI/CIQkKys8HRHkX+bpF/UosVUE7lc7tuxIOKzVIOk5QhQMglbd2yzbAYgJF7YAtCDDAKWosvXnvTTWsA==} + engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} + dependencies: + '@redocly/ajv': 8.18.0 + '@redocly/config': 0.44.1 + ajv: /@redocly/ajv@8.18.0 + ajv-formats: 3.0.1(@redocly/ajv@8.18.0) + colorette: 1.4.0 + js-levenshtein: 1.1.6 + js-yaml: 4.1.1 + picomatch: 4.0.3 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + dev: true + + /@redocly/respect-core@2.24.1: + resolution: {integrity: sha512-WMeg9TmAc0ZINp6Tza+ZWhMuIBM28us6ZyLj5DKWZhkBZhKaTNhXlmTYES11uM35eie+mYZStTov4vXYL//wqg==} + engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} + dependencies: + '@faker-js/faker': 7.6.0 + '@noble/hashes': 1.8.0 + '@redocly/ajv': 8.18.0 + '@redocly/openapi-core': 2.24.1 + ajv: /@redocly/ajv@8.18.0 + better-ajv-errors: 1.2.0(@redocly/ajv@8.18.0) + colorette: 2.0.20 + json-pointer: 0.6.2 + jsonpath-rfc9535: 1.3.0 + openapi-sampler: 1.7.2 + outdent: 0.8.0 + picomatch: 4.0.3 + dev: true + /@rollup/pluginutils@5.3.0: resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -1442,6 +1775,38 @@ packages: dev: false optional: true + /@scalar/astro@0.2.4(astro@5.17.1): + resolution: {integrity: sha512-5nlUsC6tbR6bOq+WT2NDbc6yOVmysZE2L9Vq9t3YgV0Q6m96sCmfmdTsWKEM82ZrqMSTVZPnOMYvPZZTXVothA==} + engines: {node: '>=22'} + peerDependencies: + astro: ^4.0.0 || ^5.0.0 + dependencies: + '@scalar/core': 0.4.4 + astro: 5.17.1(typescript@5.9.3) + dev: false + + /@scalar/core@0.4.4: + resolution: {integrity: sha512-eXIG0opyQn45FzpTp0dAWFP1Vjcx+helgUAsa0uN36tyUR7DSmz2kRwHqqedzvPWryeRCKPz7/vwzKpETZp5lg==} + engines: {node: '>=22'} + dependencies: + '@scalar/types': 0.7.4 + dev: false + + /@scalar/helpers@0.4.2: + resolution: {integrity: sha512-IrgrGVSahCfYDNWITazz4Q1BOndp5eEzlimRkfxiYn++KqeWyLfALyym1omqcdKGYtiSx1KIbKaUJL9vkjaN7w==} + engines: {node: '>=22'} + dev: false + + /@scalar/types@0.7.4: + resolution: {integrity: sha512-1o9uf42lZ9YD0XP/HMWrwXN0unx6vFTTgtduA1F28Yloea9Pfv9N2R/t0wO91iSIzw4+NubEFolunbdb2QcgHA==} + engines: {node: '>=22'} + dependencies: + '@scalar/helpers': 0.4.2 + nanoid: 5.1.7 + type-fest: 5.5.0 + zod: 4.3.6 + dev: false + /@shikijs/core@3.21.0: resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==} dependencies: @@ -1738,7 +2103,6 @@ packages: resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 - dev: false /@types/picomatch@3.0.2: resolution: {integrity: sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==} @@ -1754,10 +2118,13 @@ packages: resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} dev: true + /@types/stylis@4.2.7: + resolution: {integrity: sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==} + dev: true + /@types/trusted-types@2.0.7: resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} requiresBuild: true - dev: false optional: true /@types/unist@2.0.8: @@ -2062,6 +2429,13 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + /acorn-jsx@5.3.2(acorn@8.15.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2074,6 +2448,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + dev: true + /ajv-draft-04@1.0.0(ajv@8.12.0): resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -2085,6 +2464,17 @@ packages: ajv: 8.12.0 dev: false + /ajv-formats@3.0.1(@redocly/ajv@8.18.0): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: /@redocly/ajv@8.18.0 + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -2329,6 +2719,11 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + dev: true + /base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} dev: false @@ -2345,6 +2740,20 @@ packages: is-decimal: 2.0.1 dev: false + /better-ajv-errors@1.2.0(@redocly/ajv@8.18.0): + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + dependencies: + '@babel/code-frame': 7.26.2 + '@humanwhocodes/momoa': 2.0.4 + ajv: /@redocly/ajv@8.18.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false @@ -2376,6 +2785,13 @@ packages: balanced-match: 1.0.2 dev: true + /brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} + dependencies: + balanced-match: 4.0.4 + dev: true + /braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -2383,6 +2799,10 @@ packages: fill-range: 7.1.1 dev: true + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2393,6 +2813,10 @@ packages: engines: {node: '>=16'} dev: false + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: true + /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false @@ -2458,15 +2882,26 @@ packages: engines: {node: '>=8'} dev: false + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + dev: true + /cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} dev: false + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + /clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - dev: false /collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -2483,6 +2918,14 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false @@ -2522,11 +2965,21 @@ packages: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} dev: false + /cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + dev: true + /cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} dev: false + /core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + requiresBuild: true + dev: true + /cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} dependencies: @@ -2554,6 +3007,11 @@ packages: uncrypto: 0.1.3 dev: false + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + dev: true + /css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} dependencies: @@ -2568,6 +3026,14 @@ packages: resolution: {integrity: sha512-pnmS1dbKsz6KA4EW4BznyPL2xxkNDRg62hcD0v8g6DEw2W7hxOln5M953jsp9hmw5Dg57S6o/A8GOn37mbAgcQ==} dev: false + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: true + /css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -2601,6 +3067,10 @@ packages: css-tree: 2.2.1 dev: false + /csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + dev: true + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.3): resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -2941,6 +3411,10 @@ packages: dependencies: ms: 2.1.3 + /decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + dev: true + /decode-named-character-reference@1.1.0: resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} dependencies: @@ -3043,7 +3517,6 @@ packages: resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} optionalDependencies: '@types/trusted-types': 2.0.7 - dev: false /domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} @@ -3053,6 +3526,11 @@ packages: domhandler: 5.0.3 dev: false + /dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dev: true + /dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -3064,7 +3542,6 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} @@ -3085,6 +3562,10 @@ packages: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} dev: false + /es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + /esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} dependencies: @@ -3136,6 +3617,11 @@ packages: '@esbuild/win32-x64': 0.25.2 dev: false + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -3421,9 +3907,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false /expressive-code@0.41.2: resolution: {integrity: sha512-aLZiZaqorRtNExtGpUjK9zFH9aTpWeoTXMyLo4b4IcuXfPqtLPPxhRm/QlPb8QqIcMMXnSiGRHSFpQfX0m7HJw==} @@ -3464,6 +3954,29 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: true + + /fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + dev: true + + /fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + dependencies: + path-expression-matcher: 1.2.0 + dev: true + + /fast-xml-parser@5.5.8: + resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} + hasBin: true + dependencies: + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.2.0 + strnum: 2.2.1 + dev: true + /fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} dependencies: @@ -3549,6 +4062,10 @@ packages: tiny-inflate: 1.0.3 dev: false + /foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + dev: true + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -3561,6 +4078,11 @@ packages: dev: false optional: true + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + /get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} @@ -3584,6 +4106,15 @@ packages: is-glob: 4.0.3 dev: true + /glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + dependencies: + minimatch: 10.2.4 + minipass: 7.1.3 + path-scurry: 2.0.2 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3657,6 +4188,19 @@ packages: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} dev: false + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + dev: true + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3918,6 +4462,20 @@ packages: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} dev: false + /http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + dev: true + + /https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: true + /i18next@23.16.5: resolution: {integrity: sha512-KTlhE3EP9x6pPTAW7dy0WKIhoCpfOGhRQlO+jttQLgzVaoOjWwBWramu7Pp0i+8wDNduuzXfe3kkVbzrKyrbTA==} dependencies: @@ -4025,7 +4583,6 @@ packages: /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: false /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -4072,9 +4629,13 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -4093,22 +4654,40 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + /json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + dependencies: + foreach: 2.0.6 dev: true - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false + /json-schema-to-ts@2.7.2: + resolution: {integrity: sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.26.0 + '@types/json-schema': 7.0.15 + ts-algebra: 1.2.2 + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /jsonpath-rfc9535@1.3.0: + resolution: {integrity: sha512-3jFHya7oZ45aDxIIdx+/zQARahHXxFSMWBkcBUldfXpLS9VCXDJyTKt35kQfEXLqh0K3Ixw/9xFnvcDStaxh7Q==} + engines: {node: '>=20'} + dev: true + /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - dev: false /katex@0.16.28: resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} @@ -4168,7 +4747,6 @@ packages: /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} - dev: false /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -4206,14 +4784,28 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + dev: true + /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} dev: false + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + /lru-cache@11.2.5: resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} engines: {node: 20 || >=22} - dev: false + + /lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: true /magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -4229,6 +4821,10 @@ packages: source-map-js: 1.2.1 dev: false + /mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + dev: true + /markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -4244,6 +4840,12 @@ packages: hasBin: true dev: false + /marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + dev: true + /mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} dependencies: @@ -4882,12 +5484,26 @@ packages: picomatch: 2.3.1 dev: true + /minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} + dependencies: + brace-expansion: 5.0.4 + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true + /minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.2 + dev: true + /minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -4895,6 +5511,15 @@ packages: brace-expansion: 2.0.2 dev: true + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} dependencies: @@ -4904,6 +5529,48 @@ packages: ufo: 1.6.1 dev: false + /mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.4)(react@19.2.4): + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + mobx: 6.15.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + use-sync-external-store: 1.6.0(react@19.2.4) + dev: true + + /mobx-react@9.2.0(mobx@6.15.0)(react-dom@19.2.4)(react@19.2.4): + resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + mobx: 6.15.0 + mobx-react-lite: 4.1.1(mobx@6.15.0)(react-dom@19.2.4)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + dev: true + + /mobx@6.15.0: + resolution: {integrity: sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==} + dev: true + /mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -4917,6 +5584,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@5.1.7: + resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + engines: {node: ^18 || >=20} + hasBin: true + dev: false + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -4925,6 +5598,10 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + /neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} @@ -4936,14 +5613,39 @@ packages: '@types/nlcst': 2.0.3 dev: false + /node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + dependencies: + http2-client: 1.3.5 + dev: true + /node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} dev: false + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} dev: false + /node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + dependencies: + es6-promise: 3.3.1 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4959,6 +5661,53 @@ packages: boolbase: 1.0.0 dev: false + /oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + dependencies: + fast-safe-stringify: 2.1.1 + dev: true + + /oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.2 + dev: true + + /oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.0.1 + dev: true + + /oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + dev: true + + /oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.2 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + /ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} dependencies: @@ -4989,6 +5738,14 @@ packages: regex-recursion: 6.0.2 dev: false + /openapi-sampler@1.7.2: + resolution: {integrity: sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g==} + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.5.8 + json-pointer: 0.6.2 + dev: true + /openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} dev: false @@ -5005,6 +5762,10 @@ packages: word-wrap: 1.2.5 dev: true + /outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + dev: true + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -5095,6 +5856,10 @@ packages: entities: 4.5.0 dev: false + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + /path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} dev: false @@ -5104,6 +5869,11 @@ packages: engines: {node: '>=8'} dev: true + /path-expression-matcher@1.2.0: + resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + engines: {node: '>=14.0.0'} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -5114,6 +5884,14 @@ packages: engines: {node: '>=8'} dev: true + /path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + dependencies: + lru-cache: 11.2.5 + minipass: 7.1.3 + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5123,6 +5901,10 @@ packages: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} dev: false + /perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + dev: true + /php-parser@3.2.5: resolution: {integrity: sha512-M1ZYlALFFnESbSdmRtTQrBFUHSriHgPhgqtTF/LCbZM4h7swR5PHtUceB2Kzby5CfqcsYwBn7OXTJ0+8Sajwkw==} dev: true @@ -5158,6 +5940,11 @@ packages: pathe: 2.0.3 dev: false + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + /points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} dev: false @@ -5169,6 +5956,13 @@ packages: points-on-curve: 0.2.0 dev: false + /polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.26.0 + dev: true + /postcss-nested@6.0.1(postcss@8.5.3): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} @@ -5195,6 +5989,19 @@ packages: util-deprecate: 1.0.2 dev: true + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: true + /postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -5232,7 +6039,6 @@ packages: /prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} - dev: false /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -5242,6 +6048,14 @@ packages: sisteransi: 1.0.5 dev: false + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + /property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} dev: false @@ -5250,6 +6064,25 @@ packages: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} dev: false + /protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.12.7 + long: 5.3.2 + dev: true + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -5266,6 +6099,49 @@ packages: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} dev: false + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /react-dom@19.2.4(react@19.2.4): + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-tabs@6.1.0(react@19.2.4): + resolution: {integrity: sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.2.4 + dev: true + + /react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + /readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -5309,9 +6185,54 @@ packages: vfile: 6.0.3 dev: false + /redoc@2.5.1(core-js@3.49.0)(mobx@6.15.0)(react-dom@19.2.4)(react@19.2.4)(styled-components@6.3.9): + resolution: {integrity: sha512-LmqA+4A3CmhTllGG197F0arUpmChukAj9klfSdxNRemT9Hr07xXr7OGKu4PHzBs359sgrJ+4JwmOlM7nxLPGMg==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + dependencies: + '@redocly/openapi-core': 1.34.11 + classnames: 2.5.1 + core-js: 3.49.0 + decko: 1.2.0 + dompurify: 3.2.6 + eventemitter3: 5.0.1 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.15.0 + mobx-react: 9.2.0(mobx@6.15.0)(react-dom@19.2.4)(react@19.2.4) + openapi-sampler: 1.7.2 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-tabs: 6.1.0(react@19.2.4) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.3.9(react-dom@19.2.4)(react@19.2.4) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + dev: true + + /reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + dev: true + /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false /regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -5496,10 +6417,14 @@ packages: unified: 11.0.5 dev: false + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: false /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -5609,6 +6534,10 @@ packages: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} dev: true + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false @@ -5623,6 +6552,10 @@ packages: resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} dev: false + /scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + dev: true + /semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -5634,6 +6567,14 @@ packages: engines: {node: '>=10'} hasBin: true + /set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + dev: true + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: true + /sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -5694,6 +6635,58 @@ packages: '@types/hast': 3.0.4 dev: false + /should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + dependencies: + should-type: 1.4.0 + dev: true + + /should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + dev: true + + /should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + dev: true + + /should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + dev: true + + /should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + dev: true + + /should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + dev: true + + /simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + dependencies: + debug: 4.4.3 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false @@ -5715,6 +6708,11 @@ packages: engines: {node: '>=8'} dev: true + /slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + dev: true + /smol-toml@1.5.2: resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} engines: {node: '>= 18'} @@ -5729,6 +6727,11 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} @@ -5790,6 +6793,10 @@ packages: - openapi-types dev: false + /stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + dev: true + /stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} dev: false @@ -5801,7 +6808,6 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: false /string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} @@ -5812,6 +6818,12 @@ packages: strip-ansi: 7.1.0 dev: false + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} dependencies: @@ -5837,6 +6849,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum@2.2.1: + resolution: {integrity: sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==} + dev: true + /style-to-object@0.4.2: resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} dependencies: @@ -5849,9 +6865,31 @@ packages: inline-style-parser: 0.2.2 dev: false + /styled-components@6.3.9(react-dom@19.2.4)(react@19.2.4): + resolution: {integrity: sha512-J72R4ltw0UBVUlEjTzI0gg2STOqlI9JBhQOL4Dxt7aJOnnSesy0qJDn4PYfMCafk9cWOaVg129Pesl5o+DIh0Q==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + '@emotion/is-prop-valid': 1.4.0 + '@emotion/unitless': 0.10.0 + '@types/stylis': 4.2.7 + css-to-react-native: 3.2.0 + csstype: 3.2.3 + postcss: 8.4.49 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + shallowequal: 1.1.0 + stylis: 4.3.6 + tslib: 2.8.1 + dev: true + /stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - dev: false /suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} @@ -5893,6 +6931,25 @@ packages: sax: 1.4.3 dev: false + /swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.0.1 + transitivePeerDependencies: + - encoding + dev: true + /synckit@0.11.11: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5900,6 +6957,11 @@ packages: '@pkgr/core': 0.2.9 dev: true + /tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + dev: false + /terminal-link@5.0.0: resolution: {integrity: sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==} engines: {node: '>=20'} @@ -5935,6 +6997,10 @@ packages: is-number: 7.0.0 dev: true + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -5943,6 +7009,10 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false + /ts-algebra@1.2.2: + resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} + dev: true + /ts-api-utils@2.4.0(typescript@5.9.3): resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} @@ -5977,8 +7047,6 @@ packages: /tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} requiresBuild: true - dev: false - optional: true /tsutils@3.21.0(typescript@5.8.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -6007,6 +7075,13 @@ packages: engines: {node: '>=16'} dev: false + /type-fest@5.5.0: + resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} + engines: {node: '>=20'} + dependencies: + tagged-tag: 1.0.0 + dev: false + /typescript-eslint@8.54.0(eslint@9.39.2)(typescript@5.9.3): resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6043,6 +7118,19 @@ packages: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} dev: false + /uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /ulid@3.0.2: + resolution: {integrity: sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w==} + hasBin: true + dev: true + /ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} dev: false @@ -6053,7 +7141,11 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: false + + /undici@6.24.0: + resolution: {integrity: sha512-lVLNosgqo5EkGqh5XUDhGfsMSoO8K0BAN0TyJLvwNRSl4xWGZlCVYsAIpa/OpA3TvmnM01GWcoKmc3ZWo5wKKA==} + engines: {node: '>=18.17'} + dev: true /unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -6220,16 +7312,32 @@ packages: ufo: 1.6.3 dev: false + /uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 + /url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + dev: true + /url-template@3.1.1: resolution: {integrity: sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /use-sync-external-store@1.6.0(react@19.2.4): + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 19.2.4 + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6355,6 +7463,17 @@ packages: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + /which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} @@ -6380,6 +7499,19 @@ packages: engines: {node: '>=0.10.0'} dev: true + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrap-ansi@9.0.0: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} @@ -6393,15 +7525,60 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} dev: false + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: false + /yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -6446,6 +7623,10 @@ packages: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} dev: false + /zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + dev: false + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false