diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 3a4e647..83780a5 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,18 +1,62 @@
version: 2
+# Every entry waits a week after a release before proposing it (`cooldown`). A
+# release that is malicious or broken is usually withdrawn within days, and
+# nothing on these sites needs to be first to adopt one. Security updates ignore
+# the cooldown.
updates:
+ # Version updates open against staging, where the previews are reviewed;
+ # staging is promoted to main by hand. Security updates always target the
+ # default branch whatever this says, so retarget those to staging.
- package-ecosystem: npm
directory: "/"
+ target-branch: staging
schedule:
interval: weekly
day: monday
+ cooldown:
+ default-days: 7
labels:
- dependencies
+ groups:
+ # Astro, its integrations and the packages that render inside it move
+ # together. Bumped one at a time, each pull request tests a combination
+ # nobody will ship, and a peer-range mismatch fails all of them.
+ astro:
+ patterns:
+ - "astro"
+ - "@astrojs/*"
+ - "@scalar/*"
+ - "vue"
+ # Everything else in one weekly pull request, minor and patch only. A
+ # major version arrives on its own, so its changes are read on their own.
+ minor-and-patch:
+ patterns:
+ - "*"
+ update-types:
+ - minor
+ - patch
+ ignore:
+ # `astro check` refuses TypeScript 7.0 by name ("install TypeScript 6
+ # instead"), and its successor needs TypeScript 7.1 or later. Lift this
+ # when the checker supports the release Dependabot proposes.
+ - dependency-name: typescript
+ versions:
+ - "7.0.x"
- package-ecosystem: github-actions
directory: "/"
+ target-branch: staging
schedule:
interval: weekly
day: monday
+ cooldown:
+ default-days: 7
labels:
- dependencies
- ci
+ groups:
+ # The workflows pin each action to a commit, so a bump touches several
+ # files at once; one pull request per week keeps them consistent.
+ actions:
+ patterns:
+ - "*"
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 4cd0256..d0dfc63 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -8,8 +8,8 @@
## Checklist
-CI runs these on the pull request; run them locally first, since a push to
-`staging` alone runs no CI. Links, spacing, llms.txt and sitemaps read the build, so build first.
+CI runs these on the pull request and again on the push that lands it on `staging`
+or `main`. Links, spacing, llms.txt and sitemaps read the build, so build first.
- [ ] `pnpm -r build` and `pnpm -r check`
- [ ] `pnpm run check:links`, `check:spacing`, `check:leakage`, `check:llms` and `check:sitemaps`
diff --git a/.github/workflows/advisories.yml b/.github/workflows/advisories.yml
new file mode 100644
index 0000000..644d146
--- /dev/null
+++ b/.github/workflows/advisories.yml
@@ -0,0 +1,47 @@
+name: Advisories
+
+# A new advisory against an unchanged lockfile reaches nobody otherwise.
+#
+# The audit step in ci.yml runs on pull requests and pushes, so it answers "is
+# this change safe" and nothing else. npm advisories are published against
+# packages already in the lockfile: the tree does not change, no run is
+# triggered, and the first anyone hears of it is the next pull request, which
+# then fails for a reason it did not cause. That is how six Dependabot pull
+# requests went red in October 2026.
+#
+# This run exists to fail on a day when nothing was committed. It reads the
+# committed pnpm-lock.yaml only, so it needs no install and no build.
+
+on:
+ schedule:
+ # 06:20 UTC daily, after the dpp-core and dpp-engine scans and clear of the
+ # nightly API-spec sync.
+ - cron: '20 6 * * *'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ advisories:
+ name: npm advisories against the committed lockfile
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - name: Checkout
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ with:
+ persist-credentials: false
+
+ - name: Enable Corepack
+ run: corepack enable
+
+ - name: Set up Node.js
+ uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
+ with:
+ node-version-file: .node-version
+
+ # The same level the pull-request gate uses, so a finding here is one a
+ # pull request would also fail on.
+ - name: Audit dependencies
+ run: pnpm audit --audit-level high
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f58fec5..acda31a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,7 +2,7 @@ name: CI
on:
push:
- branches: [main]
+ branches: [main, staging]
pull_request:
# The job builds and inspects; it never writes to the repository. Without this
@@ -21,6 +21,9 @@ concurrency:
jobs:
build:
runs-on: ubuntu-latest
+ # A full run takes a minute or two. Without a limit a hung step holds the
+ # runner for GitHub's default of six hours.
+ timeout-minutes: 30
steps:
# Full history: each sitemap is the last commit that changed its
# page (scripts/git-lastmod.mjs), and a shallow clone knows one commit.
@@ -28,6 +31,7 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
fetch-depth: 0
+ persist-credentials: false
# The vendored OpenAPI spec is a copy of the engine's. Without the source
# beside it there is nothing to compare against, and a drift check that
@@ -58,9 +62,9 @@ jobs:
run: corepack enable
- name: Set up Node.js
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
+ uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
- node-version: 24.18.0
+ node-version-file: .node-version
cache: pnpm
- name: Install dependencies
diff --git a/.github/workflows/external-links.yml b/.github/workflows/external-links.yml
index 1da436f..a5a75d3 100644
--- a/.github/workflows/external-links.yml
+++ b/.github/workflows/external-links.yml
@@ -22,14 +22,16 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ with:
+ persist-credentials: false
- name: Enable Corepack
run: corepack enable
- name: Set up Node.js
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
+ uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
- node-version: 24.18.0
+ node-version-file: .node-version
cache: pnpm
- name: Install dependencies
diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml
new file mode 100644
index 0000000..b089afa
--- /dev/null
+++ b/.github/workflows/pr-title.yml
@@ -0,0 +1,74 @@
+# A squashed pull request *is* a commit, and its title becomes that commit's
+# subject on staging and then on main. Titles here have reached history as prose
+# ("Home page redesign, community page, checklists and roadmap additions",
+# "staging → main: the dpp-web audit remediation") because nothing checked them.
+# dpp-core and dpp-engine gate the same rule; this brings the sites in line.
+#
+# The check sits on the title because that is the field the squash reads.
+name: PR title
+
+on:
+ pull_request:
+ # `edited` matters as much as `opened`: a title corrected after review must
+ # re-run, and a title broken after approval must fail.
+ types: [opened, edited, synchronize, reopened]
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ conventional-commit:
+ name: PR title is a conventional commit
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ steps:
+ - name: Check title
+ env:
+ # Passed as an environment variable, never interpolated into the
+ # script body. A PR title is attacker-controlled text, and a
+ # `${{ … }}` expression inside `run:` is substituted before bash sees
+ # it, so a title containing a quote and a semicolon would execute.
+ TITLE: ${{ github.event.pull_request.title }}
+ # The repo's own name is not a scope: a repo's history is already
+ # scoped to that repo.
+ FORBIDDEN_SCOPES: 'web|dpp-web'
+ run: |
+ set -euo pipefail
+
+ TYPES='build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test'
+
+ printf 'title: %s\n\n' "$TITLE"
+
+ if ! printf '%s' "$TITLE" | grep -qE "^(${TYPES})(\([a-z0-9._,-]+\))?!?: .+"; then
+ printf '::error::PR title is not a conventional commit\n'
+ printf '\n'
+ printf 'Expected: type(scope): subject\n'
+ printf 'Got: %s\n' "$TITLE"
+ printf '\n'
+ printf 'type must be one of: %s\n' "${TYPES//|/, }"
+ printf 'scope is optional, lowercase, and names the area touched\n'
+ printf '(landing, docs, seo, ci, deps) rather than the repo. Several may\n'
+ printf 'be comma-separated: chore(landing,docs).\n'
+ printf '\n'
+ printf 'This title becomes the squash commit subject.\n'
+ exit 1
+ fi
+
+ SCOPE=$(printf '%s' "$TITLE" | sed -nE "s/^(${TYPES})\(([a-z0-9._,-]+)\).*/\2/p")
+ if [ -n "$SCOPE" ] && printf '%s' "$SCOPE" | grep -qE "^(${FORBIDDEN_SCOPES})$"; then
+ printf '::error::Scope %s is this repository own name\n' "$SCOPE"
+ printf 'Use the area touched: landing, docs, seo, ci.\n'
+ exit 1
+ fi
+
+ # Advisory only. The squash appends " (#NN)", whose width varies, so a
+ # hard limit here would reject titles that end up fine.
+ if [ "${#TITLE}" -gt 50 ]; then
+ printf '::warning::Title is %s characters; the convention is under 50 before the (#NN) suffix\n' "${#TITLE}"
+ fi
+
+ printf 'OK\n'
diff --git a/.github/workflows/sync-openapi.yml b/.github/workflows/sync-openapi.yml
index 8887dad..b154d76 100644
--- a/.github/workflows/sync-openapi.yml
+++ b/.github/workflows/sync-openapi.yml
@@ -40,7 +40,11 @@ jobs:
steps:
# Work lands through staging (see the README), so the bump is made on top
# of staging and proposed into it, not into main.
- - name: Checkout
+ #
+ # This is the one checkout that keeps its credentials: the last step pushes
+ # the bump branch with them. Nothing in the job uploads an artifact, which
+ # is how persisted credentials leak, so the finding is accepted here.
+ - name: Checkout # zizmor: ignore[artipacked]
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
ref: staging
@@ -59,9 +63,9 @@ jobs:
run: corepack enable
- name: Set up Node.js
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
+ uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
- node-version: 24.18.0
+ node-version-file: .node-version
cache: pnpm
- name: Install dependencies
diff --git a/.github/workflows/workflow-lint.yml b/.github/workflows/workflow-lint.yml
new file mode 100644
index 0000000..11a0a18
--- /dev/null
+++ b/.github/workflows/workflow-lint.yml
@@ -0,0 +1,96 @@
+name: Workflow lint
+
+# Static analysis of the workflows themselves, the same gate dpp-core runs.
+#
+# Several workflows here hold something worth taking: `sync-openapi.yml` can
+# write to the repository and open pull requests, `deploy.yml` holds a Cloudflare
+# API token, and every build runs `pnpm install`, which executes third-party
+# install scripts with a token in reach. Two tools, because they find different
+# things:
+#
+# zizmor security: credentials left in `.git/config` by a checkout, actions
+# that are not pinned or whose pinned commit is not in the
+# repository it names, an action with a published advisory,
+# expressions that inject into a shell, and Dependabot settings.
+# actionlint correctness: workflow syntax, expression types, and the shell
+# inside every `run:` (it runs `shellcheck` where that is installed,
+# which it is on the runner).
+#
+# The one accepted finding is marked where it occurs: `sync-openapi.yml` keeps
+# its checkout credentials because it pushes with them. The default `regular`
+# persona gates. The `pedantic` one, which reports code smells such as a missing
+# `concurrency` block, is deliberately not.
+#
+# Both tools are downloaded from their release and checked against the SHA-256
+# recorded here, the same versions and hashes dpp-core pins, so the bytes that
+# run are the bytes that were read. Dependabot cannot see either pin; moving one
+# is a deliberate edit, on a pull request of its own, because a newer version may
+# find something the pinned one does not.
+#
+# Not path-filtered, so it can be made a required check without blocking every
+# pull request that leaves `.github/` alone. The weekly run covers the other way
+# a workflow goes bad: an advisory published against an action already pinned
+# here, with no commit to trigger anything.
+on:
+ push:
+ branches: [main, staging]
+ pull_request:
+ schedule:
+ - cron: "0 5 * * 1"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
+
+env:
+ ZIZMOR_VERSION: "1.30.1"
+ ZIZMOR_SHA256: e65324f4430c2717591937edcec90ccbefaf14c174f8ec9415e03ca875b46e1a
+ ACTIONLINT_VERSION: "1.7.12"
+ ACTIONLINT_SHA256: 8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8
+
+jobs:
+ zizmor:
+ name: Workflows pass zizmor
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ with:
+ persist-credentials: false
+ - name: Install zizmor
+ run: |
+ curl -fsSL -o zizmor.tar.gz "https://github.com/zizmorcore/zizmor/releases/download/v${ZIZMOR_VERSION}/zizmor-x86_64-unknown-linux-gnu.tar.gz"
+ echo "${ZIZMOR_SHA256} zizmor.tar.gz" | sha256sum -c -
+ mkdir -p "$RUNNER_TEMP/bin"
+ tar -xzf zizmor.tar.gz -C "$RUNNER_TEMP/bin" zizmor
+ echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
+ # The token lets zizmor ask GitHub the questions it cannot answer from the
+ # files: whether a pinned commit belongs to the repository it names, and
+ # whether an action has a published advisory. It is the workflow's own
+ # read-only token, and nothing here writes.
+ - name: zizmor
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: zizmor --format github .github
+
+ actionlint:
+ name: Workflows pass actionlint
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ with:
+ persist-credentials: false
+ - name: Install actionlint
+ run: |
+ curl -fsSL -o actionlint.tar.gz "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz"
+ echo "${ACTIONLINT_SHA256} actionlint.tar.gz" | sha256sum -c -
+ mkdir -p "$RUNNER_TEMP/bin"
+ tar -xzf actionlint.tar.gz -C "$RUNNER_TEMP/bin" actionlint
+ echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
+ - name: actionlint
+ run: actionlint -color
diff --git a/.node-version b/.node-version
new file mode 100644
index 0000000..ca5c350
--- /dev/null
+++ b/.node-version
@@ -0,0 +1 @@
+24.18.0
diff --git a/README.md b/README.md
index d819051..91d0def 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,45 @@
-# Odal Node Web
+# dpp-web
+
+The two Odal Node websites, [odal-node.io](https://odal-node.io) and
+[docs.odal-node.io](https://docs.odal-node.io), as one pnpm workspace under the Apache
+License 2.0. Each site is an Astro project deployed as its own Cloudflare Pages
+project, and both share one set of brand tokens.
-[](LICENSE)
[](https://github.com/odal-node/dpp-web/actions/workflows/ci.yml)
-[](https://nodejs.org/)
+[](https://github.com/odal-node/dpp-web/actions/workflows/advisories.yml)
+[](https://github.com/odal-node/dpp-web/actions/workflows/external-links.yml)
+[](LICENSE)
+[](.node-version)
+[](site/dpp-landing/package.json)
+[](https://odal-node.io)
+[](https://docs.odal-node.io)
+
+> [!NOTE]
+> **Status: pre-production.** The sites describe software that no operator runs
+> against real product data yet. Every change lands on `staging` and is reviewed on
+> its previews before it is promoted to `main`, which is what the sites serve.
+
+## Quick start
+
+Node (the version in `.node-version`; `package.json` states the minimum) and pnpm,
+which corepack installs at the version `package.json` pins.
+
+```bash
+corepack enable
+pnpm install
+pnpm dev:landing # http://localhost:4321
+pnpm dev:docs # http://localhost:4325; run both and they link to each other
+```
+
+To check what you changed the way CI will, build first: several checks read the build.
-The two Odal Node websites, as one pnpm workspace deployed as two Cloudflare Pages projects.
+```bash
+pnpm -r build
+pnpm -r check
+pnpm run check:links
+```
+
+## How it fits together
| Folder | Site | Stack | Pages project |
|---|---|---|---|
@@ -14,24 +49,32 @@ The two Odal Node websites, as one pnpm workspace deployed as two Cloudflare Pag
Each site has its own README for its layout and Pages build settings.
-## Develop
+Some pages are generated from data copied out of the other repositories at a pinned
+commit, so a page cannot describe the software differently from its source:
-Node 22.13+ and pnpm (version pinned in `package.json`, via corepack).
+| What | Pin | Refresh |
+|---|---|---|
+| Product groups and EU acts from `dpp-core`, with a copy of the acts in `site/dpp-docs/src/data/instruments` for the docs | `site/dpp-landing/core-source.json` | `pnpm --filter dpp-landing run sync:core` |
+| API spec from `dpp-engine` | `site/dpp-docs/openapi-source.json` | `pnpm run sync:openapi`, or the nightly workflow |
-```bash
-pnpm install
-pnpm dev:landing # http://localhost:4321
-pnpm dev:docs # http://localhost:4325; run both and they link to each other
-```
+Never edit the vendored files by hand; bump the pin and sync.
+
+Never type a passport date into a page either. The docs write
+``, landing pages call `passportDateOf("")`, and copy in
+`site/dpp-landing/src/data` writes `{passport:}`. All three read the vendored acts
+and fail the build when an act records no date. Other regulatory dates are written
+beside the article that sets them.
## Checks
-CI (`.github/workflows/ci.yml`) runs all of these on every pull request and every push to `main`. Pushes to `staging` run no CI, so run them locally first. `check:links`, `check:spacing`, `check:llms` and `check:sitemaps` read the build, so build first.
+CI (`.github/workflows/ci.yml`) runs all of these on every pull request and every
+push to `staging` or `main`. `check:links`, `check:spacing`, `check:llms` and
+`check:sitemaps` read the build, so build first.
```bash
pnpm -r build
pnpm -r check # types and content collections, not links
-pnpm run check:links # internal links in both builds
+pnpm run check:links # internal links and anchors in both builds
pnpm run check:spacing # words glued across a line break
pnpm run check:leakage # internal names and private paths
pnpm run check:llms # llms.txt matches the pages
@@ -44,18 +87,11 @@ pnpm audit --audit-level high
pnpm run check:external # outside links; weekly in CI, not a PR gate
```
-## Vendored inputs
-
-| What | Pin | Refresh |
-|---|---|---|
-| Product groups and EU acts from `dpp-core` | `site/dpp-landing/core-source.json` | `pnpm --filter dpp-landing run sync:core` |
-| API spec from `dpp-engine` | `site/dpp-docs/openapi-source.json` | `pnpm run sync:openapi`, or the nightly workflow |
-
-Never edit the vendored files by hand; bump the pin and sync.
-
## Releasing
-`main` is what Cloudflare publishes. Its ruleset matches `dpp-core` and `dpp-engine`: pull request required, squash only, `build` must pass on an up-to-date branch, no force-push, no deletion, no bypass.
+`main` is what Cloudflare publishes. Its ruleset matches `dpp-core` and `dpp-engine`:
+pull request required, squash only, `build` must pass on an up-to-date branch, no
+force-push, no deletion, no bypass.
1. Land work on `staging`, through a pull request or a direct push once the checks pass.
2. Review the previews: `staging.odal-node-landing.pages.dev` and `staging.odal-node-docs.pages.dev`.
@@ -65,7 +101,21 @@ Never edit the vendored files by hand; bump the pin and sync.
`git fetch origin && git push --force-with-lease=staging origin origin/main:staging`
6. If pages were added or moved, resubmit both sitemaps in Search Console.
-A squash merge sets the sitemap `lastmod` of every page it touches to the merge date. Dates come from git history (`scripts/git-lastmod.mjs`).
+A squash merge sets the sitemap `lastmod` of every page it touches to the merge date.
+Dates come from git history (`scripts/git-lastmod.mjs`).
+
+## Automation
+
+| Workflow | When | What |
+|---|---|---|
+| `ci.yml` | Pull requests, pushes to `staging` and `main` | The checks above |
+| `advisories.yml` | Daily, 06:20 UTC | `pnpm audit --audit-level high` against the committed lockfile, so a new advisory surfaces on a day nothing was committed |
+| `sync-openapi.yml` | Nightly, 03:17 UTC | Opens a pull request into `staging` when the engine's spec changes |
+| `external-links.yml` | Mondays, 04:41 UTC | `check:external` |
+| Dependabot | Mondays | Version updates against `staging`, grouped: the Astro packages together, other npm minor and patch updates together, and all GitHub Actions together. TypeScript 7.0 is held back because `astro check` refuses it. Security updates always target `main`; retarget those to `staging` |
+
+Scheduled workflows run from `main` only. Every workflow that sets up Node reads its
+version from `.node-version`.
## Cloudflare
@@ -76,29 +126,31 @@ A squash merge sets the sitemap `lastmod` of every page it touches to the merge
- **Zone:** the `/verify` rate-limit rule (20 requests per 10 s per IP) is kept as code in `scripts/cloudflare-rate-limit.mjs` (`pnpm run rate-limit:verify`, add `-- --apply` to write; the token needs "Zone WAF: Edit"). It does not cover `pages.dev` previews.
- **Cache purge:** run `.github/workflows/deploy.yml` by hand.
-## Automation
-
-| Workflow | When | What |
-|---|---|---|
-| `ci.yml` | Pull requests, pushes to `main` | The checks above |
-| `sync-openapi.yml` | Nightly, 03:17 UTC | Opens a pull request into `staging` when the engine's spec changes |
-| `external-links.yml` | Mondays, 04:41 UTC | `check:external` |
-| Dependabot | Weekly | npm and Actions updates. Its pull requests target `main`; retarget them to `staging` |
-
-Scheduled workflows run from `main` only.
-
## Search and agents
-Both sites publish `sitemap-index.xml`, `robots.txt` (content signals: `search=yes, ai-input=yes, ai-train=no`) and `llms.txt`. On the landing, `src/lib/site-map.ts` is the one list of pages behind the nav, footer, `/sitemap` and `llms.txt`; on the docs, `src/sidebar.mjs` is. Submit both sitemaps in Search Console.
+Both sites publish `sitemap-index.xml`, `robots.txt` (content signals:
+`search=yes, ai-input=yes, ai-train=no`) and `llms.txt`. On the landing,
+`src/lib/site-map.ts` is the one list of pages behind the nav, footer, `/sitemap` and
+`llms.txt`; on the docs, `src/sidebar.mjs` is. Submit both sitemaps in Search Console.
-No page loads anything from another origin (the CSP allows only the site itself), and there is no analytics. The API reference sends "Test request" straight to the reader's node (`proxyUrl: ''` in `site/dpp-docs/src/scripts/mount-api-reference.ts`); check that this still holds after upgrading `@scalar/api-reference`.
+No page loads anything from another origin (the CSP allows only the site itself), and
+there is no analytics. The API reference sends "Test request" straight to the reader's
+node (`proxyUrl: ''` in `site/dpp-docs/src/scripts/mount-api-reference.ts`); check
+that this still holds after upgrading `@scalar/api-reference`.
## Elsewhere
-The product's source is in [`dpp-core`](https://github.com/odal-node/dpp-core) (Apache-2.0) and [`dpp-engine`](https://github.com/odal-node/dpp-engine) (BSL-1.1). This repository holds only the websites.
+The product's source is in [`dpp-core`](https://github.com/odal-node/dpp-core)
+(Apache-2.0) and [`dpp-engine`](https://github.com/odal-node/dpp-engine) (BSL-1.1).
+This repository holds only the websites.
+
+## Licence
-## License and security
+[Apache License 2.0](LICENSE) for the sites' source. It grants no use of the Odal Node
+name or logo.
-[Apache-2.0](LICENSE) for the sites' source. It grants no use of the Odal Node name or logo.
+## Security
-Report vulnerabilities privately to **security@odal-node.io**, never in a public issue.
+Report vulnerabilities privately to **security@odal-node.io**, never in a public
+issue. See the organization's
+[SECURITY.md](https://github.com/odal-node/.github/blob/main/SECURITY.md).
diff --git a/package.json b/package.json
index b8f9fb1..47ddca1 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"type": "module",
"packageManager": "pnpm@11.5.1",
"engines": {
- "node": ">=22.13"
+ "node": ">=22.23.4"
},
"scripts": {
"dev:landing": "pnpm --filter dpp-landing dev",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2115c91..11cdfad 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,52 +13,52 @@ importers:
site/dpp-docs:
dependencies:
'@astrojs/sitemap':
- specifier: ^3.7.3
- version: 3.7.3
+ specifier: ^3.7.4
+ version: 3.7.4
'@astrojs/starlight':
- specifier: ^0.41.7
- version: 0.41.7(astro@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0))(typescript@5.9.3)
+ specifier: ^0.42.7
+ version: 0.42.7(astro@7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))(typescript@6.0.3)
'@odal/brand-tokens':
specifier: workspace:*
version: link:../../packages/brand-tokens
'@scalar/api-reference':
- specifier: ^1.62.5
- version: 1.62.5(tailwindcss@4.3.3)(typescript@5.9.3)(zod@4.6.5)
+ specifier: ^1.76.0
+ version: 1.76.0(@oxc-project/types@0.155.0)(esbuild@0.28.2)(lightningcss@1.33.0)(rolldown@1.2.15)(tailwindcss@4.3.3)(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))(zod@4.6.7)
astro:
- specifier: ^7.3.5
- version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0)
+ specifier: ^7.4.2
+ version: 7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
vue:
- specifier: ^3.5.39
- version: 3.5.39(typescript@5.9.3)
+ specifier: ^3.5.44
+ version: 3.5.44(typescript@6.0.3)
devDependencies:
'@astrojs/check':
- specifier: ^0.9
- version: 0.9.9(prettier@3.8.3)(typescript@5.9.3)
+ specifier: ^0.9.12
+ version: 0.9.12(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@6.0.3)
typescript:
- specifier: ^5
- version: 5.9.3
+ specifier: ^6.0.3
+ version: 6.0.3
site/dpp-landing:
dependencies:
'@astrojs/sitemap':
- specifier: ^3
- version: 3.7.3
+ specifier: ^3.7.4
+ version: 3.7.4
'@odal/brand-tokens':
specifier: workspace:*
version: link:../../packages/brand-tokens
'@tailwindcss/vite':
specifier: ^4.3.3
- version: 4.3.3(vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))
+ version: 4.3.3(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
astro:
- specifier: ^7.3.5
- version: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0)
+ specifier: ^7.4.2
+ version: 7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
tailwindcss:
specifier: ^4.3.3
version: 4.3.3
devDependencies:
'@astrojs/check':
- specifier: ^0.9
- version: 0.9.9(prettier@3.8.3)(typescript@5.9.3)
+ specifier: ^0.9.12
+ version: 0.9.12(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@6.0.3)
'@fontsource/inter':
specifier: ^5.3.0
version: 5.3.0
@@ -66,124 +66,122 @@ importers:
specifier: ^1.0.3
version: 1.0.3
sharp:
- specifier: ^0.35.4
- version: 0.35.4(@types/node@24.12.4)
+ specifier: ^0.35.5
+ version: 0.35.5(@types/node@24.19.2)
typescript:
- specifier: ^5
- version: 5.9.3
+ specifier: ^6.0.3
+ version: 6.0.3
packages:
- '@ai-sdk/gateway@3.0.13':
- resolution: {integrity: sha512-g7nE4PFtngOZNZSy1lOPpkC+FAiHxqBJXqyRMEG7NUrEVZlz5goBdtHg1YgWRJIX776JTXAmbOI5JreAKVAsVA==}
- engines: {node: '>=18'}
+ '@ai-sdk/gateway@4.0.115':
+ resolution: {integrity: sha512-Xn+gDWM4Ti2FzYmxhlZtjEuGBGZlOYaQMpwcVRSN4c9qCMUszD5F5TAbkxgLV/tHKeMfEX+WEuTCl6Kkj2r73A==}
+ engines: {node: '>=22'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- '@ai-sdk/provider-utils@4.0.5':
- resolution: {integrity: sha512-Ow/X/SEkeExTTc1x+nYLB9ZHK2WUId8+9TlkamAx7Tl9vxU+cKzWx2dwjgMHeCN6twrgwkLrrtqckQeO4mxgVA==}
- engines: {node: '>=18'}
+ '@ai-sdk/provider-utils@5.0.61':
+ resolution: {integrity: sha512-Y+Z3539UXw0ctFDNepTtG23VqBQHr2A6yI2qUxvQcg75DJYgJoD2F9U2Vp5OgQjX7lxto1BLgFtKuOhzrr52vQ==}
+ engines: {node: '>=22'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- '@ai-sdk/provider@3.0.2':
- resolution: {integrity: sha512-HrEmNt/BH/hkQ7zpi2o6N3k1ZR1QTb7z85WYhYygiTxOQuaml4CMtHCWRbric5WPU+RNsYI7r1EpyVQMKO1pYw==}
- engines: {node: '>=18'}
+ '@ai-sdk/provider@4.0.28':
+ resolution: {integrity: sha512-6ThcmkJQXSMlBrf6mirIjUUS04Q5/kApbYTOzd5lZfYXLa1XPpnDLxP/G96/DKc00fDIUOW9S2ls0mSzb0+l9w==}
+ engines: {node: '>=22'}
- '@ai-sdk/vue@3.0.33':
- resolution: {integrity: sha512-czM9Js3a7f+Eo35gjEYEeJYUoPvMg5Dfi4bOLyDBghLqn0gaVg8yTmTaSuHCg+3K/+1xPjyXd4+2XcQIohWWiQ==}
- engines: {node: '>=18'}
+ '@ai-sdk/vue@4.0.142':
+ resolution: {integrity: sha512-YwenE45AIdtph5Yl90gRps1+i3DVsR8C3jHP3HPEsBL18c62pzB4s0XeWN2MJ6xSGlcSQgH7E8fY1h8qMx35Qw==}
+ engines: {node: '>=22'}
peerDependencies:
vue: ^3.3.4
- '@astrojs/check@0.9.9':
- resolution: {integrity: sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg==}
+ '@astrojs/astro2tsx@0.1.3':
+ resolution: {integrity: sha512-GMDC7Eo0myBUA/QLBl0u+OcegJ8LiBhccmNZR34KmprQNP8gQUJlWlOOZWUsxNA2rNS6GuPYcGDyLoPnjmn4/Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@astrojs/check@0.9.12':
+ resolution: {integrity: sha512-hazpqxIfZWj2VhyPyR0pOEQ/IhFDM/2nIApL96zMXABdD8NrUKYDmhxTy7h+drTDl9MQG/Sd1ET/4amadVJUUA==}
hasBin: true
peerDependencies:
typescript: ^5.0.0 || ^6.0.0
- '@astrojs/compiler-binding-android-arm64@0.5.0':
- resolution: {integrity: sha512-wVviC/1KaBqGVF0DbTZ8UtAE3c8TN84CCe7w4ju3SGzo/ByWKn8HCqSU/+1wdltGCCSa30pjVk3H8DQUgnfhRQ==}
+ '@astrojs/compiler-binding-android-arm64@0.5.2':
+ resolution: {integrity: sha512-kckIxon6Rm/Bxzh9mGPYpRRqUbToUQoHptCmpMmE+Yt0Xumq8CqrKUidyYhrBsrHVO7bxuRzzWUUqvpf+iYceQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@astrojs/compiler-binding-darwin-arm64@0.5.0':
- resolution: {integrity: sha512-5NNIkaGeiztD9QQfhOy+nNrBCZVeHqVZPlfJVjTKq4yJiiSsxAhuBzmVlmK3BDhbSgUT8dai4JV5m6t4/BIQaw==}
+ '@astrojs/compiler-binding-darwin-arm64@0.5.2':
+ resolution: {integrity: sha512-1ZG5Ar3dD8HtodX9XH1mRmE0qBXZlvjYXSFfpgFwocqfWnvhFuqtGUNseL8wgfImiRMztIjpQqlogQFQQtgiag==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@astrojs/compiler-binding-darwin-x64@0.5.0':
- resolution: {integrity: sha512-HU/waaccOQDXpvjoWA/9xzadNZIcWKblJoaw19lCxfVs6AHQYdZZOzZUQjY8HaLYGerTXjdADbra2XU+kXk9Og==}
+ '@astrojs/compiler-binding-darwin-x64@0.5.2':
+ resolution: {integrity: sha512-+kl35S7hiHJ2cb7eujwEsPFYYuSgE11uEE2Z20lAJ+undpgulMcW+weQqFPOSSZccEKHOiLIY+kQHkb4e4092w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@astrojs/compiler-binding-linux-arm64-gnu@0.5.0':
- resolution: {integrity: sha512-a21petBJRi0mNBf+gkRZFoWdGH+VOo0zRQSzM4Nuez5RL5rFFkmbondMejkaRZzvE3LVYU2NVD5MGRgAs4V+nQ==}
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.5.2':
+ resolution: {integrity: sha512-BqlR0EHNQLPLwgL9+xogjsAc7zGf0cHho2CPdhv0P1yqbVMwGVaGAqrANP6VYAXCqSC43AF4Czcxc2n+oqdesg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@astrojs/compiler-binding-linux-arm64-musl@0.5.0':
- resolution: {integrity: sha512-t5rmu23b/6e6v0bhPibCtwPdABXMRL+bUaJXdkJwTpkINp4zCgH6fNa5Z6+RgkgFSCpmg9uf1MtRIqx1gdmBaA==}
+ '@astrojs/compiler-binding-linux-arm64-musl@0.5.2':
+ resolution: {integrity: sha512-GRGyby3AZWw5d6JQzidyxPyvGgHWsSusrpgKyFVpDTKctABF7L3Pd5V1cRJbV36/rcu+Eh292/wL7pF7MkmGkQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@astrojs/compiler-binding-linux-x64-gnu@0.5.0':
- resolution: {integrity: sha512-JWtouuxSiDb2OKKFsxOwfqlpJuZHo1ExirlBGfDgoJVG5zeJWwcd2tU2w4UaJA4suT/tAFSLk/vFhM5fLjWV4A==}
+ '@astrojs/compiler-binding-linux-x64-gnu@0.5.2':
+ resolution: {integrity: sha512-9XAqGTMQAtIslMsjK3xdyY6OI9d59OZqcLBB6pvD/DcoR0daYswfrKx2azdDERDY4AqAnWPC7odVM1BmxYv3Vw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@astrojs/compiler-binding-linux-x64-musl@0.5.0':
- resolution: {integrity: sha512-LlaSO5v3UC6IxuTKXDViWV/fFHYhLKSO9Of118lNBXv/sjIWwziU+jjENxPgxfq/4oUeOu+613y6H93LBPNTOA==}
+ '@astrojs/compiler-binding-linux-x64-musl@0.5.2':
+ resolution: {integrity: sha512-jOViewGeTh9bSfS8vK72ECxoy2yvmA+Pd/ZcEvBI5c7+7IcfHwZ5qA4L9fRYuOhSrAifvQ2dV4vm1XAtloaWBw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@astrojs/compiler-binding-wasm32-wasi@0.5.0':
- resolution: {integrity: sha512-IP+Cp0m9yKg/AUT47077vHEaAOh/oT/iUZx1PDnV2GJzUxLSEotdQy5Hhv+ycvEadO/DbETSJfAWeV7kte4etQ==}
+ '@astrojs/compiler-binding-wasm32-wasi@0.5.2':
+ resolution: {integrity: sha512-Z7p64doar1uvR5C9Xs6j1CV9lGlPVQX7OQ2aAtZ/xKC5aGS6GB13nyc2UfQXTQLvZrvVwsyaflTQy6ziY5Bekw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [wasm32]
- '@astrojs/compiler-binding-win32-arm64-msvc@0.5.0':
- resolution: {integrity: sha512-v6plwy5GQBGvfv4QgiGhy/qkkQvYKW7Zh2vBArOnsGEDNHyUS43CWYwIQdw4ZdVVmLsFyhwTiueDZEP6zejddQ==}
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2':
+ resolution: {integrity: sha512-Tr13bh+ahTWsjXjzctK7pFpWV+dUU4FtBfETlR7gO+ueex0F+RDch7eRr0YfKysaRhk9tWm14lsCJ5uWyFPNHQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@astrojs/compiler-binding-win32-x64-msvc@0.5.0':
- resolution: {integrity: sha512-SgM158cSCJ248UIXaCCW2WqSTjOoFlDv93ed/ATguJqYpZNNVMlOdcPlgNH7WYj/OYeD0rIQr7XyRAYhB7+G1A==}
+ '@astrojs/compiler-binding-win32-x64-msvc@0.5.2':
+ resolution: {integrity: sha512-SfKkI+jOQYLh6wojPvVPV0lFfQnxisweN9B+qCzRvZp7DHAuGif8Y0WcC5PUgN4jb8VKy57LggQDtggR46Du1g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
- '@astrojs/compiler-binding@0.5.0':
- resolution: {integrity: sha512-PxFTx3WoxQnbgUvvwmF6LRQwhHO77a4pewOtJvzxlrYtQ90tLgomLKvks/akrd2iix2ngGlOhxQonKNd8YoBHg==}
+ '@astrojs/compiler-binding@0.5.2':
+ resolution: {integrity: sha512-lEn76+0JcMQ5RDXU0wSMWJg2ZppiZvSULpghC29cfv4o9bhvWFDbQjsCtvjjXN9iVLFQ7fL3wTR2L2UU13mP8g==}
engines: {node: ^20.19.0 || >=22.12.0}
- '@astrojs/compiler-rs@0.5.0':
- resolution: {integrity: sha512-2xIypn5R33FRWCXXXv0sfbDj8xcOvc2VmIbteytxMjOzP9LiGfvqaAFJjhdAjzhs6+ZKzYzbSE79rrPObYW5mg==}
+ '@astrojs/compiler-rs@0.5.2':
+ resolution: {integrity: sha512-IvwYLB8t1M86rKO4oPdBi9GP4gzXcgrVlNgocjwos1jeeUuEIV8d9Crn1PvYD/5IKteWOxpIHomf7e8iYlkE+Q==}
engines: {node: '>=22.12.0'}
- '@astrojs/compiler@2.13.1':
- resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==}
-
- '@astrojs/internal-helpers@0.10.4':
- resolution: {integrity: sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==}
-
- '@astrojs/internal-helpers@0.11.0':
- resolution: {integrity: sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==}
+ '@astrojs/internal-helpers@0.13.0':
+ resolution: {integrity: sha512-20jxQqnSmpskcGyad7N5l6Xf1gz0UCa6lNde44bEBdaXGpncEYfAZJ142r2ZgzBaG4dUyzGmhqZWv1INU2eiHQ==}
- '@astrojs/language-server@2.16.10':
- resolution: {integrity: sha512-87VQ/5GSdHlRnUA+hGuerYyIGAj+9RbZmATyuKLEUePinUXhQ5YkRnRrHhOD9sSi5JOErLjrLkHnfZFEvGrV8w==}
+ '@astrojs/language-server@2.17.3':
+ resolution: {integrity: sha512-QIAFu1e/4quJMTPdmBOm+ZPXc5NDGZE4/YQjgR3EgjhGLl/tdidaWJDr5WmO2lesVc+BW1qN/xNBURmuePDG2A==}
hasBin: true
peerDependencies:
prettier: ^3.0.0
@@ -194,175 +192,132 @@ packages:
prettier-plugin-astro:
optional: true
- '@astrojs/markdown-remark@7.2.4':
- resolution: {integrity: sha512-MvspGMynWKAjTe4/lTUdmBPHIFKNVLTCF6UlyWGogTGzNrTvjD+D4n48k7h8swxsEPKHK2TwxkZO7uoaCv1Pow==}
+ '@astrojs/markdown-satteri@0.4.5':
+ resolution: {integrity: sha512-0IeGdoFbv0f+442KJhYS44Wg8F3MuHmRsxIEYuFyqkjRubc6dPBFZ7azor5t4AeXLQoT5A5h9HyViKpd70Dl9w==}
- '@astrojs/markdown-satteri@0.3.7':
- resolution: {integrity: sha512-NHcHbrKW/opbZnTZQ5nH293BdcK2VV0tjuzI88CLnvy2njiEJVwUQ5KFnYd4NoWgHJCY/I1CyjGWCR4Vv3khXQ==}
-
- '@astrojs/markdown-satteri@0.4.2':
- resolution: {integrity: sha512-g4QehXnB/MzxQWnSf17NciFInMqEJy9948p8cc7zGg/r7995m0Ln5PMr3Xlnj24iey1LchaoZ3SzTOa3D4P/3w==}
-
- '@astrojs/mdx@7.0.7':
- resolution: {integrity: sha512-hv+NJh2s+/KDrjXaYNOaS344e3M2ekMXHBR7x9EwBwE3VvE1y/9Ifh1rhR1H2zK2sMgXoUnakI9e9ZeCKPX9/Q==}
- engines: {node: '>=22.12.0'}
+ '@astrojs/mdx@8.1.1':
+ resolution: {integrity: sha512-jEJUJsO2KqmKfBXaKeDHDCCj+Kerj1Fj+XndHznF9wxahvs+1onYCBeKmieM28N2+uA6mW57DOQQw5YaDLdBnA==}
+ engines: {node: '>=22.23.4'}
peerDependencies:
- '@astrojs/markdown-satteri': ^0.3.1
- astro: ^7.0.0
+ '@astrojs/markdown-remark': ^7.3.0
+ '@astrojs/markdown-satteri': ^0.4.0
+ astro: ^7.2.10
peerDependenciesMeta:
- '@astrojs/markdown-satteri':
+ '@astrojs/markdown-remark':
optional: true
- '@astrojs/prism@4.0.2':
- resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==}
- engines: {node: '>=22.12.0'}
+ '@astrojs/prism@4.1.1':
+ resolution: {integrity: sha512-sXlAXJX6t4QfuLg+CuCDzpg7NoxWcyb4paFprgtFppLeisCBmh935h+tJ5CWXfsXEoW2IDy/ihbRMtiu28Chjw==}
+ engines: {node: '>=22.23.4'}
- '@astrojs/sitemap@3.7.3':
- resolution: {integrity: sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==}
+ '@astrojs/sitemap@3.7.4':
+ resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==}
- '@astrojs/starlight@0.41.7':
- resolution: {integrity: sha512-579VJuZgo20UpNQPm9EIez5W3DFSrD16uiV2YX6rUlpLtjgKSdnc69TxVTZXn4AtI2B731TI2qhW1O3K+vwtrQ==}
+ '@astrojs/starlight@0.42.7':
+ resolution: {integrity: sha512-mlbit5iRjLx5eIcLf84Q2CwkrrsEgZrQwKKBK+vRf+ZGiSrwy1UGdT1hUfAIaHrMfcvkDpL+gw3aua7HobiKFg==}
peerDependencies:
- '@astrojs/markdown-remark': ^7.2.0
- astro: ^7.0.2
+ '@astrojs/markdown-remark': ^7.3.0
+ astro: ^7.2.10
peerDependenciesMeta:
'@astrojs/markdown-remark':
optional: true
- '@astrojs/telemetry@3.3.3':
- resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==}
- engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+ '@astrojs/telemetry@3.4.1':
+ resolution: {integrity: sha512-SMkvMsGOpM0FMAoT5pzhgI3LZC0JSPWf7Evwop+fZ3N6UkusPM7lI+sOJjMNI5OJrVoiei1/AGo1cY7sikTc5A==}
+ engines: {node: '>=22.23.4'}
'@astrojs/yaml2ts@0.2.4':
resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==}
- '@babel/helper-string-parser@7.29.7':
- resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
+ '@babel/helper-string-parser@7.29.11':
+ resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.29.7':
resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.29.7':
- resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==}
+ '@babel/parser@7.29.11':
+ resolution: {integrity: sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==}
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/types@7.29.7':
- resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
+ '@babel/types@7.29.11':
+ resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==}
engines: {node: '>=6.9.0'}
- '@bruits/satteri-darwin-arm64@0.9.5':
- resolution: {integrity: sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==}
+ '@bruits/satteri-darwin-arm64@0.10.5':
+ resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==}
cpu: [arm64]
os: [darwin]
- '@bruits/satteri-darwin-x64@0.10.4':
- resolution: {integrity: sha512-pe8jABpoGekJIDT5VoGdVGSo949MJEVMOqKSTNe3/CxvTe/ii92FUBsx8MSbhiBgXZAZdpdgIs7hMOHe7qj9tQ==}
- cpu: [x64]
- os: [darwin]
-
- '@bruits/satteri-darwin-x64@0.9.5':
- resolution: {integrity: sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==}
+ '@bruits/satteri-darwin-x64@0.10.5':
+ resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==}
cpu: [x64]
os: [darwin]
- '@bruits/satteri-linux-arm64-gnu@0.10.4':
- resolution: {integrity: sha512-XG1D35zCxklN400MPDYZAilX7ZLYLlh++pD8QL9aRXTGm6qINI5k9AFy2L6O/Se0epw07M9Zgtq1Ab3urTkL9g==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@bruits/satteri-linux-arm64-gnu@0.9.5':
- resolution: {integrity: sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==}
+ '@bruits/satteri-linux-arm64-gnu@0.10.5':
+ resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@bruits/satteri-linux-arm64-musl@0.10.4':
- resolution: {integrity: sha512-jeB81UUbbAWXJkSMd5Xd6cK1J/NRaSWICsks3RzV5eQZQoYcX7/heeSBd07Y8p0uFsLL6aMWLOglLx86ydarFA==}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@bruits/satteri-linux-arm64-musl@0.9.5':
- resolution: {integrity: sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==}
+ '@bruits/satteri-linux-arm64-musl@0.10.5':
+ resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@bruits/satteri-linux-x64-gnu@0.10.4':
- resolution: {integrity: sha512-X8M5JU3uui8KHPSZpvKESH1e3QLCt8JMgXg5oqzSKQxMmsebraQvImiKtFeBzVqJvinjKk86pwVRNFysgmItVw==}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@bruits/satteri-linux-x64-gnu@0.9.5':
- resolution: {integrity: sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==}
+ '@bruits/satteri-linux-x64-gnu@0.10.5':
+ resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@bruits/satteri-linux-x64-musl@0.9.5':
- resolution: {integrity: sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==}
+ '@bruits/satteri-linux-x64-musl@0.10.5':
+ resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@bruits/satteri-wasm32-wasi@0.10.4':
- resolution: {integrity: sha512-Upo3tIdX6haC89VEcSISc2wcuq7jtoL1CiHITUK6jKgloQSBBebfQXZ0XvyKIDVcq3EkCxcMN3FcFgQ2e+APdQ==}
- engines: {node: '>=14.0.0'}
- cpu: [wasm32]
-
- '@bruits/satteri-wasm32-wasi@0.9.5':
- resolution: {integrity: sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==}
+ '@bruits/satteri-wasm32-wasi@0.10.5':
+ resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
- '@bruits/satteri-win32-arm64-msvc@0.10.4':
- resolution: {integrity: sha512-2VKmGOBnqS0QrEnpzv0Od1dc26qG/01M+s8Rr5/SuNZEUkenWwLZPVzXstI4hhyg1r/OekG485xSIT6Vslovug==}
- cpu: [arm64]
- os: [win32]
-
- '@bruits/satteri-win32-arm64-msvc@0.9.5':
- resolution: {integrity: sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==}
+ '@bruits/satteri-win32-arm64-msvc@0.10.5':
+ resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==}
cpu: [arm64]
os: [win32]
- '@bruits/satteri-win32-x64-msvc@0.10.4':
- resolution: {integrity: sha512-xYWFT0DCjNEgaHWzR8UOF4QgMKDpZtLnXzF+VS4Umg17pP1I8YuJZLfFtXdEWRxruWd+x7O7R5ZYAH7khuJ+hw==}
+ '@bruits/satteri-win32-x64-msvc@0.10.5':
+ resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==}
cpu: [x64]
os: [win32]
- '@bruits/satteri-win32-x64-msvc@0.9.5':
- resolution: {integrity: sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==}
- cpu: [x64]
- os: [win32]
-
- '@capsizecss/unpack@4.0.0':
- resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==}
+ '@capsizecss/unpack@4.0.1':
+ resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==}
engines: {node: '>=18'}
- '@clack/core@1.4.3':
- resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==}
+ '@clack/core@1.5.1':
+ resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==}
engines: {node: '>= 20.12.0'}
- '@clack/prompts@1.7.0':
- resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==}
+ '@clack/prompts@1.8.1':
+ resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==}
engines: {node: '>= 20.12.0'}
- '@codemirror/autocomplete@6.20.3':
- resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==}
+ '@codemirror/autocomplete@6.20.4':
+ resolution: {integrity: sha512-yF8RhOf2SXlg00+qtupzLhrglcas61boqaONiNcbPIebHCpJocpqTBA6dyrtUrQO47hqyTdeob/3XnYilT7TaQ==}
- '@codemirror/commands@6.10.4':
- resolution: {integrity: sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==}
+ '@codemirror/commands@6.11.1':
+ resolution: {integrity: sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==}
'@codemirror/lang-css@6.3.1':
resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==}
- '@codemirror/lang-html@6.4.11':
- resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==}
+ '@codemirror/lang-html@6.4.12':
+ resolution: {integrity: sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==}
'@codemirror/lang-javascript@6.2.5':
resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==}
@@ -376,20 +331,23 @@ packages:
'@codemirror/lang-yaml@6.1.3':
resolution: {integrity: sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ==}
- '@codemirror/language@6.12.4':
- resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==}
+ '@codemirror/language@6.13.1':
+ resolution: {integrity: sha512-zfvU2r3TyylQLMj/te+5CnQ0rSqZi8B1oTCBbQkagcLW4Xc6imab6qN+pEJhsuNOLaJqiRyBXp9UhWA1DhVvDw==}
'@codemirror/lint@6.9.7':
resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==}
- '@codemirror/state@6.7.1':
- resolution: {integrity: sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==}
+ '@codemirror/state@6.7.6':
+ resolution: {integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==}
+
+ '@codemirror/streamparser@6.0.0':
+ resolution: {integrity: sha512-JTFPF6xrfjt0mnfGPgzcLiMwYmvIyNaoizp8BYzv8FE8KrT6GBGDZ190rtt+O7Wke3gG/MFHyiY9YGNeimof4w==}
- '@codemirror/view@6.43.6':
- resolution: {integrity: sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==}
+ '@codemirror/view@6.43.15':
+ resolution: {integrity: sha512-HHsfpqFeHyXLs983pSRe38Xajs0vFWZQ2BuX0m7Ki8w3jZ5iD8cuR3lBz2/5/X53Dhf32SBHKh6rtSTB6tKeGw==}
- '@ctrl/tinycolor@4.2.0':
- resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==}
+ '@ctrl/tinycolor@4.2.1':
+ resolution: {integrity: sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==}
engines: {node: '>=14'}
'@emmetio/abbreviation@2.3.3':
@@ -587,17 +545,17 @@ packages:
cpu: [x64]
os: [win32]
- '@expressive-code/core@0.44.1':
- resolution: {integrity: sha512-3dDo9N8D7hYrLNNMMWFovg3+aDUtnQm7c7z0GZc1c0LEFVBc0Q6lKG+tVT28gDadOvsgOANfCn35fgpe97Pmgg==}
+ '@expressive-code/core@0.44.3':
+ resolution: {integrity: sha512-pffktF0TJoxC08dgNcutl/0LcSnTrjF6vXR39qVpwZ0EyxpwO9zjI7dbni6sO7w3yHpRBO0voLFvhzB+EPJRsA==}
- '@expressive-code/plugin-frames@0.44.1':
- resolution: {integrity: sha512-HC/bdRao9225ApcgO/e3jn8ZOhldKO7ob1O/Tcipvtv7Vb5nMphZhMtD9uuywpvxkPYBHJi3504WhrKg05Dwqg==}
+ '@expressive-code/plugin-frames@0.44.3':
+ resolution: {integrity: sha512-ysW4VXk9vXEliA99Ur6ApUepVtx74sPolp6o/j45BRjZQoL5O6kXKMhSP4koQLih8HbC5B3ImIvO+HKKhkv/oA==}
- '@expressive-code/plugin-shiki@0.44.1':
- resolution: {integrity: sha512-YApiZt3buUzBwL5tqj8G+sYC5NjMjRCHgQwr9bmGl69rtcHy6fE9dooWUeKYB978fJT2BuxT5FeHcF47rA3SEg==}
+ '@expressive-code/plugin-shiki@0.44.3':
+ resolution: {integrity: sha512-jAibAZPG7lDmi61EFJADZjoSZzjHiwZZdbbgR/mTlWXM4ON/Pyo/9tB2vrqQNKylsci6jqtCi6idrwqQXF53xA==}
- '@expressive-code/plugin-text-markers@0.44.1':
- resolution: {integrity: sha512-B3BsJoJ8CFMlcIX9f+X9tcI3C4zPDO601+YuLi9GheSTNro7ZfqSjLptMQKBHOWZvxnAtY5zvIX7iO/qtBhNBg==}
+ '@expressive-code/plugin-text-markers@0.44.3':
+ resolution: {integrity: sha512-4Ae2xRSDV5kdWPsi40xWbOtoihbzM0zLVjQKkDAnD5KzFXl+6/kd+VhuWOlTRVaJ5cqGk++vCbAaf0MR1XbZlw==}
'@floating-ui/core@1.8.0':
resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
@@ -605,17 +563,16 @@ packages:
'@floating-ui/dom@1.8.0':
resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==}
- '@floating-ui/utils@0.2.10':
- resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
-
'@floating-ui/utils@0.2.12':
resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
'@floating-ui/vue@1.1.11':
resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==}
- '@floating-ui/vue@1.1.9':
- resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==}
+ '@floating-ui/vue@2.0.1':
+ resolution: {integrity: sha512-043dyEKD9TDSfz080YH2vobubgg+NIo/9Fw4RAl7sEMpD8Am1DNrrSTl/GpMBjyGHoD/FbJY2QLawY+HSQsEIA==}
+ peerDependencies:
+ vue: '>=3.3.0'
'@fontsource/inter@5.3.0':
resolution: {integrity: sha512-RofMylZmjlJEfELXeNHFWBRcSs75rGU/6bV2S2jfnvv/3rPXPGe0LgUJTklcHZ9lM4OZmAVFhcJPnACfb91A3g==}
@@ -636,169 +593,169 @@ packages:
resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
- '@img/sharp-darwin-arm64@0.35.4':
- resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==}
+ '@img/sharp-darwin-arm64@0.35.5':
+ resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [darwin]
- '@img/sharp-darwin-x64@0.35.4':
- resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==}
+ '@img/sharp-darwin-x64@0.35.5':
+ resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [darwin]
- '@img/sharp-freebsd-wasm32@0.35.4':
- resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==}
+ '@img/sharp-freebsd-wasm32@0.35.5':
+ resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==}
engines: {node: '>=20.9.0'}
os: [freebsd]
- '@img/sharp-libvips-darwin-arm64@1.3.3':
- resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==}
+ '@img/sharp-libvips-darwin-arm64@1.3.4':
+ resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==}
cpu: [arm64]
os: [darwin]
- '@img/sharp-libvips-darwin-x64@1.3.3':
- resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==}
+ '@img/sharp-libvips-darwin-x64@1.3.4':
+ resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==}
cpu: [x64]
os: [darwin]
- '@img/sharp-libvips-linux-arm64@1.3.3':
- resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==}
+ '@img/sharp-libvips-linux-arm64@1.3.4':
+ resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@img/sharp-libvips-linux-arm@1.3.3':
- resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==}
+ '@img/sharp-libvips-linux-arm@1.3.4':
+ resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==}
cpu: [arm]
os: [linux]
libc: [glibc]
- '@img/sharp-libvips-linux-ppc64@1.3.3':
- resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==}
+ '@img/sharp-libvips-linux-ppc64@1.3.4':
+ resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@img/sharp-libvips-linux-riscv64@1.3.3':
- resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==}
+ '@img/sharp-libvips-linux-riscv64@1.3.4':
+ resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@img/sharp-libvips-linux-s390x@1.3.3':
- resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==}
+ '@img/sharp-libvips-linux-s390x@1.3.4':
+ resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@img/sharp-libvips-linux-x64@1.3.3':
- resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==}
+ '@img/sharp-libvips-linux-x64@1.3.4':
+ resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
- resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==}
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.4':
+ resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@img/sharp-libvips-linuxmusl-x64@1.3.3':
- resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==}
+ '@img/sharp-libvips-linuxmusl-x64@1.3.4':
+ resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@img/sharp-linux-arm64@0.35.4':
- resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==}
+ '@img/sharp-linux-arm64@0.35.5':
+ resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@img/sharp-linux-arm@0.35.4':
- resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==}
+ '@img/sharp-linux-arm@0.35.5':
+ resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==}
engines: {node: '>=20.9.0'}
cpu: [arm]
os: [linux]
libc: [glibc]
- '@img/sharp-linux-ppc64@0.35.4':
- resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==}
+ '@img/sharp-linux-ppc64@0.35.5':
+ resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==}
engines: {node: '>=20.9.0'}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@img/sharp-linux-riscv64@0.35.4':
- resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==}
+ '@img/sharp-linux-riscv64@0.35.5':
+ resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==}
engines: {node: '>=20.9.0'}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@img/sharp-linux-s390x@0.35.4':
- resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==}
+ '@img/sharp-linux-s390x@0.35.5':
+ resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==}
engines: {node: '>=20.9.0'}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@img/sharp-linux-x64@0.35.4':
- resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==}
+ '@img/sharp-linux-x64@0.35.5':
+ resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@img/sharp-linuxmusl-arm64@0.35.4':
- resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==}
+ '@img/sharp-linuxmusl-arm64@0.35.5':
+ resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@img/sharp-linuxmusl-x64@0.35.4':
- resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==}
+ '@img/sharp-linuxmusl-x64@0.35.5':
+ resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@img/sharp-wasm32@0.35.4':
- resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==}
+ '@img/sharp-wasm32@0.35.5':
+ resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==}
engines: {node: '>=20.9.0'}
- '@img/sharp-webcontainers-wasm32@0.35.4':
- resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==}
+ '@img/sharp-webcontainers-wasm32@0.35.5':
+ resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==}
engines: {node: '>=20.9.0'}
cpu: [wasm32]
- '@img/sharp-win32-arm64@0.35.4':
- resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==}
+ '@img/sharp-win32-arm64@0.35.5':
+ resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [win32]
- '@img/sharp-win32-ia32@0.35.4':
- resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==}
+ '@img/sharp-win32-ia32@0.35.5':
+ resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==}
engines: {node: ^20.9.0}
cpu: [ia32]
os: [win32]
- '@img/sharp-win32-x64@0.35.4':
- resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==}
+ '@img/sharp-win32-x64@0.35.5':
+ resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [win32]
- '@internationalized/date@3.12.2':
- resolution: {integrity: sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==}
+ '@internationalized/date@3.12.4':
+ resolution: {integrity: sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==}
- '@internationalized/number@3.6.7':
- resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==}
+ '@internationalized/number@3.6.9':
+ resolution: {integrity: sha512-GgWy2caO/+hV9sT/oCTWGHvbjmJMPT9kkXzoKRLnkEq7adghhR7UprhvY9sXrKfrp3NcDfhF6QQHXR1KfQbB8g==}
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -810,35 +767,32 @@ packages:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
- '@jridgewell/sourcemap-codec@1.5.5':
- resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
-
'@jridgewell/sourcemap-codec@1.6.0':
resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@lezer/common@1.5.2':
- resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==}
+ '@lezer/common@1.5.4':
+ resolution: {integrity: sha512-xt3Q4z64xM+xhg4M7NXqw1N//1O74bUFo5kz6fwMeC4qwxSuRdwkYSmjcqCEEKYkNw5e67f2hcNqBoNERAEU0w==}
- '@lezer/css@1.3.4':
- resolution: {integrity: sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==}
+ '@lezer/css@1.3.9':
+ resolution: {integrity: sha512-ZmzgvTOBdJWGIsY/ItAfN7UW8DV802oZG+jeG6E508SwEzz5YhuAajptpWPICvIyqYAD2+VjMdOS40GgGkyEOQ==}
- '@lezer/highlight@1.2.3':
- resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
+ '@lezer/highlight@1.2.5':
+ resolution: {integrity: sha512-O1GMVKgtf5YspFaRzpmqkVgMtIk2HG9uMAbH6wdAIdNh3TVzCsch/+cRi+6l2//UGDKe6NB9BW3cvuR5ezMQ0w==}
'@lezer/html@1.3.13':
resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==}
- '@lezer/javascript@1.5.4':
- resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==}
+ '@lezer/javascript@1.5.6':
+ resolution: {integrity: sha512-sEvOqpl4vJQca0NugSQK02vQPbc5KrvoojnYGoqqFgFO0MtcYhwGiHKVEB+LuXYJnfyXo4QPA8ztbrEa4Fw5NA==}
'@lezer/json@1.0.3':
resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==}
- '@lezer/lr@1.4.10':
- resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==}
+ '@lezer/lr@1.4.11':
+ resolution: {integrity: sha512-UwgZcl1R66H2hDzBrA7kWyYmX6s8p5TQ+e/t7CuvgCtBEPxbEPaHYHu+pJBvTvDotEJpuQkJjbXuHiw5Cixxgw==}
'@lezer/xml@1.0.6':
resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==}
@@ -846,18 +800,8 @@ packages:
'@lezer/yaml@1.0.4':
resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==}
- '@marijn/find-cluster-break@1.0.3':
- resolution: {integrity: sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==}
-
- '@mdx-js/mdx@3.1.1':
- resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
-
- '@napi-rs/wasm-runtime@1.2.3':
- resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
- peerDependencies:
- '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
- '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4
+ '@marijn/find-cluster-break@1.0.4':
+ resolution: {integrity: sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==}
'@napi-rs/wasm-runtime@1.2.4':
resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==}
@@ -866,15 +810,18 @@ packages:
'@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
'@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4
- '@opentelemetry/api@1.9.0':
- resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
- engines: {node: '>=8.0.0'}
+ '@napi-rs/wasm-runtime@1.2.6':
+ resolution: {integrity: sha512-mRyDmEw9/fCDXCGfL1sbgIw/GUK0PVxRW4YwgPN61F3LQ+fSyoBFarJVzgGyhF6kRzEQZ0FejDqm4WLXSeqQmw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1 || 2.0.0-beta.2
+ '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2
'@oslojs/encoding@1.1.0':
resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
- '@oxc-project/types@0.146.0':
- resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==}
+ '@oxc-project/types@0.155.0':
+ resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==}
'@pagefind/darwin-arm64@1.5.2':
resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==}
@@ -924,98 +871,98 @@ packages:
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
- '@rolldown/binding-android-arm-eabi@1.2.5':
- resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==}
+ '@rolldown/binding-android-arm-eabi@1.2.15':
+ resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
- '@rolldown/binding-android-arm64@1.2.5':
- resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==}
+ '@rolldown/binding-android-arm64@1.2.15':
+ resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@rolldown/binding-darwin-arm64@1.2.5':
- resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==}
+ '@rolldown/binding-darwin-arm64@1.2.15':
+ resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@rolldown/binding-darwin-x64@1.2.5':
- resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==}
+ '@rolldown/binding-darwin-x64@1.2.15':
+ resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@rolldown/binding-freebsd-x64@1.2.5':
- resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==}
+ '@rolldown/binding-freebsd-x64@1.2.15':
+ resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@rolldown/binding-linux-arm-gnueabihf@1.2.5':
- resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==}
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.15':
+ resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@rolldown/binding-linux-arm64-gnu@1.2.5':
- resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==}
+ '@rolldown/binding-linux-arm64-gnu@1.2.15':
+ resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-arm64-musl@1.2.5':
- resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==}
+ '@rolldown/binding-linux-arm64-musl@1.2.15':
+ resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rolldown/binding-linux-ppc64-gnu@1.2.5':
- resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==}
+ '@rolldown/binding-linux-ppc64-gnu@1.2.15':
+ resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-s390x-gnu@1.2.5':
- resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==}
+ '@rolldown/binding-linux-s390x-gnu@1.2.15':
+ resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-gnu@1.2.5':
- resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==}
+ '@rolldown/binding-linux-x64-gnu@1.2.15':
+ resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-musl@1.2.5':
- resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==}
+ '@rolldown/binding-linux-x64-musl@1.2.15':
+ resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rolldown/binding-openharmony-arm64@1.2.5':
- resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==}
+ '@rolldown/binding-openharmony-arm64@1.2.15':
+ resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@rolldown/binding-win32-arm64-msvc@1.2.5':
- resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==}
+ '@rolldown/binding-win32-arm64-msvc@1.2.15':
+ resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@rolldown/binding-win32-x64-msvc@1.2.5':
- resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==}
+ '@rolldown/binding-win32-x64-msvc@1.2.15':
+ resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
@@ -1023,131 +970,147 @@ packages:
'@rolldown/pluginutils@1.0.1':
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
- '@scalar/agent-chat@0.12.18':
- resolution: {integrity: sha512-auIe3JYVm6jgoT7pa4Za+lrLFnEa3CDb4ncZA9aAYztti8C6qSFGn8nBrAtm/RarljhPTYZg5dhqeXJ7zyOu7w==}
+ '@scalar/agent-chat@0.12.46':
+ resolution: {integrity: sha512-aIHOpsXLGYXOfh4XRDbl7cTNZm4I56J3p4vVWeJGu0BH/aXqfln3WyOBlvJpEB99wBsUr0fv201S/81pkyOnVA==}
+ engines: {node: '>=22'}
+
+ '@scalar/api-client@3.23.3':
+ resolution: {integrity: sha512-ecT7zwtPN0WJYaANIhqOOMGqNkAtBx2MrxwifkYTQdq4nvnUtpTfhf+Yfu1Nt/JzxP9GbwUiP17YjBr83iNFNg==}
+ engines: {node: '>=22'}
+
+ '@scalar/api-reference@1.76.0':
+ resolution: {integrity: sha512-pjqwnzmA9YK3ZX+IZSICMsywm4qI6HLSngR2py9H6TvFApHHuJjkTAd+gFJfnqJDzJuro8k7ji6JCtJ2U+Byng==}
engines: {node: '>=22'}
- '@scalar/api-client@3.13.3':
- resolution: {integrity: sha512-m+5/L71PTk474VGl7daD+7Ue2DeQA/BPsXoWJAXzDTtOR7orySlktZ9WiaI3CbZZkjiukaICaOb9AvMotDOmIQ==}
+ '@scalar/asyncapi-to-markdown@0.2.2':
+ resolution: {integrity: sha512-Mh00ggrueL54D6MDGnh2nsqURv1mq/puz0c050ScbOZmsSfza5cJ17zglHKg6P6sjkZ4EMjmGbq41PkrPrVI8w==}
engines: {node: '>=22'}
- '@scalar/api-reference@1.62.5':
- resolution: {integrity: sha512-6VZhjtXiYygWrh6llwg/pnKN7S4eWqINOGt2Fu7TQkCdNUKwZEq7/XiOTqzZvGp/1Uu60ne/9nJK+UbQTSVpBg==}
+ '@scalar/asyncapi-upgrader@0.1.18':
+ resolution: {integrity: sha512-jr+BW2c9mM2LNb6WP2xmi1lRopOg35E71AyNwPiMIbue+yoZp+K2q2vgCjCiltKF0sKJMFjdujyLWgBDWsb1nw==}
engines: {node: '>=22'}
- '@scalar/asyncapi-upgrader@0.1.2':
- resolution: {integrity: sha512-h6NUhsctrhucrbO2XHWbTXp9EWt7eL5vvlsooUEw2bB014KSPd41JrBQ6t0h/dFdmhwxdbBI7Hmg9eZa/mlCXA==}
+ '@scalar/blocks@0.6.0':
+ resolution: {integrity: sha512-euSmklFX9rfHaT3XkQgwM4kn+Wmz82/br+kwOzUZ/Hpi7o4P0/rLhOA7ll/3YaXpWB8yaeek4ko4K+1eGCT+PQ==}
engines: {node: '>=22'}
- '@scalar/blocks@0.1.4':
- resolution: {integrity: sha512-L6fN2azd56pQK0VN7YTPpgKXGFlATOJmIdTFfr8+G74ZAhpNifGa/6jtNe9gsfwCYW5TYu+yhbGy62Jd8MLhSg==}
+ '@scalar/code-highlight@0.4.11':
+ resolution: {integrity: sha512-wqlAgMW35CEXYmBTA2NakvM7a0y69hHIdMduMZEsA8Ftkc4mci3PThUgXC7YrL2nFL57PGW97Lxh2BoNgdv35Q==}
engines: {node: '>=22'}
- '@scalar/code-highlight@0.4.1':
- resolution: {integrity: sha512-pnr8gbQuvSXu4fcPPNkFNjAxxMWiJLffN57lRgVN3FCk+Q8hKHWWT01ulAT1/0Kg3/VmgtObrMHhX2qYnpM9+g==}
+ '@scalar/components@0.33.0':
+ resolution: {integrity: sha512-+JURKnZOkah3wLkO9YxpZcYPZF9lW9F+Zby6S4w09PRxPVB05F/I6bOmXfHDY6Tbt94Vd8T/NGcSVQI5Wm99jQ==}
engines: {node: '>=22'}
- '@scalar/components@0.27.6':
- resolution: {integrity: sha512-jXTv2VgYn7/13yCAGKtc/26LCnrQSULGjcnP0LasJDqkVKDdRm1StHDG5iRniqrIzS21gJ6YcNGokksdLIrgQw==}
+ '@scalar/helpers@0.16.4':
+ resolution: {integrity: sha512-9eILWzUcAkHEuYMMvijpSIy69t+Vkq+NudLB/7lgARFTWqXfQpIxW1L3VH7ogKyRie5+E4CNZ3PSvlw6IIfLGw==}
engines: {node: '>=22'}
- '@scalar/helpers@0.9.0':
- resolution: {integrity: sha512-M34CLRCttqC1bXthI/QSzQj0s5C6nrU2PFWf/vOT3RpycbiGDGQbqR+5RfFzpOIQvRqbHfNdcRbeiZBw+vCbkQ==}
+ '@scalar/highlight@0.6.0':
+ resolution: {integrity: sha512-Vb57bGAn5emtHBQa6QPjSq2Z2Xo2Z3cGS6diV/BmYWn0kzDKqFK1B4SFfFNJNhJLsm798kdI1iJz697lXnMhRA==}
engines: {node: '>=22'}
- '@scalar/icons@0.7.3':
- resolution: {integrity: sha512-5uSUvumj6yJEAZT7/MKpgrkNl76waDXUpu0kUBBFJ83GhZirBIK+Z9SktShEvJT0+rk/j9Zaer3BHoEhYwAEBQ==}
+ '@scalar/icons@0.7.8':
+ resolution: {integrity: sha512-/Jee+6lk3I3GCkL4FW7IPjC1+WvAkAsZ4yGkq0tXHbZzJ1BWMzRud/BZuK1eCHQ+un5CDTy26UzJcM5tCMn63w==}
engines: {node: '>=22'}
- '@scalar/json-magic@0.12.17':
- resolution: {integrity: sha512-Vw2nrUDIjhvMP6vxFtkiiFlabJ6SyTtfn1BsOxgnr1hIB+/rkngMguiDzl5em21VjyfFGIoADia+QWKM2hdcdA==}
+ '@scalar/json-magic@0.17.0':
+ resolution: {integrity: sha512-YmJAO9NoGCcU/vx7P4Dy9DGv+Vntp+ny3Fh99slHOOh/IZxvbdK5hWeZdzQ3x+ezab9XJNscFoX8H/P6W+H8lA==}
+ engines: {node: '>=22.19.0'}
+
+ '@scalar/localization@0.2.9':
+ resolution: {integrity: sha512-aSdpoWWSH0EJ75LJ5zMNmh8HGMlnKEDdpylHRbr1VTMycxNuZZ0TCUSINu0EjOSFB+n883+pkx5cXllIAHU1MQ==}
engines: {node: '>=22'}
- '@scalar/oas-utils@0.19.4':
- resolution: {integrity: sha512-ne/Pio9NaTQTjAeJ0B7OXWNIy4ziJmMoeKRzmEvXLXJC15iDI3vJZzQJOOldg5MPVEIqHxC0NWICrwKB6nMERA==}
+ '@scalar/oas-utils@0.20.15':
+ resolution: {integrity: sha512-hldf13hxpfGzoAdHllgdEK7sYZ7ttdodYf533T5UCQbOXGOrGJn+PYxKb5ewoMr9+iA8vxNipDV3cSxEGfXrsQ==}
engines: {node: '>=22'}
- '@scalar/openapi-types@0.9.1':
- resolution: {integrity: sha512-gkGhSkxSzADaBiNg+ZAbJuwj+ZUmzP2Pg9CWZ7ZP+0fck2WjPeDDM7aAbouAm0aQQMF9xBjSPXSA9a/qTHYaTw==}
+ '@scalar/openapi-to-markdown@1.7.0':
+ resolution: {integrity: sha512-re3eV3Cfp5uzTrHQLhfPERrDiYLKmivg30C6jKMcKaVt6QXOrV6kD7ita9bh/2rdf2oG/ONpBNWlA2u6PAxUlg==}
+ engines: {node: '>=22.19.0'}
+
+ '@scalar/openapi-types@0.9.8':
+ resolution: {integrity: sha512-pGcpkZObsGBC7nRKYte+6gstoe0C4hp7B2UWQYjg5To1wE68s3OHVvin+muL3tn3ZAoahXeJAkn1+aEcMi802w==}
engines: {node: '>=22'}
- '@scalar/openapi-upgrader@0.2.9':
- resolution: {integrity: sha512-D5b0rGLLZgmkO9mdW2j/ND1KBlH1u3RCpr87HPxv9P9ZSr6PtM5iLqFOJq0ACiaHjY2mikCrxgDmnUEhTzRpHQ==}
+ '@scalar/openapi-upgrader@0.4.6':
+ resolution: {integrity: sha512-wkTbowGZAlDA5AhCAnBVft6y3veoE17P+okH/zrwM/BZWBSzPghGpa4BPTCg3+IzRmRP/8ZeaYO7LfxCDAEmcA==}
engines: {node: '>=22'}
- '@scalar/schemas@0.7.2':
- resolution: {integrity: sha512-6Ble6WcbiKgD3ypIva+wgZv1qIClmeEjXA6jrOo1bKpYUu6sh4e89LZxDK+LULa2jQl/2O5GEaa6aZ0ImlpkHg==}
+ '@scalar/schemas@0.15.0':
+ resolution: {integrity: sha512-YxvmWVymAC536CFC84SGyt8PD57UqB5GOvr73y7Oj1Bjf8HMUUowzEt3AM3w9s21sR8ZKkncbt1R3r8sYsASnA==}
engines: {node: '>=22'}
- '@scalar/sidebar@0.9.29':
- resolution: {integrity: sha512-Xyq7hnkeABWYLdQ0QhxuK7EpwBKkCItyTCidmX2j8xeKw1/b/RWE95co5P09GtkjHs1g+ePU/P919WaSn80+CA==}
+ '@scalar/sidebar@0.12.3':
+ resolution: {integrity: sha512-S8NMexUz5hfwdHBkcqsZ0P6aPuOPZRObH3mewtFP7z8jCiLk9WKStmoQT/3jXF9wHKtB4qUn87l49sbXMzvP4Q==}
engines: {node: '>=22'}
- '@scalar/snippetz@0.9.21':
- resolution: {integrity: sha512-0XFKdiKh5OnBxnK/NCBxaXpva53MRpvW4o6T2SMEUd+/xVa4Xmz7oHCHoq2g86+uY4bmepG1kZ0ndapyQjg/vw==}
+ '@scalar/snippetz@0.10.11':
+ resolution: {integrity: sha512-igyfP3DNHNI0sZ0kTYj0rsXHemyYO0AIIitusHsDL6u9Z0m79m/9klB5xB2BIV3DbCzjC8Eziwmaryv74nzSuQ==}
engines: {node: '>=22'}
- '@scalar/themes@0.16.2':
- resolution: {integrity: sha512-4mAn7z2W5/ASi1OF06dqf04xjxTHnMzESC2E+qVMukJsEsV4kDlYSIfm/g5hwWxhqWsBMjorF9Dtlqd0ycJ92g==}
+ '@scalar/themes@0.19.3':
+ resolution: {integrity: sha512-tssbw6X8ts+WgBmEAiD6h9GJU5cL2Ki80ISQ3/tcJtsvBEM9R+/A9da1N9mvEt62udhU0Jp+a6L/t9G9PbcreA==}
engines: {node: '>=22'}
'@scalar/typebox@0.1.3':
resolution: {integrity: sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==}
- '@scalar/types@0.16.2':
- resolution: {integrity: sha512-QAlCtDVRsX/UV1N9ctLqPsKQy84eceFf4dMnTZM0JhaRfwS/Ovwp8oFf3POSpqQILNiqLFZLE6IV6p/5rNoAag==}
+ '@scalar/types@0.25.0':
+ resolution: {integrity: sha512-EdwOVV5ajKks4MX5BorHIdMLG0L8EAxfz+NisAPV8l7Rsic50+YoWnqkY1eqB6K96iyreIKUdl7B/PIFGLqylg==}
engines: {node: '>=22'}
- '@scalar/use-codemirror@0.14.12':
- resolution: {integrity: sha512-m+0tmVOHZVAybbcNEizR3m9RYOLtU59AStRkk29J5qaW4J+tsjrz4BDMceeTpoVawL/lxp2vDvQR+w/gKC3miQ==}
+ '@scalar/use-codemirror@0.14.16':
+ resolution: {integrity: sha512-3s8IzFEMReB28kP0Keq1yNu84F2tUTpHoXwfSY4Nb3xpiBaMJfbj1p5w2fFvXQgCCtdf3nBUPbRLTxgAebWXaA==}
engines: {node: '>=22'}
- '@scalar/use-hooks@0.4.7':
- resolution: {integrity: sha512-8zajxhnKMJuO1HF36y8TeVuSIol2pueYdRvITZTEY8TuRbnwxrvJZk25II7YpxGMORAEDr0bwNF88Dr+QUfw1w==}
+ '@scalar/use-hooks@0.4.22':
+ resolution: {integrity: sha512-+XQ8WwUGCzBTLGycgNue/0sIOSA8n/RSlu3XC1wUX6UB69j3kD4qeI9I60i1uFW7OL1CtaLq66BIe84uMnJAng==}
engines: {node: '>=22'}
- '@scalar/use-toasts@0.10.2':
- resolution: {integrity: sha512-1iHQFbDXv0YQRp13aa63S5EcTJ5K8T0ocnLxk+nziloPrLjKt6jdRt6vOHsLSv5sm9kFKcVKNQTQgialmKCOGA==}
+ '@scalar/use-toasts@0.10.6':
+ resolution: {integrity: sha512-rs0DkbWpKhy8WPjU6LDOan5RI+iUaj7j/Rdkui2+FXB0LB789OfWsj3VeD/vlPLrk7L5Du67AOLLKVqwIp2nJA==}
engines: {node: '>=22'}
- '@scalar/validation@0.6.0':
- resolution: {integrity: sha512-tpmmG+/xRE2Kn9RpflU3AIyZv08v10+E1ZrJCx7z6+/91zHVxy0M73kC1LT4/8PbYNt85ywyC8+n+D99JdMcGA==}
+ '@scalar/validation@0.6.7':
+ resolution: {integrity: sha512-xvmeYb0LOg9B598oVA/1fs9MvnMdtWjQYG3v2Wgftewizr7tQjsdDYT1TQahlDzqRG+r+ml6zlSkPrFiCE5jHQ==}
engines: {node: '>=20'}
- '@scalar/workspace-store@0.55.3':
- resolution: {integrity: sha512-qqSSq8OSxx582h/DSgMYH68iqzp+M8c9B+YGB7/qi5ZQK3TzazeCM1BVakkSbFYvD+X4FanV4V4x/aAhjv6MfQ==}
- engines: {node: '>=22'}
+ '@scalar/workspace-store@0.69.0':
+ resolution: {integrity: sha512-idgMEuPXfZQ4iKdCGG60td5qBJgVI3xjJ/p5bHaStWP6bhyJ0kJJBBLntkOvWZLgxr5Enk3BNEcmQAW6V/GJIw==}
+ engines: {node: '>=22.19.0'}
- '@shikijs/core@4.4.3':
- resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==}
+ '@shikijs/core@4.5.0':
+ resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==}
engines: {node: '>=20'}
- '@shikijs/engine-javascript@4.4.3':
- resolution: {integrity: sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==}
+ '@shikijs/engine-javascript@4.5.0':
+ resolution: {integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==}
engines: {node: '>=20'}
- '@shikijs/engine-oniguruma@4.4.3':
- resolution: {integrity: sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==}
+ '@shikijs/engine-oniguruma@4.5.0':
+ resolution: {integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==}
engines: {node: '>=20'}
- '@shikijs/langs@4.4.3':
- resolution: {integrity: sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==}
+ '@shikijs/langs@4.5.0':
+ resolution: {integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==}
engines: {node: '>=20'}
- '@shikijs/primitive@4.4.3':
- resolution: {integrity: sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==}
+ '@shikijs/primitive@4.5.0':
+ resolution: {integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==}
engines: {node: '>=20'}
- '@shikijs/themes@4.4.3':
- resolution: {integrity: sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==}
+ '@shikijs/themes@4.5.0':
+ resolution: {integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==}
engines: {node: '>=20'}
- '@shikijs/types@4.4.3':
- resolution: {integrity: sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==}
+ '@shikijs/types@4.5.0':
+ resolution: {integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==}
engines: {node: '>=20'}
- '@shikijs/vscode-textmate@10.0.2':
- resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+ '@shikijs/vscode-textmate@10.1.0':
+ resolution: {integrity: sha512-cVBuhDQjBZaNMTwBquYfPydrUP+E3hE6oYGasx8h6ZrODIM7/r+gxLDXdd66oszbrggZHEntdE6j+5gYIVyMWQ==}
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
@@ -1249,16 +1212,16 @@ packages:
peerDependencies:
vite: ^5.2.0 || ^6 || ^7 || ^8
- '@tanstack/virtual-core@3.17.3':
- resolution: {integrity: sha512-8Np/TFELpI0ySuJoVmjvOrQYXH/8sTX0Biv9szhFhY39xOdAAY+smrMxjxOum/ux3eM8MUJQsEJ0/R0UpvC8dw==}
+ '@tanstack/virtual-core@3.19.7':
+ resolution: {integrity: sha512-gxy5SvH0mFRJ0YujtrflB/1HAu9Wn1KGvL0bjZfQkYVVMsIpQiwcf1mR06/ViN4NjllUb4HNCjqE9FGwgTvMCQ==}
- '@tanstack/vue-virtual@3.13.31':
- resolution: {integrity: sha512-wZMEoSf852jQqaf3Ika1J7PiBae6341LNy/2CxmIyn0XKDQXMuK41wVX+xp6G0yx8jyR95Ef+Tdr13DK7mbJtQ==}
+ '@tanstack/vue-virtual@3.13.48':
+ resolution: {integrity: sha512-exH0/lELoCW9D6x8V1Uq61XY4zrN1AeDH4rDKUMTOJ93ndkeEVIY8zo366IBM13HSjhULpuWPdPhJ+ccidg58A==}
peerDependencies:
vue: ^2.7.0 || ^3.0.0
- '@tybys/wasm-util@0.10.3':
- resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==}
+ '@tybys/wasm-util@0.10.4':
+ resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==}
'@types/debug@4.1.13':
resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
@@ -1281,17 +1244,14 @@ packages:
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
- '@types/mdx@2.0.13':
- resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
-
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
'@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
- '@types/node@24.12.4':
- resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==}
+ '@types/node@24.19.2':
+ resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==}
'@types/sax@1.2.7':
resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
@@ -1308,37 +1268,89 @@ packages:
'@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
- '@ungap/structured-clone@1.3.1':
- resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==}
+ '@ungap/structured-clone@1.4.0':
+ resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==}
+
+ '@unhead/bundler@3.4.3':
+ resolution: {integrity: sha512-noUTzazRB4fMgO/nluoirrZJXngNbNb3sQzIslA805tKkwakRv2fib4Xe4EdiTuNB7V5XmpUFvfQkKRdBQ9qAA==}
+ peerDependencies:
+ '@unhead/cli': ^3.4.3
+ '@vitejs/devtools-kit': ^0.7.6
+ esbuild: '>=0.17.0'
+ lightningcss: '>=1.20.0'
+ oxc-parser: '>=0.98.0'
+ rolldown: '>=1.0.0'
+ unhead: ^3.4.3
+ vite: '>=6.4.2'
+ webpack: '>=5.0.0'
+ peerDependenciesMeta:
+ '@unhead/cli':
+ optional: true
+ '@vitejs/devtools-kit':
+ optional: true
+ esbuild:
+ optional: true
+ lightningcss:
+ optional: true
+ oxc-parser:
+ optional: true
+ rolldown:
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
- '@unhead/vue@2.1.15':
- resolution: {integrity: sha512-SSByXfEjhzPn8gXdEdgpYqpLMPSkLUH2HVE0GxZfOtNsJ0GgOHQs0g9T67ZZ1z0kTELLKdtOtYrzrbv9+ffF7g==}
+ '@unhead/vue@3.4.3':
+ resolution: {integrity: sha512-Wrmk62oC/V1EcBSKRDuy77kVaBtBXXsj6b+vEEWvmfo9AQfpLlc2b6vvvSj9WnXr8VY1ksKHj49Ejo8J/wLSOA==}
peerDependencies:
+ vite: '>=6.4.2'
vue: '>=3.5.18'
+ webpack: '>=5.0.0'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ webpack:
+ optional: true
- '@vercel/oidc@3.1.0':
- resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==}
+ '@vercel/oidc@3.2.0':
+ resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==}
engines: {node: '>= 20'}
- '@volar/kit@2.4.28':
- resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==}
+ '@volar/kit@2.4.30':
+ resolution: {integrity: sha512-VocLtumfXnqnPQEWc9Yx7uC1uOh9gyjVNlrn2+6Zx/z9aM6yTLhPK8lSqM9Ilu81XRa48I00lcYJWLi2BLxx8Q==}
peerDependencies:
- typescript: '*'
+ typescript: <7
- '@volar/language-core@2.4.28':
- resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
+ '@volar/language-core@2.4.30':
+ resolution: {integrity: sha512-73fjwEV8wat6aOZ6U/y/hqtE30ocrIWECg67b0txGczOMNw+MffLmvJ5fnFfN9drVUEYZzLdaNo6VAy6G6avMw==}
- '@volar/language-server@2.4.28':
- resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==}
+ '@volar/language-server@2.4.30':
+ resolution: {integrity: sha512-tcP9fzzUBbsLIFHhgnRU4ncQjMn9G9Vax0ffkQmdCrXVEYqRroUepmyC5AVgiju5bCiLD6a55qen5iOTQHkb3g==}
+ peerDependencies:
+ typescript: <7
+ peerDependenciesMeta:
+ typescript:
+ optional: true
- '@volar/language-service@2.4.28':
- resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==}
+ '@volar/language-service@2.4.30':
+ resolution: {integrity: sha512-w/xDsASiqC71ggCOm7sTDXDNk/l72XEptodeRC68tgZ0e5QM4hM3zAqBGC7mBctvhrpYwKfMG+t9xcUo2hEFtA==}
+ peerDependencies:
+ typescript: <7
+ peerDependenciesMeta:
+ typescript:
+ optional: true
- '@volar/source-map@2.4.28':
- resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==}
+ '@volar/source-map@2.4.30':
+ resolution: {integrity: sha512-zym1ob/KwDDyN+0jGVtxwbxJSRRnUvv5HspCtz3yEfVVdCG4/dzxJktMGPAgemqRuVs81O0o/y0q3qOUErR8kg==}
- '@volar/typescript@2.4.28':
- resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==}
+ '@volar/typescript@2.4.30':
+ resolution: {integrity: sha512-/DgA5tgYFPfrLFuSjIMXMGHk1LQv2+P8eny6+BhGNzFJELWIW7UZlc56ZLIRFhLsPpMfIFxM8/HvOPBggrjTZg==}
+ peerDependencies:
+ typescript: <7
+ peerDependenciesMeta:
+ typescript:
+ optional: true
'@vscode/emmet-helper@2.11.0':
resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==}
@@ -1346,51 +1358,51 @@ packages:
'@vscode/l10n@0.0.18':
resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
- '@vue/compiler-core@3.5.39':
- resolution: {integrity: sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==}
+ '@vue/compiler-core@3.5.44':
+ resolution: {integrity: sha512-k34nCytbK8PQ1gR2mGROYOw6Pnv/mumqIdrZ3x2tbyXZDWm7ViKGLTfdB+DRrWqEQsLgGJvn0WN9jBif5zCTLQ==}
- '@vue/compiler-dom@3.5.39':
- resolution: {integrity: sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==}
+ '@vue/compiler-dom@3.5.44':
+ resolution: {integrity: sha512-W5AoBFWdw1lQAKiHowkfgFKFab82oSRT6sGsPfw/q1GRjsy/ZJFLHGhJyBRIFN9APLTUduDH9U2JAiPOIyKuYg==}
- '@vue/compiler-sfc@3.5.39':
- resolution: {integrity: sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==}
+ '@vue/compiler-sfc@3.5.44':
+ resolution: {integrity: sha512-dzHmQ4jXTpdr5FjIQUeykVakN/uzqFbUo9/C5ikBFg3a3PeM6uRxeczx1ZbXBML0/zJstEh3ygYipzR5Z7b2Pw==}
- '@vue/compiler-ssr@3.5.39':
- resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==}
+ '@vue/compiler-ssr@3.5.44':
+ resolution: {integrity: sha512-xr5gb1JVHlfXJwSlRz1FeP6uxoazdzHuMTVLE7up+4Vrqxk219CvxLPxD9NXBt47yvZW7+p4DXfyp4O1fkByIA==}
- '@vue/reactivity@3.5.39':
- resolution: {integrity: sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==}
+ '@vue/reactivity@3.5.44':
+ resolution: {integrity: sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw==}
- '@vue/runtime-core@3.5.39':
- resolution: {integrity: sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==}
+ '@vue/runtime-core@3.5.44':
+ resolution: {integrity: sha512-uEa/ndwjhrrhnOfb2p+sZy6zeoamJOISqaLSJGk/8R6nABT1ZldpzcJoPzKj+zHVomVBPcmQYyC2r4LtvDV6CQ==}
- '@vue/runtime-dom@3.5.39':
- resolution: {integrity: sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==}
+ '@vue/runtime-dom@3.5.44':
+ resolution: {integrity: sha512-3fc4ARcXVhVBaJ3ujWiNZJARD6pkyRcwG+ZYhMzjKtKUp7MAY0HLwr7r3Smep3Li6ZaWT6ewdmx8XqdaD5oNZg==}
- '@vue/server-renderer@3.5.39':
- resolution: {integrity: sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==}
- peerDependencies:
- vue: 3.5.39
+ '@vue/server-renderer@3.5.44':
+ resolution: {integrity: sha512-R4S1UoH4h5Frrauv8Z5XE5TxV9oBiUSgWIC4TyVK1FK+RocRnOLwFA5Xcmo2011RlgJp+AbZCnw6afrhlgRuUQ==}
- '@vue/shared@3.5.39':
- resolution: {integrity: sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==}
+ '@vue/shared@3.5.44':
+ resolution: {integrity: sha512-H82XLH0DjmSOdbEwO15x3QTo1f5PWEtv237eLpYKc0mqLu+B8hnq16lFWmuBmNurkeiG3wr+oM1FhOll/YVFRg==}
'@vueuse/core@10.11.1':
resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==}
- '@vueuse/core@13.9.0':
- resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==}
+ '@vueuse/core@15.0.0':
+ resolution: {integrity: sha512-Zv67h5mrk7YHDJsRObx+DXaCBz6RKBUpxqLesJ+3xZNPG6yuQs7ja7kg3veFrrouYLWAqydQ7CwGEbLVxB43Ng==}
+ engines: {node: '>=22'}
peerDependencies:
vue: ^3.5.0
- '@vueuse/integrations@13.9.0':
- resolution: {integrity: sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==}
+ '@vueuse/integrations@15.0.0':
+ resolution: {integrity: sha512-uWC1608pEocJPeRk1IqrEA3uYHhAGTJNibcMAdxgdK2Sy2Hypc6b+VdNO9KekCxyPc4VXK8SKDp8vsXefR/ZFg==}
+ engines: {node: '>=22'}
peerDependencies:
async-validator: ^4
axios: ^1
change-case: ^5
- drauu: ^0.4
- focus-trap: ^7
+ drauu: ^1 || ^0.4
+ focus-trap: ^7 || ^8
fuse.js: ^7
idb-keyval: ^6
jwt-decode: ^4
@@ -1428,30 +1440,25 @@ packages:
'@vueuse/metadata@10.11.1':
resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==}
- '@vueuse/metadata@13.9.0':
- resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==}
+ '@vueuse/metadata@15.0.0':
+ resolution: {integrity: sha512-sfWE5LADAKJ0KnjtGliMdSN8Ij/L7uP6rXIZlgPloAI4zvvefbw6H5Lt7KJA6RqQOYgVqWF5Guj50HHMIzygBg==}
+ engines: {node: '>=22'}
'@vueuse/shared@10.11.1':
resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==}
- '@vueuse/shared@13.9.0':
- resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==}
+ '@vueuse/shared@15.0.0':
+ resolution: {integrity: sha512-vbNXhGrbV53xPOMSyOzMHQRvhMgZf7oNDw2RChUetVxwTIEkInQ1joZ9JbT0G3z2n2AJNjvmCWeM9ySYrnvogA==}
+ engines: {node: '>=22'}
peerDependencies:
vue: ^3.5.0
- acorn-jsx@5.3.2:
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
- peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
-
- acorn@8.16.0:
- resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
- engines: {node: '>=0.4.0'}
- hasBin: true
+ '@workflow/serde@4.1.0':
+ resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==}
- ai@6.0.33:
- resolution: {integrity: sha512-bVokbmy2E2QF6Efl+5hOJx5MRWoacZ/CZY/y1E+VcewknvGlgaiCzMu8Xgddz6ArFJjiMFNUPHKxAhIePE4rmg==}
- engines: {node: '>=18'}
+ ai@7.0.142:
+ resolution: {integrity: sha512-Tifni6/6nNhCu4GnFEeYYR7CGmJ3Yhm44SGxYrOupqP2aaZwmGGiiB5Zx4hiauJR0AWimcXULejDT+Qsj+SHOQ==}
+ engines: {node: '>=22'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
@@ -1463,20 +1470,25 @@ packages:
ajv:
optional: true
+ ajv-i18n@4.2.0:
+ resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==}
+ peerDependencies:
+ ajv: ^8.0.0-beta.0
+
ajv@8.20.0:
resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
- am-i-vibing@0.4.0:
- resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==}
+ am-i-vibing@0.5.0:
+ resolution: {integrity: sha512-KLcsDhqf1XRrJmJr+9I/C0EX2K+sGrAGZFgkmd84c8TJO9zJBu+/kFInjazu1KfJWFhWDKdRWkpBzEs7s35DVA==}
hasBin: true
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
+ ansi-regex@6.4.0:
+ resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==}
+ engines: {node: '>=12'}
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
@@ -1496,21 +1508,14 @@ packages:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
- array-iterate@2.0.1:
- resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
-
- astring@1.9.0:
- resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
- hasBin: true
-
- astro-expressive-code@0.44.1:
- resolution: {integrity: sha512-DT1LnCqbHasBKlvzJ3m6LR4VI94wwx3W9EV/YbP1te4rqjOHsvsezHYuqb5MeLWLftXms/1FA9QBbwCo43DnJQ==}
+ astro-expressive-code@0.44.3:
+ resolution: {integrity: sha512-LUpQmmvzr90JXP5QIAopgdjlOKLuT3x0wlPAUpc4OZtPtFS8sbflPcGPpL/lG3pQuUCQV2CXUFgYNBYNu9tphA==}
peerDependencies:
astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0
- astro@7.3.5:
- resolution: {integrity: sha512-1p/ernaq/RuESbM5NMjWzbO6SiebMGrGcYlGjMfBhzzgM+n/X7AUmVyw8BqW2QYCdivpsHwJBcD1fqmlTZjZHg==}
- engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'}
+ astro@7.4.2:
+ resolution: {integrity: sha512-FAH4cdDlFaVnQGjazLTEIC5vJqGlo5XANc1wIbzQHIqAjJTll/RWTUs+SPNW1JdezG4YGxMZllaE5A41T2kzhA==}
+ engines: {node: '>=22.23.4', npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
peerDependencies:
'@astrojs/markdown-remark': ^7.3.0
@@ -1528,8 +1533,8 @@ packages:
bcp-47-match@2.0.3:
resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==}
- bcp-47@2.1.0:
- resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==}
+ bcp-47@2.1.2:
+ resolution: {integrity: sha512-wsv86UuNFuPnVieKLyECTT+CP1WSAHeoIg5P3xu2kA9Z+7fVPoKt7dxzSeEhtJel0AI+NW3fIW3KtTKQKUCngg==}
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@@ -1537,9 +1542,9 @@ packages:
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
- chalk@5.6.2:
- resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
- engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ chalk@6.0.1:
+ resolution: {integrity: sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==}
+ engines: {node: '>=22'}
character-entities-html4@2.1.0:
resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
@@ -1553,10 +1558,6 @@ packages:
character-reference-invalid@2.0.1:
resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
- chokidar@4.0.3:
- resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
- engines: {node: '>= 14.16.0'}
-
chokidar@5.0.0:
resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
engines: {node: '>= 20.19.0'}
@@ -1565,24 +1566,14 @@ packages:
resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
engines: {node: '>=8'}
- cliui@8.0.1:
- resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
- engines: {node: '>=12'}
+ cliui@9.0.1:
+ resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
+ engines: {node: '>=20'}
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- collapse-white-space@2.1.0:
- resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
-
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
-
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
@@ -1594,10 +1585,6 @@ packages:
resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==}
engines: {node: '>= 18'}
- convert-hrtime@5.0.0:
- resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==}
- engines: {node: '>=12'}
-
cookie-es@1.2.3:
resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
@@ -1675,8 +1662,9 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- devalue@5.8.1:
- resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==}
+ devalue@6.0.3:
+ resolution: {integrity: sha512-3woMEITftG1wKeO/4d/QXH1DVKctTSZg3jNGPpjp9hNr5Hos8MCFF5McTML5ZtgKDObm2R591B0spRp2IVernA==}
+ engines: {node: '>=18'}
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
@@ -1709,11 +1697,11 @@ packages:
emmet@2.4.11:
resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==}
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ emoji-regex@10.6.0:
+ resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
- enhanced-resolve@5.25.1:
- resolution: {integrity: sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==}
+ enhanced-resolve@5.26.0:
+ resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==}
engines: {node: '>=10.13.0'}
entities@4.5.0:
@@ -1728,14 +1716,8 @@ packages:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
- es-module-lexer@2.3.2:
- resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==}
-
- esast-util-from-estree@2.0.0:
- resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
-
- esast-util-from-js@2.0.1:
- resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+ es-module-lexer@3.0.4:
+ resolution: {integrity: sha512-BldNY5mwkVu+cQ5Ymn3e6hB9Sx8XHx4ZevWbiUyZbfKxJxYO27Hf0wfzkxIaD5CAJMaGl3YspKELj0ff/7nCMA==}
esbuild@0.28.2:
resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
@@ -1750,39 +1732,18 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
- estree-util-attach-comments@3.0.0:
- resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
-
- estree-util-build-jsx@3.0.1:
- resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
-
- estree-util-is-identifier-name@3.0.0:
- resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
-
- estree-util-scope@1.0.0:
- resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
-
- estree-util-to-js@2.0.0:
- resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
-
- estree-util-visit@2.0.0:
- resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
-
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- estree-walker@3.0.3:
- resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
-
eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
- eventsource-parser@3.1.0:
- resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
+ eventsource-parser@3.1.1:
+ resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==}
engines: {node: '>=18.0.0'}
- expressive-code@0.44.1:
- resolution: {integrity: sha512-GakidxhapWDzpKLqEaFQ8wGk6gAqEtPQibu8+yPBfnDLgev5Vdsh1pasTxnrXL/mzIknyqeTwhMHTghdaiUrTg==}
+ expressive-code@0.44.3:
+ resolution: {integrity: sha512-7RGslhJTNt01pdn5I3QmVh5C8ZIiSm0A+ORQ9j9r39oOgJVKjn/7dXl9rMT/SqmFLE6pJkTYI7UjW0BxJnW7OQ==}
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@@ -1796,8 +1757,8 @@ packages:
fast-string-width@3.0.2:
resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==}
- fast-uri@3.1.8:
- resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==}
+ fast-uri@3.1.9:
+ resolution: {integrity: sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==}
fast-wrap-ansi@0.2.2:
resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==}
@@ -1811,19 +1772,18 @@ packages:
picomatch:
optional: true
- find-proc@0.2.0:
- resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==}
- engines: {node: ^20.19.0 || >=22.12.0}
-
- flatted@3.4.2:
- resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
+ flatted@3.4.4:
+ resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
flattie@1.1.1:
resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
engines: {node: '>=8'}
- focus-trap@7.8.0:
- resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==}
+ fnv1a-64@0.1.2:
+ resolution: {integrity: sha512-mJbcILTPybAR1jdOwt/lVv8N2cffeJFFP+gVbSAwLEx1ujXH27RpPd8Rokec/KX9c76UYIB6Co+H4lQzxPnJfA==}
+
+ focus-trap@8.2.3:
+ resolution: {integrity: sha512-LTNHZwcFM7bSdU1cG1ExoaTEzoGmdjw+EzDotolZmLTCbm0ll2k6J3NL+WfqP14nGLxAp+XDJgwlT2DtNhcukA==}
fontace@0.4.1:
resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
@@ -1837,24 +1797,20 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
- function-timeout@1.0.2:
- resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==}
- engines: {node: '>=18'}
-
- fuse.js@7.4.2:
- resolution: {integrity: sha512-LVbzjD4WA6UP5B1UnP8wuaXJiLnqMdM/E4fiJXTJ5haJ5b/MBNsK29h2fm6swEoQaVQjvYFWKLE2RanyZIoRVQ==}
+ fuse.js@7.5.0:
+ resolution: {integrity: sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==}
engines: {node: '>=10'}
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
- get-own-enumerable-keys@1.0.0:
- resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==}
- engines: {node: '>=14.16'}
+ get-east-asian-width@1.7.0:
+ resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==}
+ engines: {node: '>=18'}
- get-tsconfig@5.0.0-beta.4:
- resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==}
+ get-tsconfig@5.0.0-beta.6:
+ resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==}
engines: {node: '>=20.20.0'}
github-slugger@2.0.0:
@@ -1909,14 +1865,11 @@ packages:
hast-util-select@6.0.4:
resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==}
- hast-util-to-estree@3.1.3:
- resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==}
-
hast-util-to-html@9.0.5:
resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
- hast-util-to-jsx-runtime@2.3.6:
- resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+ hast-util-to-mdast@10.1.2:
+ resolution: {integrity: sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==}
hast-util-to-parse5@8.0.1:
resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==}
@@ -1924,8 +1877,8 @@ packages:
hast-util-to-string@3.0.1:
resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
- hast-util-to-text@4.0.2:
- resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+ hast-util-to-text@4.0.3:
+ resolution: {integrity: sha512-5yrlWOvGFs6CqHriUpSsNrjzT/Tdo+IOQudbznxOn8K5qblp18MJyzOg8IgDOKQ8MYgQcJA7SusuCjSpDr8mSA==}
hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
@@ -1933,12 +1886,16 @@ packages:
hastscript@9.0.1:
resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
- highlight.js@11.11.1:
- resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
+ highlight.js@11.11.2:
+ resolution: {integrity: sha512-oaXMACAU0kzOMXBjWpNcX+vlwSBCIAiZ9BHa7gA15NOTtT2L/l8OSZDuqS2XppOhZBPJ7hm4o8ep2kyuip2uEQ==}
+ engines: {node: '>=12.0.0'}
+
+ highlight.js@11.12.0:
+ resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==}
engines: {node: '>=12.0.0'}
- hookable@6.1.1:
- resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==}
+ hookable@6.1.2:
+ resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==}
html-escaper@3.0.3:
resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
@@ -1949,24 +1906,17 @@ packages:
html-whitespace-sensitive-tag-names@3.0.1:
resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==}
- http-cache-semantics@4.2.0:
- resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
+ http-cache-semantics@4.3.0:
+ resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==}
- i18next@26.3.6:
- resolution: {integrity: sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==}
+ i18next@26.5.11:
+ resolution: {integrity: sha512-Wc0klBPKxqZ2tL2qdAnF8xvvnWgr1IMGSY2ikTiAvaFVbz7xiFARtkoU4RidBDw1SyziGROp0qxu6qnJ7l2Wug==}
peerDependencies:
typescript: ^5 || ^6 || ^7
peerDependenciesMeta:
typescript:
optional: true
- identifier-regex@1.1.0:
- resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==}
- engines: {node: '>=18'}
-
- inline-style-parser@0.2.7:
- resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
-
iron-webcrypto@1.2.1:
resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
@@ -1988,35 +1938,19 @@ packages:
engines: {node: '>=20'}
hasBin: true
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
is-hexadecimal@2.0.1:
resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
- is-identifier@1.1.0:
- resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==}
- engines: {node: '>=18'}
-
- is-obj@3.0.0:
- resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
- engines: {node: '>=12'}
-
is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
- is-regexp@3.1.0:
- resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==}
- engines: {node: '>=12'}
-
jiti@2.7.0:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
- js-base64@3.8.1:
- resolution: {integrity: sha512-5xVjhUZlHHeuO2W7w2rDFj/Kl1xLX+HjZxdOQwCsUOifl6UaoH1o1wsbsTMz+r0aeC7gCijvru02j6TfKZWzKg==}
+ js-base64@3.9.4:
+ resolution: {integrity: sha512-PtOMXpEGuP0RRiRXsjzHzl44dMHxSu2CPvAhinupR1tBa88me+1DPqsobl7eupn5UukjLkln1ZnAOAOXOrYG0Q==}
js-yaml@4.3.2:
resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==}
@@ -2196,41 +2130,30 @@ packages:
lowlight@3.3.0:
resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==}
- lru-cache@11.5.1:
- resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==}
+ lru-cache@11.5.3:
+ resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==}
engines: {node: 20 || >=22}
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
- magic-string@1.2.1:
- resolution: {integrity: sha512-vCfXkt3lIJha02CjPT1igeysyHVfCsEpIeD20O+X9aJ2hML3/kKx8E9Iv1FB+aMSAlDOEAtpRWzuooQCrYwdUg==}
-
- magicast@0.5.3:
- resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==}
-
- make-asynchronous@1.1.0:
- resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==}
- engines: {node: '>=18'}
+ magic-string@1.4.3:
+ resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==}
- markdown-extensions@2.0.0:
- resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
- engines: {node: '>=16'}
+ magicast@0.5.5:
+ resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==}
markdown-table@3.0.4:
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
- mdast-util-definitions@6.0.0:
- resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
+ mdast-util-directive@3.1.1:
+ resolution: {integrity: sha512-Gqpa3MHorXYEZ0VfbroyvBlVKUfz371V6mIERqOYMcb0W1D3LwmFq1ZW4O2TDrbn+4ZmGLwMWeFRJgYZ+bc5fQ==}
- mdast-util-directive@3.1.0:
- resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
+ mdast-util-find-and-replace@3.0.4:
+ resolution: {integrity: sha512-z4B5c6jrnJ1ltOQemhWYPBSAo6y42Z8Gt2yEgfgNTMcLSU59B8bfj8Z8AnAlJrBGLnqkdAUZ7jdDEqQw3KuipQ==}
- mdast-util-find-and-replace@3.0.2:
- resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
-
- mdast-util-from-markdown@2.0.3:
- resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==}
+ mdast-util-from-markdown@2.1.0:
+ resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==}
mdast-util-gfm-autolink-literal@2.0.1:
resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
@@ -2238,8 +2161,8 @@ packages:
mdast-util-gfm-footnote@2.1.0:
resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
- mdast-util-gfm-strikethrough@2.0.0:
- resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+ mdast-util-gfm-strikethrough@2.0.1:
+ resolution: {integrity: sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==}
mdast-util-gfm-table@2.0.0:
resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
@@ -2250,26 +2173,14 @@ packages:
mdast-util-gfm@3.1.0:
resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
- mdast-util-mdx-expression@2.0.1:
- resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
-
- mdast-util-mdx-jsx@3.2.0:
- resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
-
- mdast-util-mdx@3.0.0:
- resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
-
- mdast-util-mdxjs-esm@2.0.1:
- resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
-
mdast-util-phrasing@4.1.0:
resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
mdast-util-to-hast@13.2.1:
resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
- mdast-util-to-markdown@2.1.2:
- resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+ mdast-util-to-markdown@2.2.0:
+ resolution: {integrity: sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==}
mdast-util-to-string@4.0.0:
resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
@@ -2283,8 +2194,8 @@ packages:
microdiff@1.5.0:
resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==}
- micromark-core-commonmark@2.0.3:
- resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+ micromark-core-commonmark@2.0.4:
+ resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==}
micromark-extension-directive@4.0.0:
resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==}
@@ -2298,8 +2209,8 @@ packages:
micromark-extension-gfm-strikethrough@2.1.0:
resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
- micromark-extension-gfm-table@2.1.1:
- resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+ micromark-extension-gfm-table@2.1.2:
+ resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==}
micromark-extension-gfm-tagfilter@2.0.0:
resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
@@ -2310,32 +2221,14 @@ packages:
micromark-extension-gfm@3.0.0:
resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
- micromark-extension-mdx-expression@3.0.1:
- resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
-
- micromark-extension-mdx-jsx@3.0.2:
- resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
-
- micromark-extension-mdx-md@2.0.0:
- resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
-
- micromark-extension-mdxjs-esm@3.0.0:
- resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
-
- micromark-extension-mdxjs@3.0.0:
- resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
-
micromark-factory-destination@2.0.1:
resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
micromark-factory-label@2.0.1:
resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
- micromark-factory-mdx-expression@2.0.3:
- resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
-
- micromark-factory-space@2.0.1:
- resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+ micromark-factory-space@2.1.0:
+ resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==}
micromark-factory-title@2.0.1:
resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
@@ -2361,12 +2254,12 @@ packages:
micromark-util-decode-string@2.0.1:
resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+ micromark-util-edit-map@1.0.0:
+ resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==}
+
micromark-util-encode@2.0.1:
resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
- micromark-util-events-to-acorn@2.0.3:
- resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
-
micromark-util-html-tag-name@2.0.1:
resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
@@ -2385,11 +2278,11 @@ packages:
micromark-util-symbol@2.0.1:
resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
- micromark-util-types@2.0.2:
- resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+ micromark-util-types@2.0.3:
+ resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==}
- micromark@4.0.2:
- resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+ micromark@4.0.3:
+ resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==}
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
@@ -2401,8 +2294,8 @@ packages:
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
- nanoid@3.3.19:
- resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==}
+ nanoid@3.3.20:
+ resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -2424,8 +2317,8 @@ packages:
node-fetch-native@1.6.7:
resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
- node-mock-http@1.0.4:
- resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==}
+ node-mock-http@1.0.5:
+ resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==}
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -2441,37 +2334,40 @@ packages:
ofetch@1.5.1:
resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
- ohash@2.0.11:
- resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
-
oniguruma-parser@0.12.2:
resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==}
oniguruma-to-es@4.3.6:
resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==}
- p-event@6.0.1:
- resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==}
- engines: {node: '>=16.17'}
+ oxc-walker@1.1.1:
+ resolution: {integrity: sha512-Hwd7dq28zu/Er99+bpWp16CGwFrhyalJh0W3JOB7XpPvgWo3MqMi2ksWGKuzzA9zt50mJ2pIUwR5lpAdZ9ACNQ==}
+ peerDependencies:
+ '@oxc-project/types': '>=0.98.0'
+ oxc-parser: '>=0.98.0'
+ rolldown: '>=1.0.0'
+ peerDependenciesMeta:
+ '@oxc-project/types':
+ optional: true
+ oxc-parser:
+ optional: true
+ rolldown:
+ optional: true
- p-limit@7.3.1:
- resolution: {integrity: sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==}
+ p-limit@7.3.3:
+ resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==}
engines: {node: '>=20'}
- p-queue@9.3.3:
- resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==}
+ p-queue@9.3.5:
+ resolution: {integrity: sha512-Lki/zhXFVmDhesBUn/yHRLW9Bte7mE7xoFHzTR8sIomV7a2z+LxYAPkGvdfidNiu4fKSfjtawixxSHcZci5QcQ==}
engines: {node: '>=20'}
- p-timeout@6.1.4:
- resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
- engines: {node: '>=14.16'}
-
- p-timeout@7.0.1:
- resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==}
+ p-timeout@7.0.2:
+ resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==}
engines: {node: '>=20'}
- package-manager-detector@1.6.0:
- resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==}
+ package-manager-detector@1.9.0:
+ resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==}
pagefind@1.5.2:
resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==}
@@ -2480,13 +2376,6 @@ packages:
parse-entities@4.0.2:
resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
- parse-latin@7.0.0:
- resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
-
- parse-ms@4.0.0:
- resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
- engines: {node: '>=18'}
-
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
@@ -2506,36 +2395,32 @@ packages:
resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
engines: {node: '>=8.6'}
- picomatch@4.0.4:
- resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
- engines: {node: '>=12'}
-
- picomatch@4.0.5:
- resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
+ picomatch@4.0.7:
+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
- postcss-nested@6.2.0:
- resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
- engines: {node: '>=12.0'}
+ postcss-nested@7.0.2:
+ resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==}
+ engines: {node: '>=18.0'}
peerDependencies:
postcss: ^8.2.14
- postcss-selector-parser@6.1.2:
- resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ postcss-selector-parser@7.1.7:
+ resolution: {integrity: sha512-wWBro/7hJ40ye6TPiXkUQoXKCw23xSsjriUvqd7Uls9Sso3oLiON1flc18cCdnjgCRXw4fBVqUJJeOdDTh3P3g==}
engines: {node: '>=4'}
- postcss@8.5.28:
- resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
+ postcss@8.5.31:
+ resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==}
engines: {node: ^10 || ^12 || >=14}
- prettier@3.8.3:
- resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==}
+ prettier@3.9.10:
+ resolution: {integrity: sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==}
engines: {node: '>=14'}
hasBin: true
- pretty-ms@9.3.0:
- resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==}
- engines: {node: '>=18'}
+ pretty-ms@10.0.0:
+ resolution: {integrity: sha512-6BWuxY2dCNgT45VnGzZcfNy7WeLqXiZqhhy4aHThTE6KI56R2ZBw9HQ7spPFKYchDizvJbPxTEknIpmW4FSmQA==}
+ engines: {node: '>=22'}
prismjs@1.30.0:
resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
@@ -2545,8 +2430,8 @@ packages:
resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==}
engines: {node: '>=18.0.0'}
- property-information@7.1.0:
- resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
+ property-information@7.2.0:
+ resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==}
radix-vue@1.9.17:
resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==}
@@ -2556,28 +2441,10 @@ packages:
radix3@1.1.2:
resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
- readdirp@4.1.2:
- resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
- engines: {node: '>= 14.18.0'}
-
- readdirp@5.0.0:
- resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+ readdirp@5.1.1:
+ resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
engines: {node: '>= 20.19.0'}
- recma-build-jsx@1.0.0:
- resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
-
- recma-jsx@1.0.1:
- resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==}
- peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
-
- recma-parse@1.0.0:
- resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
-
- recma-stringify@1.0.0:
- resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
-
regex-recursion@6.0.2:
resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
@@ -2587,8 +2454,8 @@ packages:
regex@6.1.0:
resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
- rehype-expressive-code@0.44.1:
- resolution: {integrity: sha512-+VZgs7Evw4LXRN3owpoBNSTpYuW6GeOdjqcUT1TuY8o/4MGPtbd0EU7Bgrju7X8KrQ6SslOBAuGWJ5fV5TriJQ==}
+ rehype-expressive-code@0.44.3:
+ resolution: {integrity: sha512-vaVuQPobFXvmtcHXQ5uqXZlzuuPnLyIuZcX/03sX1U/Qfj9fZrPYI9w66OSr/PUx6alzRYmreEwgYBbsVx8HsA==}
rehype-external-links@3.0.0:
resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==}
@@ -2596,14 +2463,17 @@ packages:
rehype-format@5.0.1:
resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==}
+ rehype-minify-whitespace@6.0.2:
+ resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==}
+
rehype-parse@9.0.1:
resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
rehype-raw@7.0.0:
resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
- rehype-recma@1.0.0:
- resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+ rehype-remark@10.0.1:
+ resolution: {integrity: sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==}
rehype-sanitize@6.0.0:
resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==}
@@ -2611,28 +2481,18 @@ packages:
rehype-stringify@10.0.1:
resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
- rehype@13.0.2:
- resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
-
remark-directive@4.0.0:
resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==}
remark-gfm@4.0.1:
resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
- remark-mdx@3.1.1:
- resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==}
-
remark-parse@11.0.0:
resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
remark-rehype@11.1.2:
resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
- remark-smartypants@3.0.2:
- resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==}
- engines: {node: '>=16.0.0'}
-
remark-stringify@11.0.0:
resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
@@ -2642,43 +2502,23 @@ packages:
request-light@0.7.0:
resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==}
- require-directory@2.1.1:
- resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
- engines: {node: '>=0.10.0'}
-
require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
- reserved-identifiers@1.2.0:
- resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==}
- engines: {node: '>=18'}
-
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
- retext-latin@4.0.0:
- resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
-
retext-smartypants@6.2.0:
resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
- retext-stringify@4.0.0:
- resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==}
-
- retext@9.0.0:
- resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==}
-
- rolldown@1.2.5:
- resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==}
+ rolldown@1.2.15:
+ resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
- satteri@0.10.4:
- resolution: {integrity: sha512-EFgJouHlS3aV9/ATS73J9h4/pgW8Q+ZBLP0TpUUTfbZxh/cZ47ewuhYDR3LYQ9WbTPPAon5sDfLdBebrr16qeA==}
-
- satteri@0.9.5:
- resolution: {integrity: sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==}
+ satteri@0.10.5:
+ resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==}
sax@1.6.1:
resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
@@ -2689,11 +2529,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
- set-cookie-parser@3.1.0:
- resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==}
+ set-cookie-parser@3.1.3:
+ resolution: {integrity: sha512-xletSdAI5efyVJjsatBbzDkXl3M/Zmad3xfnQe7ZXuBB0yNwW7C2WFsNGjdRNfZunmNHQuX79xs/ACMTLCdcew==}
- sharp@0.35.4:
- resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==}
+ sharp@0.35.5:
+ resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==}
engines: {node: '>=20.9.0'}
peerDependencies:
'@types/node': '*'
@@ -2701,8 +2541,8 @@ packages:
'@types/node':
optional: true
- shiki@4.4.3:
- resolution: {integrity: sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==}
+ shiki@4.5.0:
+ resolution: {integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==}
engines: {node: '>=20'}
sisteransi@1.0.5:
@@ -2713,23 +2553,19 @@ packages:
engines: {node: '>=20.19.5', npm: '>=10.8.2'}
hasBin: true
- smol-toml@1.9.0:
- resolution: {integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==}
+ smol-toml@1.9.1:
+ resolution: {integrity: sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==}
engines: {node: '>= 18'}
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ source-map-js@1.2.2:
+ resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==}
engines: {node: '>=0.10.0'}
- source-map@0.7.6:
- resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
- engines: {node: '>= 12'}
-
space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
- stream-replace-string@2.0.0:
- resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==}
+ std-env@4.3.0:
+ resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==}
string-byte-length@3.0.1:
resolution: {integrity: sha512-yJ8vP0HMwZ54CcA8S8mKoXbkezpZHANFtmafFo8lGxZThCQcAwRHjdFabuSLgOzxj9OFJcmssmiAvmcOK4O2Hw==}
@@ -2739,53 +2575,47 @@ packages:
resolution: {integrity: sha512-GWv2K4lYyd2+AhmKH3BV+OVx62xDX+99rSLfKpaqFiQU7uOMaUY1tDjdrRD4gsrCr9lTyjMgjna7tZcCOw+Smg==}
engines: {node: '>=18.18.0'}
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
- stringify-entities@4.0.4:
- resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
- stringify-object@6.0.0:
- resolution: {integrity: sha512-6f94vIED6vmJJfh3lyVsVWxCYSfI5uM+16ntED/Ql37XIyV6kj0mRAAiTeMMc/QLYIaizC3bUprQ8pQnDDrKfA==}
+ string-width@8.3.0:
+ resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==}
engines: {node: '>=20'}
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- style-mod@4.1.3:
- resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==}
-
- style-to-js@1.1.21:
- resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
- style-to-object@1.0.14:
- resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
+ strip-ansi@7.2.0:
+ resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+ engines: {node: '>=12'}
- super-regex@1.1.0:
- resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==}
- engines: {node: '>=18'}
+ style-mod@4.1.4:
+ resolution: {integrity: sha512-XXWIQt633/EpAFx8aZDOTjBzrCaGmhvEQlQo6MVPfa2OzO2cWo+4hV9h+6UkHYlXGfy+ODXKUdP7Pthmcu5ATw==}
svgo@4.1.0:
resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==}
engines: {node: '>=16'}
hasBin: true
- swrv@1.2.0:
- resolution: {integrity: sha512-lH/g4UcNyj+7lzK4eRGT4C68Q4EhQ6JtM9otPRIASfhhzfLWtbZPHcMuhuba7S9YVYuxkMUGImwMyGpfbkH07A==}
+ swrv@1.3.0:
+ resolution: {integrity: sha512-6uyQ79QemgpJzdwVNkxZdypTmKC80uHdjSZGAGo0HnizL2AzQJUZXQFR3KZq8yru32IC7HngiBA7o2FtL/Lozw==}
peerDependencies:
- vue: '>=3.2.26 < 4'
+ '@vue/test-utils': '>=2.0.0'
+ vue: ^3.2.0
+ peerDependenciesMeta:
+ '@vue/test-utils':
+ optional: true
- tabbable@6.5.0:
- resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==}
+ tabbable@6.5.1:
+ resolution: {integrity: sha512-dMCuwDUY6Noz3zVKLefBC4wq+aJV20yc7vWmM7uTNGwtQSFF5kX7OUIUsxuVajz/bdt5Xqdah3/0NLjth+cM5A==}
tagged-tag@1.0.0:
resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
engines: {node: '>=20'}
- tailwind-merge@3.5.0:
- resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==}
+ tailwind-merge@3.7.0:
+ resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==}
tailwindcss@4.3.3:
resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
@@ -2794,10 +2624,6 @@ packages:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
- time-span@5.1.0:
- resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==}
- engines: {node: '>=12'}
-
tiny-inflate@1.0.3:
resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
@@ -2805,21 +2631,23 @@ packages:
resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==}
engines: {node: ^16.14.0 || >= 17.3.0}
- tinyexec@1.2.2:
- resolution: {integrity: sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==}
+ tinyexec@1.3.1:
+ resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==}
engines: {node: '>=18'}
- tinyglobby@0.2.16:
- resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
- engines: {node: '>=12.0.0'}
-
tinyglobby@0.2.17:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
+ tinyps@0.5.1:
+ resolution: {integrity: sha512-B6Ykif5HflC3AdDkS4Zst/2muYVfeXoVMy+KorqH80s/1x4vunIORpNySH681X7fjj+dFM9MDKD6/Hsccjb87Q==}
+
trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+ trim-trailing-lines@2.1.0:
+ resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==}
+
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
@@ -2830,12 +2658,8 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
- type-fest@4.41.0:
- resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
- engines: {node: '>=16'}
-
- type-fest@5.8.0:
- resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==}
+ type-fest@5.10.0:
+ resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==}
engines: {node: '>=20'}
typesafe-path@0.2.2:
@@ -2844,68 +2668,98 @@ packages:
typescript-auto-import-cache@0.3.6:
resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==}
- typescript@5.9.3:
- resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
engines: {node: '>=14.17'}
hasBin: true
ufo@1.6.4:
resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
- ultrahtml@1.6.0:
- resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==}
+ ultrahtml@1.7.0:
+ resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==}
uncrypto@0.1.3:
resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
- undici-types@7.16.0:
- resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+ undici-types@7.24.6:
+ resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==}
+
+ undici@7.30.1:
+ resolution: {integrity: sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==}
+ engines: {node: '>=20.18.1'}
- undici@8.11.2:
- resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==}
+ undici@8.12.3:
+ resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==}
engines: {node: '>=22.19.0'}
- unhead@2.1.15:
- resolution: {integrity: sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==}
+ unhead@3.4.3:
+ resolution: {integrity: sha512-0FZI/qCCyIey14CKlGMFpiQumWSatlthJy7Xvro7H3nmi/V2owkcCXG03k0GXDc2/TV1K6bvrbAwhzTRe5Nhdw==}
+ peerDependencies:
+ vite: '>=6.4.2'
+ peerDependenciesMeta:
+ vite:
+ optional: true
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
- unifont@0.7.5:
- resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==}
-
- unist-util-find-after@5.0.0:
- resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+ unifont@1.0.3:
+ resolution: {integrity: sha512-XGnEwj5sWdCbiBX01mWLSBncS0yMRjnLygau3IfdOlfjMacNIQvTGW4VH7pWBq+gGWArfSef/CensMLjMmIr/A==}
unist-util-is@6.0.1:
resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
- unist-util-modify-children@4.0.0:
- resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
-
- unist-util-position-from-estree@2.0.0:
- resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
-
unist-util-position@5.0.0:
resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
- unist-util-remove-position@5.0.0:
- resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
-
unist-util-stringify-position@4.0.0:
resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
- unist-util-visit-children@3.0.0:
- resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==}
+ unist-util-visit-parents@6.1.0:
+ resolution: {integrity: sha512-vKXxz6O38sKDj1mtx/k2cWvkkFBuYGx6uGrlzBkVeWCRF/F8sdI0j3Wbkz/5rVNRRuVc8UrgRdbCxNhmYXgP3w==}
- unist-util-visit-parents@6.0.2:
- resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+ unist-util-visit@5.2.0:
+ resolution: {integrity: sha512-fpsYs/VVoZxfGY9/j3FQpZmN8wdLJaV1Pt38AaJNZu9uKIHcFU3halCdBveEq1HGKO1OEfJY65w1zvoFV1b3qQ==}
- unist-util-visit@5.1.0:
- resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+ unplugin@3.4.0:
+ resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@farmfe/core': '*'
+ '@rsbuild/core': '*'
+ '@rspack/core': '*'
+ bun-types-no-globals: '*'
+ esbuild: '*'
+ rolldown: '*'
+ rollup: '*'
+ unloader: '*'
+ vite: '*'
+ webpack: '*'
+ peerDependenciesMeta:
+ '@farmfe/core':
+ optional: true
+ '@rsbuild/core':
+ optional: true
+ '@rspack/core':
+ optional: true
+ bun-types-no-globals:
+ optional: true
+ esbuild:
+ optional: true
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+ unloader:
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
- unstorage@1.17.5:
- resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==}
+ unstorage@1.17.6:
+ resolution: {integrity: sha512-gjKtcmn/KwZuJZO9o2sc0esAQnhmTw0LviDHwevTXbJMYs0dRTp8ZEEWXHU0vTpzbN3cA0yxlTeyXssMp3zDqw==}
peerDependencies:
'@azure/app-configuration': ^1.8.0
'@azure/cosmos': ^4.2.0
@@ -2915,7 +2769,7 @@ packages:
'@azure/storage-blob': ^12.26.0
'@capacitor/preferences': ^6 || ^7 || ^8
'@deno/kv': '>=0.9.0'
- '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
'@planetscale/database': ^1.19.0
'@upstash/redis': ^1.34.3
'@vercel/blob': '>=0.27.1'
@@ -2973,8 +2827,8 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- verkit@0.4.1:
- resolution: {integrity: sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==}
+ verkit@0.5.0:
+ resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==}
engines: {node: '>=18.12.0'}
vfile-location@5.0.3:
@@ -2986,13 +2840,13 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vite@8.2.1:
- resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==}
+ vite@8.3.5:
+ resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
- '@vitejs/devtools': ^0.4.0
+ '@vitejs/devtools': ^0.7.1 || ^0.8.0
esbuild: ^0.27.0 || ^0.28.0
jiti: '>=1.21.0'
less: ^4.0.0
@@ -3037,32 +2891,32 @@ packages:
vite:
optional: true
- volar-service-css@0.0.70:
- resolution: {integrity: sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==}
+ volar-service-css@0.0.71:
+ resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==}
peerDependencies:
'@volar/language-service': ~2.4.0
peerDependenciesMeta:
'@volar/language-service':
optional: true
- volar-service-emmet@0.0.70:
- resolution: {integrity: sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg==}
+ volar-service-emmet@0.0.71:
+ resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==}
peerDependencies:
'@volar/language-service': ~2.4.0
peerDependenciesMeta:
'@volar/language-service':
optional: true
- volar-service-html@0.0.70:
- resolution: {integrity: sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ==}
+ volar-service-html@0.0.71:
+ resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==}
peerDependencies:
'@volar/language-service': ~2.4.0
peerDependenciesMeta:
'@volar/language-service':
optional: true
- volar-service-prettier@0.0.70:
- resolution: {integrity: sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==}
+ volar-service-prettier@0.0.71:
+ resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==}
peerDependencies:
'@volar/language-service': ~2.4.0
prettier: ^2.2 || ^3.0
@@ -3072,24 +2926,24 @@ packages:
prettier:
optional: true
- volar-service-typescript-twoslash-queries@0.0.70:
- resolution: {integrity: sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==}
+ volar-service-typescript-twoslash-queries@0.0.71:
+ resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==}
peerDependencies:
'@volar/language-service': ~2.4.0
peerDependenciesMeta:
'@volar/language-service':
optional: true
- volar-service-typescript@0.0.70:
- resolution: {integrity: sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==}
+ volar-service-typescript@0.0.71:
+ resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==}
peerDependencies:
'@volar/language-service': ~2.4.0
peerDependenciesMeta:
'@volar/language-service':
optional: true
- volar-service-yaml@0.0.70:
- resolution: {integrity: sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==}
+ volar-service-yaml@0.0.71:
+ resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==}
peerDependencies:
'@volar/language-service': ~2.4.0
peerDependenciesMeta:
@@ -3106,6 +2960,10 @@ packages:
resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==}
engines: {npm: '>=7.0.0'}
+ vscode-jsonrpc@10.0.0:
+ resolution: {integrity: sha512-USSfxg0vDIpTQqlQBGxF3mBARyoS8cU7LHLpbYNh6dOJt32dlskxPWB0Irrh5TllTmyf7oNLAvqDqzklbwwnpA==}
+ engines: {node: '>=14.17.0'}
+
vscode-jsonrpc@8.2.0:
resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
engines: {node: '>=14.0.0'}
@@ -3113,12 +2971,18 @@ packages:
vscode-languageserver-protocol@3.17.5:
resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
- vscode-languageserver-textdocument@1.0.12:
- resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
+ vscode-languageserver-protocol@3.18.5:
+ resolution: {integrity: sha512-FW4fBMzZ99N8xeob4py0l050wgCoRgTpEq5Xcsb9lM1bc29UKGR/wSV+4knaqFxssFHajy7OzNiKP/m3U1ZEuA==}
+
+ vscode-languageserver-textdocument@1.0.16:
+ resolution: {integrity: sha512-qeNEuOi9a3qkqRf7Gfez2WL2VwlBTLCNekHBGO9kxPVUp9XuY15yfTJ9jwvOwKI0I2MhUUfZq95NSp+LK1CLQg==}
vscode-languageserver-types@3.17.5:
resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+ vscode-languageserver-types@3.18.5:
+ resolution: {integrity: sha512-kPd6+JQNz3HMJvjKlqUxERSlZHAntl/aGpsk7ImwIh0ewDKDcjgAEyVSYciPiOJD3ftbK9IrfiqUeTZLSbCizw==}
+
vscode-languageserver@9.0.1:
resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
hasBin: true
@@ -3126,11 +2990,11 @@ packages:
vscode-nls@5.2.0:
resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==}
- vscode-uri@3.1.0:
- resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+ vscode-uri@3.2.0:
+ resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==}
- vue-component-type-helpers@3.3.7:
- resolution: {integrity: sha512-Skkhw9agYSgsWqv7bxSOGJZa9SaiJbZVGdXuFWnrzKaQYHnw9qbjD630rw6RyMqDbp54nfLCLw5SZA55if7JLg==}
+ vue-component-type-helpers@3.3.13:
+ resolution: {integrity: sha512-02KCxSmKDhIITjKyJ4QT5csP6L0WoRborLqY/34a40+S9uvMvdNgMV0yVjO3p2Gkz3ZoPmFz/0JsGHacwJYTxw==}
vue-demi@0.14.10:
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
@@ -3143,13 +3007,24 @@ packages:
'@vue/composition-api':
optional: true
- vue-sonner@1.3.2:
- resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==}
-
- vue@3.5.39:
- resolution: {integrity: sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==}
+ vue-sonner@2.0.9:
+ resolution: {integrity: sha512-i6BokNlNDL93fpzNxN/LZSn6D6MzlO+i3qXt6iVZne3x1k7R46d5HlFB4P8tYydhgqOrRbIZEsnRd3kG7qGXyw==}
peerDependencies:
- typescript: '*'
+ '@nuxt/kit': ^4.0.3
+ '@nuxt/schema': ^4.0.3
+ nuxt: ^4.0.3
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+ '@nuxt/schema':
+ optional: true
+ nuxt:
+ optional: true
+
+ vue@3.5.44:
+ resolution: {integrity: sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ==}
+ peerDependencies:
+ typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
@@ -3160,12 +3035,12 @@ packages:
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
- web-worker@1.5.0:
- resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==}
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
xxhash-wasm@1.1.0:
resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
@@ -3174,480 +3049,403 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
- yaml-language-server@1.20.0:
- resolution: {integrity: sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==}
+ yaml-language-server@1.23.0:
+ resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==}
hasBin: true
- yaml@2.7.1:
- resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==}
- engines: {node: '>= 14'}
+ yaml@2.8.3:
+ resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==}
+ engines: {node: '>= 14.6'}
hasBin: true
- yaml@2.9.0:
- resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
+ yaml@2.9.1:
+ resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==}
engines: {node: '>= 14.6'}
hasBin: true
- yargs-parser@21.1.1:
- resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
- engines: {node: '>=12'}
-
yargs-parser@22.0.0:
resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
engines: {node: ^20.19.0 || ^22.12.0 || >=23}
- yargs@17.7.2:
- resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
- engines: {node: '>=12'}
+ yargs@18.2.0:
+ resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
yocto-queue@1.2.2:
resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
engines: {node: '>=12.20'}
- zod@4.4.3:
- resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
-
- zod@4.6.5:
- resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==}
+ zod@4.6.7:
+ resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==}
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
snapshots:
- '@ai-sdk/gateway@3.0.13(zod@4.6.5)':
+ '@ai-sdk/gateway@4.0.115(zod@4.6.7)':
dependencies:
- '@ai-sdk/provider': 3.0.2
- '@ai-sdk/provider-utils': 4.0.5(zod@4.6.5)
- '@vercel/oidc': 3.1.0
- zod: 4.6.5
+ '@ai-sdk/provider': 4.0.28
+ '@ai-sdk/provider-utils': 5.0.61(zod@4.6.7)
+ '@vercel/oidc': 3.2.0
+ zod: 4.6.7
- '@ai-sdk/provider-utils@4.0.5(zod@4.6.5)':
+ '@ai-sdk/provider-utils@5.0.61(zod@4.6.7)':
dependencies:
- '@ai-sdk/provider': 3.0.2
+ '@ai-sdk/provider': 4.0.28
'@standard-schema/spec': 1.1.0
- eventsource-parser: 3.1.0
- zod: 4.6.5
+ '@workflow/serde': 4.1.0
+ eventsource-parser: 3.1.1
+ undici: 7.30.1
+ zod: 4.6.7
- '@ai-sdk/provider@3.0.2':
+ '@ai-sdk/provider@4.0.28':
dependencies:
json-schema: 0.4.0
- '@ai-sdk/vue@3.0.33(vue@3.5.39(typescript@5.9.3))(zod@4.6.5)':
+ '@ai-sdk/vue@4.0.142(vue@3.5.44(typescript@6.0.3))(zod@4.6.7)':
dependencies:
- '@ai-sdk/provider-utils': 4.0.5(zod@4.6.5)
- ai: 6.0.33(zod@4.6.5)
- swrv: 1.2.0(vue@3.5.39(typescript@5.9.3))
- vue: 3.5.39(typescript@5.9.3)
+ '@ai-sdk/provider-utils': 5.0.61(zod@4.6.7)
+ ai: 7.0.142(zod@4.6.7)
+ swrv: 1.3.0(vue@3.5.44(typescript@6.0.3))
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
+ - '@vue/test-utils'
- zod
- '@astrojs/check@0.9.9(prettier@3.8.3)(typescript@5.9.3)':
+ '@astrojs/astro2tsx@0.1.3(@emnapi/runtime@1.11.3)':
dependencies:
- '@astrojs/language-server': 2.16.10(prettier@3.8.3)(typescript@5.9.3)
- chokidar: 4.0.3
+ '@emnapi/core': 1.11.3
+ '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
+ transitivePeerDependencies:
+ - '@emnapi/runtime'
+
+ '@astrojs/check@0.9.12(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@6.0.3)':
+ dependencies:
+ '@astrojs/language-server': 2.17.3(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@6.0.3)
+ chokidar: 5.0.0
kleur: 4.1.5
- typescript: 5.9.3
- yargs: 17.7.2
+ typescript: 6.0.3
+ yargs: 18.2.0
transitivePeerDependencies:
+ - '@emnapi/runtime'
- prettier
- prettier-plugin-astro
- '@astrojs/compiler-binding-android-arm64@0.5.0':
+ '@astrojs/compiler-binding-android-arm64@0.5.2':
optional: true
- '@astrojs/compiler-binding-darwin-arm64@0.5.0':
+ '@astrojs/compiler-binding-darwin-arm64@0.5.2':
optional: true
- '@astrojs/compiler-binding-darwin-x64@0.5.0':
+ '@astrojs/compiler-binding-darwin-x64@0.5.2':
optional: true
- '@astrojs/compiler-binding-linux-arm64-gnu@0.5.0':
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.5.2':
optional: true
- '@astrojs/compiler-binding-linux-arm64-musl@0.5.0':
+ '@astrojs/compiler-binding-linux-arm64-musl@0.5.2':
optional: true
- '@astrojs/compiler-binding-linux-x64-gnu@0.5.0':
+ '@astrojs/compiler-binding-linux-x64-gnu@0.5.2':
optional: true
- '@astrojs/compiler-binding-linux-x64-musl@0.5.0':
+ '@astrojs/compiler-binding-linux-x64-musl@0.5.2':
optional: true
- '@astrojs/compiler-binding-wasm32-wasi@0.5.0':
+ '@astrojs/compiler-binding-wasm32-wasi@0.5.2':
dependencies:
'@emnapi/core': 1.11.3
'@emnapi/runtime': 1.11.3
- '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
+ '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
optional: true
- '@astrojs/compiler-binding-win32-arm64-msvc@0.5.0':
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2':
optional: true
- '@astrojs/compiler-binding-win32-x64-msvc@0.5.0':
+ '@astrojs/compiler-binding-win32-x64-msvc@0.5.2':
optional: true
- '@astrojs/compiler-binding@0.5.0':
+ '@astrojs/compiler-binding@0.5.2':
optionalDependencies:
- '@astrojs/compiler-binding-android-arm64': 0.5.0
- '@astrojs/compiler-binding-darwin-arm64': 0.5.0
- '@astrojs/compiler-binding-darwin-x64': 0.5.0
- '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.0
- '@astrojs/compiler-binding-linux-arm64-musl': 0.5.0
- '@astrojs/compiler-binding-linux-x64-gnu': 0.5.0
- '@astrojs/compiler-binding-linux-x64-musl': 0.5.0
- '@astrojs/compiler-binding-wasm32-wasi': 0.5.0
- '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.0
- '@astrojs/compiler-binding-win32-x64-msvc': 0.5.0
+ '@astrojs/compiler-binding-android-arm64': 0.5.2
+ '@astrojs/compiler-binding-darwin-arm64': 0.5.2
+ '@astrojs/compiler-binding-darwin-x64': 0.5.2
+ '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.2
+ '@astrojs/compiler-binding-linux-arm64-musl': 0.5.2
+ '@astrojs/compiler-binding-linux-x64-gnu': 0.5.2
+ '@astrojs/compiler-binding-linux-x64-musl': 0.5.2
+ '@astrojs/compiler-binding-wasm32-wasi': 0.5.2
+ '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.2
+ '@astrojs/compiler-binding-win32-x64-msvc': 0.5.2
- '@astrojs/compiler-rs@0.5.0':
+ '@astrojs/compiler-rs@0.5.2':
dependencies:
- '@astrojs/compiler-binding': 0.5.0
+ '@astrojs/compiler-binding': 0.5.2
- '@astrojs/compiler@2.13.1': {}
-
- '@astrojs/internal-helpers@0.10.4':
+ '@astrojs/internal-helpers@0.13.0':
dependencies:
'@types/hast': 3.0.5
'@types/mdast': 4.0.4
- js-yaml: 4.3.2
- picomatch: 4.0.5
+ picomatch: 4.0.7
retext-smartypants: 6.2.0
- shiki: 4.4.3
- smol-toml: 1.9.0
+ shiki: 4.5.0
+ smol-toml: 1.9.1
unified: 11.0.5
+ yaml: 2.9.1
- '@astrojs/internal-helpers@0.11.0':
+ '@astrojs/language-server@2.17.3(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@6.0.3)':
dependencies:
- '@types/hast': 3.0.5
- '@types/mdast': 4.0.4
- js-yaml: 4.3.2
- picomatch: 4.0.5
- retext-smartypants: 6.2.0
- shiki: 4.4.3
- smol-toml: 1.9.0
- unified: 11.0.5
-
- '@astrojs/language-server@2.16.10(prettier@3.8.3)(typescript@5.9.3)':
- dependencies:
- '@astrojs/compiler': 2.13.1
+ '@astrojs/astro2tsx': 0.1.3(@emnapi/runtime@1.11.3)
'@astrojs/yaml2ts': 0.2.4
- '@jridgewell/sourcemap-codec': 1.5.5
- '@volar/kit': 2.4.28(typescript@5.9.3)
- '@volar/language-core': 2.4.28
- '@volar/language-server': 2.4.28
- '@volar/language-service': 2.4.28
+ '@volar/kit': 2.4.30(typescript@6.0.3)
+ '@volar/language-core': 2.4.30
+ '@volar/language-server': 2.4.30(typescript@6.0.3)
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
muggle-string: 0.4.1
- tinyglobby: 0.2.16
- volar-service-css: 0.0.70(@volar/language-service@2.4.28)
- volar-service-emmet: 0.0.70(@volar/language-service@2.4.28)
- volar-service-html: 0.0.70(@volar/language-service@2.4.28)
- volar-service-prettier: 0.0.70(@volar/language-service@2.4.28)(prettier@3.8.3)
- volar-service-typescript: 0.0.70(@volar/language-service@2.4.28)
- volar-service-typescript-twoslash-queries: 0.0.70(@volar/language-service@2.4.28)
- volar-service-yaml: 0.0.70(@volar/language-service@2.4.28)
+ tinyglobby: 0.2.17
+ volar-service-css: 0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))
+ volar-service-emmet: 0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))
+ volar-service-html: 0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))
+ volar-service-prettier: 0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))(prettier@3.9.10)
+ volar-service-typescript: 0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))
+ volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))
+ volar-service-yaml: 0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))
vscode-html-languageservice: 5.6.2
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
optionalDependencies:
- prettier: 3.8.3
+ prettier: 3.9.10
transitivePeerDependencies:
+ - '@emnapi/runtime'
- typescript
- '@astrojs/markdown-remark@7.2.4':
- dependencies:
- '@astrojs/internal-helpers': 0.10.4
- '@astrojs/prism': 4.0.2
- github-slugger: 2.0.0
- hast-util-from-html: 2.0.3
- hast-util-to-text: 4.0.2
- mdast-util-definitions: 6.0.0
- rehype-raw: 7.0.0
- rehype-stringify: 10.0.1
- remark-gfm: 4.0.1
- remark-parse: 11.0.0
- remark-rehype: 11.1.2
- remark-smartypants: 3.0.2
- unified: 11.0.5
- unist-util-remove-position: 5.0.0
- unist-util-visit: 5.1.0
- unist-util-visit-parents: 6.0.2
- vfile: 6.0.3
- transitivePeerDependencies:
- - supports-color
-
- '@astrojs/markdown-satteri@0.3.7':
- dependencies:
- '@astrojs/internal-helpers': 0.10.4
- '@astrojs/prism': 4.0.2
- github-slugger: 2.0.0
- satteri: 0.10.4
-
- '@astrojs/markdown-satteri@0.4.2':
+ '@astrojs/markdown-satteri@0.4.5':
dependencies:
- '@astrojs/internal-helpers': 0.11.0
- '@astrojs/prism': 4.0.2
+ '@astrojs/internal-helpers': 0.13.0
+ '@astrojs/prism': 4.1.1
github-slugger: 2.0.0
- satteri: 0.10.4
+ satteri: 0.10.5
- '@astrojs/mdx@7.0.7(@astrojs/markdown-satteri@0.3.7)(astro@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0))':
+ '@astrojs/mdx@8.1.1(@astrojs/markdown-satteri@0.4.5)(astro@7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
- '@astrojs/internal-helpers': 0.10.4
- '@astrojs/markdown-remark': 7.2.4
- '@mdx-js/mdx': 3.1.1
- acorn: 8.16.0
- astro: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0)
- es-module-lexer: 2.3.2
- estree-util-visit: 2.0.0
- hast-util-to-html: 9.0.5
- piccolore: 0.1.3
- rehype-raw: 7.0.0
- remark-gfm: 4.0.1
- remark-smartypants: 3.0.2
- source-map: 0.7.6
- unist-util-visit: 5.1.0
- vfile: 6.0.3
- optionalDependencies:
- '@astrojs/markdown-satteri': 0.3.7
- transitivePeerDependencies:
- - supports-color
+ '@astrojs/internal-helpers': 0.13.0
+ '@astrojs/markdown-satteri': 0.4.5
+ astro: 7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ es-module-lexer: 3.0.4
- '@astrojs/prism@4.0.2':
+ '@astrojs/prism@4.1.1':
dependencies:
prismjs: 1.30.0
- '@astrojs/sitemap@3.7.3':
+ '@astrojs/sitemap@3.7.4':
dependencies:
sitemap: 9.0.1
- stream-replace-string: 2.0.0
- zod: 4.6.5
+ zod: 4.6.7
- '@astrojs/starlight@0.41.7(astro@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0))(typescript@5.9.3)':
+ '@astrojs/starlight@0.42.7(astro@7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))(typescript@6.0.3)':
dependencies:
- '@astrojs/markdown-satteri': 0.3.7
- '@astrojs/mdx': 7.0.7(@astrojs/markdown-satteri@0.3.7)(astro@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0))
- '@astrojs/sitemap': 3.7.3
+ '@astrojs/markdown-satteri': 0.4.5
+ '@astrojs/mdx': 8.1.1(@astrojs/markdown-satteri@0.4.5)(astro@7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ '@astrojs/sitemap': 3.7.4
'@pagefind/default-ui': 1.5.2
'@types/hast': 3.0.5
'@types/js-yaml': 4.0.9
'@types/mdast': 4.0.4
- astro: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0)
- astro-expressive-code: 0.44.1(astro@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0))
- bcp-47: 2.1.0
- hast-util-from-html: 2.0.3
+ astro: 7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ astro-expressive-code: 0.44.3(astro@7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ bcp-47: 2.1.2
+ hast-util-format: 1.1.0
hast-util-select: 6.0.4
+ hast-util-to-html: 9.0.5
hast-util-to-string: 3.0.1
hastscript: 9.0.1
- i18next: 26.3.6(typescript@5.9.3)
+ i18next: 26.5.11(typescript@6.0.3)
js-yaml: 4.3.2
klona: 2.0.6
- magic-string: 0.30.21
- mdast-util-directive: 3.1.0
- mdast-util-to-markdown: 2.1.2
+ magic-string: 1.4.3
+ mdast-util-directive: 3.1.1
+ mdast-util-to-markdown: 2.2.0
mdast-util-to-string: 4.0.0
pagefind: 1.5.2
- rehype: 13.0.2
- rehype-format: 5.0.1
remark-directive: 4.0.0
- satteri: 0.9.5
- ultrahtml: 1.6.0
+ satteri: 0.10.5
+ ultrahtml: 1.7.0
unified: 11.0.5
- unist-util-visit: 5.1.0
+ unist-util-visit: 5.2.0
vfile: 6.0.3
transitivePeerDependencies:
- supports-color
- typescript
- '@astrojs/telemetry@3.3.3':
+ '@astrojs/telemetry@3.4.1':
dependencies:
ci-info: 4.4.0
dset: 3.1.4
is-docker: 4.0.0
- package-manager-detector: 1.6.0
+ package-manager-detector: 1.9.0
'@astrojs/yaml2ts@0.2.4':
dependencies:
- yaml: 2.9.0
+ yaml: 2.9.1
- '@babel/helper-string-parser@7.29.7': {}
+ '@babel/helper-string-parser@7.29.11': {}
'@babel/helper-validator-identifier@7.29.7': {}
- '@babel/parser@7.29.7':
+ '@babel/parser@7.29.11':
dependencies:
- '@babel/types': 7.29.7
+ '@babel/types': 7.29.11
- '@babel/types@7.29.7':
+ '@babel/types@7.29.11':
dependencies:
- '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-string-parser': 7.29.11
'@babel/helper-validator-identifier': 7.29.7
- '@bruits/satteri-darwin-arm64@0.9.5':
- optional: true
-
- '@bruits/satteri-darwin-x64@0.10.4':
- optional: true
-
- '@bruits/satteri-darwin-x64@0.9.5':
- optional: true
-
- '@bruits/satteri-linux-arm64-gnu@0.10.4':
- optional: true
-
- '@bruits/satteri-linux-arm64-gnu@0.9.5':
+ '@bruits/satteri-darwin-arm64@0.10.5':
optional: true
- '@bruits/satteri-linux-arm64-musl@0.10.4':
+ '@bruits/satteri-darwin-x64@0.10.5':
optional: true
- '@bruits/satteri-linux-arm64-musl@0.9.5':
+ '@bruits/satteri-linux-arm64-gnu@0.10.5':
optional: true
- '@bruits/satteri-linux-x64-gnu@0.10.4':
+ '@bruits/satteri-linux-arm64-musl@0.10.5':
optional: true
- '@bruits/satteri-linux-x64-gnu@0.9.5':
+ '@bruits/satteri-linux-x64-gnu@0.10.5':
optional: true
- '@bruits/satteri-linux-x64-musl@0.9.5':
+ '@bruits/satteri-linux-x64-musl@0.10.5':
optional: true
- '@bruits/satteri-wasm32-wasi@0.10.4':
+ '@bruits/satteri-wasm32-wasi@0.10.5':
dependencies:
'@emnapi/core': 1.11.1
'@emnapi/runtime': 1.11.1
- '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
+ '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
optional: true
- '@bruits/satteri-wasm32-wasi@0.9.5':
- dependencies:
- '@emnapi/core': 1.11.1
- '@emnapi/runtime': 1.11.1
- '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
- optional: true
-
- '@bruits/satteri-win32-arm64-msvc@0.10.4':
- optional: true
-
- '@bruits/satteri-win32-arm64-msvc@0.9.5':
+ '@bruits/satteri-win32-arm64-msvc@0.10.5':
optional: true
- '@bruits/satteri-win32-x64-msvc@0.10.4':
+ '@bruits/satteri-win32-x64-msvc@0.10.5':
optional: true
- '@bruits/satteri-win32-x64-msvc@0.9.5':
- optional: true
-
- '@capsizecss/unpack@4.0.0':
+ '@capsizecss/unpack@4.0.1':
dependencies:
fontkitten: 1.0.3
- '@clack/core@1.4.3':
+ '@clack/core@1.5.1':
dependencies:
fast-wrap-ansi: 0.2.2
sisteransi: 1.0.5
- '@clack/prompts@1.7.0':
+ '@clack/prompts@1.8.1':
dependencies:
- '@clack/core': 1.4.3
+ '@clack/core': 1.5.1
fast-string-width: 3.0.2
fast-wrap-ansi: 0.2.2
sisteransi: 1.0.5
- '@codemirror/autocomplete@6.20.3':
+ '@codemirror/autocomplete@6.20.4':
dependencies:
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
- '@lezer/common': 1.5.2
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
+ '@lezer/common': 1.5.4
- '@codemirror/commands@6.10.4':
+ '@codemirror/commands@6.11.1':
dependencies:
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
- '@lezer/common': 1.5.2
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
+ '@lezer/common': 1.5.4
'@codemirror/lang-css@6.3.1':
dependencies:
- '@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.1
- '@lezer/common': 1.5.2
- '@lezer/css': 1.3.4
+ '@codemirror/autocomplete': 6.20.4
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@lezer/common': 1.5.4
+ '@lezer/css': 1.3.9
- '@codemirror/lang-html@6.4.11':
+ '@codemirror/lang-html@6.4.12':
dependencies:
- '@codemirror/autocomplete': 6.20.3
+ '@codemirror/autocomplete': 6.20.4
'@codemirror/lang-css': 6.3.1
'@codemirror/lang-javascript': 6.2.5
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
- '@lezer/common': 1.5.2
- '@lezer/css': 1.3.4
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
+ '@lezer/common': 1.5.4
+ '@lezer/css': 1.3.9
'@lezer/html': 1.3.13
'@codemirror/lang-javascript@6.2.5':
dependencies:
- '@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
+ '@codemirror/autocomplete': 6.20.4
+ '@codemirror/language': 6.13.1
'@codemirror/lint': 6.9.7
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
- '@lezer/common': 1.5.2
- '@lezer/javascript': 1.5.4
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
+ '@lezer/common': 1.5.4
+ '@lezer/javascript': 1.5.6
'@codemirror/lang-json@6.0.2':
dependencies:
- '@codemirror/language': 6.12.4
+ '@codemirror/language': 6.13.1
'@lezer/json': 1.0.3
'@codemirror/lang-xml@6.1.0':
dependencies:
- '@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
- '@lezer/common': 1.5.2
+ '@codemirror/autocomplete': 6.20.4
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
+ '@lezer/common': 1.5.4
'@lezer/xml': 1.0.6
'@codemirror/lang-yaml@6.1.3':
dependencies:
- '@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.1
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@codemirror/autocomplete': 6.20.4
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/yaml': 1.0.4
- '@codemirror/language@6.12.4':
+ '@codemirror/language@6.13.1':
dependencies:
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
- style-mod: 4.1.3
+ '@codemirror/state': 6.7.6
+ '@codemirror/streamparser': 6.0.0
+ '@codemirror/view': 6.43.15
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
+ style-mod: 4.1.4
'@codemirror/lint@6.9.7':
dependencies:
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
crelt: 1.0.7
- '@codemirror/state@6.7.1':
+ '@codemirror/state@6.7.6':
dependencies:
- '@marijn/find-cluster-break': 1.0.3
+ '@marijn/find-cluster-break': 1.0.4
- '@codemirror/view@6.43.6':
+ '@codemirror/streamparser@6.0.0': {}
+
+ '@codemirror/view@6.43.15':
dependencies:
- '@codemirror/state': 6.7.1
+ '@codemirror/state': 6.7.6
crelt: 1.0.7
- style-mod: 4.1.3
+ style-mod: 4.1.4
w3c-keyname: 2.2.8
- '@ctrl/tinycolor@4.2.0': {}
+ '@ctrl/tinycolor@4.2.1': {}
'@emmetio/abbreviation@2.3.3':
dependencies:
@@ -3682,7 +3480,6 @@ snapshots:
dependencies:
'@emnapi/wasi-threads': 1.2.3
tslib: 2.8.1
- optional: true
'@emnapi/runtime@1.11.1':
dependencies:
@@ -3692,7 +3489,6 @@ snapshots:
'@emnapi/runtime@1.11.3':
dependencies:
tslib: 2.8.1
- optional: true
'@emnapi/wasi-threads@1.2.2':
dependencies:
@@ -3702,7 +3498,6 @@ snapshots:
'@emnapi/wasi-threads@1.2.3':
dependencies:
tslib: 2.8.1
- optional: true
'@esbuild/aix-ppc64@0.28.2':
optional: true
@@ -3782,30 +3577,30 @@ snapshots:
'@esbuild/win32-x64@0.28.2':
optional: true
- '@expressive-code/core@0.44.1':
+ '@expressive-code/core@0.44.3':
dependencies:
- '@ctrl/tinycolor': 4.2.0
+ '@ctrl/tinycolor': 4.2.1
hast-util-select: 6.0.4
hast-util-to-html: 9.0.5
- hast-util-to-text: 4.0.2
+ hast-util-to-text: 4.0.3
hastscript: 9.0.1
- postcss: 8.5.28
- postcss-nested: 6.2.0(postcss@8.5.28)
- unist-util-visit: 5.1.0
- unist-util-visit-parents: 6.0.2
+ postcss: 8.5.31
+ postcss-nested: 7.0.2(postcss@8.5.31)
+ unist-util-visit: 5.2.0
+ unist-util-visit-parents: 6.1.0
- '@expressive-code/plugin-frames@0.44.1':
+ '@expressive-code/plugin-frames@0.44.3':
dependencies:
- '@expressive-code/core': 0.44.1
+ '@expressive-code/core': 0.44.3
- '@expressive-code/plugin-shiki@0.44.1':
+ '@expressive-code/plugin-shiki@0.44.3':
dependencies:
- '@expressive-code/core': 0.44.1
- shiki: 4.4.3
+ '@expressive-code/core': 0.44.3
+ shiki: 4.5.0
- '@expressive-code/plugin-text-markers@0.44.1':
+ '@expressive-code/plugin-text-markers@0.44.3':
dependencies:
- '@expressive-code/core': 0.44.1
+ '@expressive-code/core': 0.44.3
'@floating-ui/core@1.8.0':
dependencies:
@@ -3816,27 +3611,22 @@ snapshots:
'@floating-ui/core': 1.8.0
'@floating-ui/utils': 0.2.12
- '@floating-ui/utils@0.2.10': {}
-
'@floating-ui/utils@0.2.12': {}
- '@floating-ui/vue@1.1.11(vue@3.5.39(typescript@5.9.3))':
+ '@floating-ui/vue@1.1.11(vue@3.5.44(typescript@6.0.3))':
dependencies:
'@floating-ui/dom': 1.8.0
'@floating-ui/utils': 0.2.12
- vue-demi: 0.14.10(vue@3.5.39(typescript@5.9.3))
+ vue-demi: 0.14.10(vue@3.5.44(typescript@6.0.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@floating-ui/vue@1.1.9(vue@3.5.39(typescript@5.9.3))':
+ '@floating-ui/vue@2.0.1(vue@3.5.44(typescript@6.0.3))':
dependencies:
'@floating-ui/dom': 1.8.0
- '@floating-ui/utils': 0.2.10
- vue-demi: 0.14.10(vue@3.5.39(typescript@5.9.3))
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
+ '@floating-ui/utils': 0.2.12
+ vue: 3.5.44(typescript@6.0.3)
'@fontsource/inter@5.3.0': {}
@@ -3844,122 +3634,122 @@ snapshots:
dependencies:
tailwindcss: 4.3.3
- '@headlessui/vue@1.7.23(vue@3.5.39(typescript@5.9.3))':
+ '@headlessui/vue@1.7.23(vue@3.5.44(typescript@6.0.3))':
dependencies:
- '@tanstack/vue-virtual': 3.13.31(vue@3.5.39(typescript@5.9.3))
- vue: 3.5.39(typescript@5.9.3)
+ '@tanstack/vue-virtual': 3.13.48(vue@3.5.44(typescript@6.0.3))
+ vue: 3.5.44(typescript@6.0.3)
'@img/colour@1.1.0': {}
- '@img/sharp-darwin-arm64@0.35.4':
+ '@img/sharp-darwin-arm64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.3.3
+ '@img/sharp-libvips-darwin-arm64': 1.3.4
optional: true
- '@img/sharp-darwin-x64@0.35.4':
+ '@img/sharp-darwin-x64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.3.3
+ '@img/sharp-libvips-darwin-x64': 1.3.4
optional: true
- '@img/sharp-freebsd-wasm32@0.35.4':
+ '@img/sharp-freebsd-wasm32@0.35.5':
dependencies:
- '@img/sharp-wasm32': 0.35.4
+ '@img/sharp-wasm32': 0.35.5
optional: true
- '@img/sharp-libvips-darwin-arm64@1.3.3':
+ '@img/sharp-libvips-darwin-arm64@1.3.4':
optional: true
- '@img/sharp-libvips-darwin-x64@1.3.3':
+ '@img/sharp-libvips-darwin-x64@1.3.4':
optional: true
- '@img/sharp-libvips-linux-arm64@1.3.3':
+ '@img/sharp-libvips-linux-arm64@1.3.4':
optional: true
- '@img/sharp-libvips-linux-arm@1.3.3':
+ '@img/sharp-libvips-linux-arm@1.3.4':
optional: true
- '@img/sharp-libvips-linux-ppc64@1.3.3':
+ '@img/sharp-libvips-linux-ppc64@1.3.4':
optional: true
- '@img/sharp-libvips-linux-riscv64@1.3.3':
+ '@img/sharp-libvips-linux-riscv64@1.3.4':
optional: true
- '@img/sharp-libvips-linux-s390x@1.3.3':
+ '@img/sharp-libvips-linux-s390x@1.3.4':
optional: true
- '@img/sharp-libvips-linux-x64@1.3.3':
+ '@img/sharp-libvips-linux-x64@1.3.4':
optional: true
- '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.4':
optional: true
- '@img/sharp-libvips-linuxmusl-x64@1.3.3':
+ '@img/sharp-libvips-linuxmusl-x64@1.3.4':
optional: true
- '@img/sharp-linux-arm64@0.35.4':
+ '@img/sharp-linux-arm64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.3.3
+ '@img/sharp-libvips-linux-arm64': 1.3.4
optional: true
- '@img/sharp-linux-arm@0.35.4':
+ '@img/sharp-linux-arm@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.3.3
+ '@img/sharp-libvips-linux-arm': 1.3.4
optional: true
- '@img/sharp-linux-ppc64@0.35.4':
+ '@img/sharp-linux-ppc64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linux-ppc64': 1.3.3
+ '@img/sharp-libvips-linux-ppc64': 1.3.4
optional: true
- '@img/sharp-linux-riscv64@0.35.4':
+ '@img/sharp-linux-riscv64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linux-riscv64': 1.3.3
+ '@img/sharp-libvips-linux-riscv64': 1.3.4
optional: true
- '@img/sharp-linux-s390x@0.35.4':
+ '@img/sharp-linux-s390x@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.3.3
+ '@img/sharp-libvips-linux-s390x': 1.3.4
optional: true
- '@img/sharp-linux-x64@0.35.4':
+ '@img/sharp-linux-x64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.3.3
+ '@img/sharp-libvips-linux-x64': 1.3.4
optional: true
- '@img/sharp-linuxmusl-arm64@0.35.4':
+ '@img/sharp-linuxmusl-arm64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.4
optional: true
- '@img/sharp-linuxmusl-x64@0.35.4':
+ '@img/sharp-linuxmusl-x64@0.35.5':
optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.4
optional: true
- '@img/sharp-wasm32@0.35.4':
+ '@img/sharp-wasm32@0.35.5':
dependencies:
'@emnapi/runtime': 1.11.3
optional: true
- '@img/sharp-webcontainers-wasm32@0.35.4':
+ '@img/sharp-webcontainers-wasm32@0.35.5':
dependencies:
- '@img/sharp-wasm32': 0.35.4
+ '@img/sharp-wasm32': 0.35.5
optional: true
- '@img/sharp-win32-arm64@0.35.4':
+ '@img/sharp-win32-arm64@0.35.5':
optional: true
- '@img/sharp-win32-ia32@0.35.4':
+ '@img/sharp-win32-ia32@0.35.5':
optional: true
- '@img/sharp-win32-x64@0.35.4':
+ '@img/sharp-win32-x64@0.35.5':
optional: true
- '@internationalized/date@3.12.2':
+ '@internationalized/date@3.12.4':
dependencies:
'@swc/helpers': 0.5.23
- '@internationalized/number@3.6.7':
+ '@internationalized/number@3.6.9':
dependencies:
'@swc/helpers': 0.5.23
@@ -3975,8 +3765,6 @@ snapshots:
'@jridgewell/resolve-uri@3.1.2': {}
- '@jridgewell/sourcemap-codec@1.5.5': {}
-
'@jridgewell/sourcemap-codec@1.6.0': {}
'@jridgewell/trace-mapping@0.3.31':
@@ -3984,103 +3772,77 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.6.0
- '@lezer/common@1.5.2': {}
+ '@lezer/common@1.5.4': {}
- '@lezer/css@1.3.4':
+ '@lezer/css@1.3.9':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/highlight@1.2.3':
+ '@lezer/highlight@1.2.5':
dependencies:
- '@lezer/common': 1.5.2
+ '@lezer/common': 1.5.4
'@lezer/html@1.3.13':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/javascript@1.5.4':
+ '@lezer/javascript@1.5.6':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/json@1.0.3':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/lr@1.4.10':
+ '@lezer/lr@1.4.11':
dependencies:
- '@lezer/common': 1.5.2
+ '@lezer/common': 1.5.4
'@lezer/xml@1.0.6':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/yaml@1.0.4':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.4
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@marijn/find-cluster-break@1.0.3': {}
+ '@marijn/find-cluster-break@1.0.4': {}
- '@mdx-js/mdx@3.1.1':
+ '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
dependencies:
- '@types/estree': 1.0.9
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.5
- '@types/mdx': 2.0.13
- acorn: 8.16.0
- collapse-white-space: 2.1.0
- devlop: 1.1.0
- estree-util-is-identifier-name: 3.0.0
- estree-util-scope: 1.0.0
- estree-walker: 3.0.3
- hast-util-to-jsx-runtime: 2.3.6
- markdown-extensions: 2.0.0
- recma-build-jsx: 1.0.0
- recma-jsx: 1.0.1(acorn@8.16.0)
- recma-stringify: 1.0.0
- rehype-recma: 1.0.0
- remark-mdx: 3.1.1
- remark-parse: 11.0.0
- remark-rehype: 11.1.2
- source-map: 0.7.6
- unified: 11.0.5
- unist-util-position-from-estree: 2.0.0
- unist-util-stringify-position: 4.0.0
- unist-util-visit: 5.1.0
- vfile: 6.0.3
- transitivePeerDependencies:
- - supports-color
+ '@emnapi/core': 1.11.3
+ '@emnapi/runtime': 1.11.3
+ '@tybys/wasm-util': 0.10.4
- '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
+ '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
dependencies:
'@emnapi/core': 1.11.1
'@emnapi/runtime': 1.11.1
- '@tybys/wasm-util': 0.10.3
+ '@tybys/wasm-util': 0.10.4
optional: true
- '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
+ '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
dependencies:
'@emnapi/core': 1.11.3
'@emnapi/runtime': 1.11.3
- '@tybys/wasm-util': 0.10.3
+ '@tybys/wasm-util': 0.10.4
optional: true
- '@opentelemetry/api@1.9.0': {}
-
'@oslojs/encoding@1.1.0': {}
- '@oxc-project/types@0.146.0': {}
+ '@oxc-project/types@0.155.0': {}
'@pagefind/darwin-arm64@1.5.2':
optional: true
@@ -4107,82 +3869,85 @@ snapshots:
'@phosphor-icons/core@2.1.1': {}
- '@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.6)':
+ '@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.13.1)(@codemirror/state@6.7.6)(@codemirror/view@6.43.15)':
dependencies:
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
- '@rolldown/binding-android-arm-eabi@1.2.5':
+ '@rolldown/binding-android-arm-eabi@1.2.15':
optional: true
- '@rolldown/binding-android-arm64@1.2.5':
+ '@rolldown/binding-android-arm64@1.2.15':
optional: true
- '@rolldown/binding-darwin-arm64@1.2.5':
+ '@rolldown/binding-darwin-arm64@1.2.15':
optional: true
- '@rolldown/binding-darwin-x64@1.2.5':
+ '@rolldown/binding-darwin-x64@1.2.15':
optional: true
- '@rolldown/binding-freebsd-x64@1.2.5':
+ '@rolldown/binding-freebsd-x64@1.2.15':
optional: true
- '@rolldown/binding-linux-arm-gnueabihf@1.2.5':
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.15':
optional: true
- '@rolldown/binding-linux-arm64-gnu@1.2.5':
+ '@rolldown/binding-linux-arm64-gnu@1.2.15':
optional: true
- '@rolldown/binding-linux-arm64-musl@1.2.5':
+ '@rolldown/binding-linux-arm64-musl@1.2.15':
optional: true
- '@rolldown/binding-linux-ppc64-gnu@1.2.5':
+ '@rolldown/binding-linux-ppc64-gnu@1.2.15':
optional: true
- '@rolldown/binding-linux-s390x-gnu@1.2.5':
+ '@rolldown/binding-linux-s390x-gnu@1.2.15':
optional: true
- '@rolldown/binding-linux-x64-gnu@1.2.5':
+ '@rolldown/binding-linux-x64-gnu@1.2.15':
optional: true
- '@rolldown/binding-linux-x64-musl@1.2.5':
+ '@rolldown/binding-linux-x64-musl@1.2.15':
optional: true
- '@rolldown/binding-openharmony-arm64@1.2.5':
+ '@rolldown/binding-openharmony-arm64@1.2.15':
optional: true
- '@rolldown/binding-win32-arm64-msvc@1.2.5':
+ '@rolldown/binding-win32-arm64-msvc@1.2.15':
optional: true
- '@rolldown/binding-win32-x64-msvc@1.2.5':
+ '@rolldown/binding-win32-x64-msvc@1.2.15':
optional: true
'@rolldown/pluginutils@1.0.1': {}
- '@scalar/agent-chat@0.12.18(tailwindcss@4.3.3)(typescript@5.9.3)(zod@4.6.5)':
- dependencies:
- '@ai-sdk/vue': 3.0.33(vue@3.5.39(typescript@5.9.3))(zod@4.6.5)
- '@scalar/api-client': 3.13.3(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/components': 0.27.6(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/helpers': 0.9.0
- '@scalar/icons': 0.7.3(typescript@5.9.3)
- '@scalar/json-magic': 0.12.17
- '@scalar/openapi-types': 0.9.1
- '@scalar/schemas': 0.7.2
- '@scalar/themes': 0.16.2
- '@scalar/types': 0.16.2
- '@scalar/use-toasts': 0.10.2(typescript@5.9.3)
- '@scalar/validation': 0.6.0
- '@scalar/workspace-store': 0.55.3(typescript@5.9.3)
- '@vueuse/core': 13.9.0(vue@3.5.39(typescript@5.9.3))
- ai: 6.0.33(zod@4.6.5)
- js-base64: 3.8.1
+ '@scalar/agent-chat@0.12.46(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.6.7)':
+ dependencies:
+ '@ai-sdk/vue': 4.0.142(vue@3.5.44(typescript@6.0.3))(zod@4.6.7)
+ '@scalar/api-client': 3.23.3(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/components': 0.33.0(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/helpers': 0.16.4
+ '@scalar/icons': 0.7.8(typescript@6.0.3)
+ '@scalar/json-magic': 0.17.0
+ '@scalar/openapi-types': 0.9.8
+ '@scalar/schemas': 0.15.0
+ '@scalar/themes': 0.19.3
+ '@scalar/types': 0.25.0
+ '@scalar/use-toasts': 0.10.6(typescript@6.0.3)
+ '@scalar/validation': 0.6.7
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
+ '@vueuse/core': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ ai: 7.0.142(zod@4.6.7)
+ js-base64: 3.9.4
neverpanic: 0.0.8
truncate-json: 3.0.1
- vue: 3.5.39(typescript@5.9.3)
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
+ - '@nuxt/kit'
+ - '@nuxt/schema'
- '@vue/composition-api'
+ - '@vue/test-utils'
- async-validator
- axios
- change-case
@@ -4190,6 +3955,7 @@ snapshots:
- idb-keyval
- jwt-decode
- nprogress
+ - nuxt
- qrcode
- sortablejs
- supports-color
@@ -4198,39 +3964,42 @@ snapshots:
- universal-cookie
- zod
- '@scalar/api-client@3.13.3(tailwindcss@4.3.3)(typescript@5.9.3)':
+ '@scalar/api-client@3.23.3(tailwindcss@4.3.3)(typescript@6.0.3)':
dependencies:
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.3)
- '@headlessui/vue': 1.7.23(vue@3.5.39(typescript@5.9.3))
- '@scalar/blocks': 0.1.4(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/components': 0.27.6(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/helpers': 0.9.0
- '@scalar/icons': 0.7.3(typescript@5.9.3)
- '@scalar/oas-utils': 0.19.4(typescript@5.9.3)
- '@scalar/openapi-types': 0.9.1
- '@scalar/sidebar': 0.9.29(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/snippetz': 0.9.21
- '@scalar/themes': 0.16.2
+ '@headlessui/vue': 1.7.23(vue@3.5.44(typescript@6.0.3))
+ '@scalar/blocks': 0.6.0(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/components': 0.33.0(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/helpers': 0.16.4
+ '@scalar/icons': 0.7.8(typescript@6.0.3)
+ '@scalar/localization': 0.2.9(typescript@6.0.3)
+ '@scalar/oas-utils': 0.20.15(typescript@6.0.3)
+ '@scalar/openapi-types': 0.9.8
+ '@scalar/sidebar': 0.12.3(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/snippetz': 0.10.11
+ '@scalar/themes': 0.19.3
'@scalar/typebox': 0.1.3
- '@scalar/types': 0.16.2
- '@scalar/use-codemirror': 0.14.12(typescript@5.9.3)
- '@scalar/use-hooks': 0.4.7(typescript@5.9.3)
- '@scalar/use-toasts': 0.10.2(typescript@5.9.3)
- '@scalar/workspace-store': 0.55.3(typescript@5.9.3)
- '@vueuse/core': 13.9.0(vue@3.5.39(typescript@5.9.3))
- '@vueuse/integrations': 13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(vue@3.5.39(typescript@5.9.3))
- focus-trap: 7.8.0
- fuse.js: 7.4.2
- js-base64: 3.8.1
+ '@scalar/types': 0.25.0
+ '@scalar/use-codemirror': 0.14.16(typescript@6.0.3)
+ '@scalar/use-hooks': 0.4.22(typescript@6.0.3)
+ '@scalar/use-toasts': 0.10.6(typescript@6.0.3)
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
+ '@vueuse/core': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ '@vueuse/integrations': 15.0.0(focus-trap@8.2.3)(fuse.js@7.5.0)(vue@3.5.44(typescript@6.0.3))
+ focus-trap: 8.2.3
+ fuse.js: 7.5.0
+ js-base64: 3.9.4
jsonc-parser: 3.3.1
nanoid: 5.1.16
- pretty-ms: 9.3.0
- radix-vue: 1.9.17(vue@3.5.39(typescript@5.9.3))
- set-cookie-parser: 3.1.0
- vue: 3.5.39(typescript@5.9.3)
- yaml: 2.9.0
- zod: 4.4.3
+ pretty-ms: 10.0.0
+ radix-vue: 1.9.17(vue@3.5.44(typescript@6.0.3))
+ set-cookie-parser: 3.1.3
+ vue: 3.5.44(typescript@6.0.3)
+ yaml: 2.9.1
+ zod: 4.6.7
transitivePeerDependencies:
+ - '@nuxt/kit'
+ - '@nuxt/schema'
- '@vue/composition-api'
- async-validator
- axios
@@ -4239,6 +4008,7 @@ snapshots:
- idb-keyval
- jwt-decode
- nprogress
+ - nuxt
- qrcode
- sortablejs
- supports-color
@@ -4246,76 +4016,119 @@ snapshots:
- typescript
- universal-cookie
- '@scalar/api-reference@1.62.5(tailwindcss@4.3.3)(typescript@5.9.3)(zod@4.6.5)':
- dependencies:
- '@headlessui/vue': 1.7.23(vue@3.5.39(typescript@5.9.3))
- '@scalar/agent-chat': 0.12.18(tailwindcss@4.3.3)(typescript@5.9.3)(zod@4.6.5)
- '@scalar/api-client': 3.13.3(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/blocks': 0.1.4(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/code-highlight': 0.4.1
- '@scalar/components': 0.27.6(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/helpers': 0.9.0
- '@scalar/icons': 0.7.3(typescript@5.9.3)
- '@scalar/oas-utils': 0.19.4(typescript@5.9.3)
- '@scalar/schemas': 0.7.2
- '@scalar/sidebar': 0.9.29(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/snippetz': 0.9.21
- '@scalar/themes': 0.16.2
- '@scalar/types': 0.16.2
- '@scalar/use-hooks': 0.4.7(typescript@5.9.3)
- '@scalar/use-toasts': 0.10.2(typescript@5.9.3)
- '@scalar/validation': 0.6.0
- '@scalar/workspace-store': 0.55.3(typescript@5.9.3)
- '@unhead/vue': 2.1.15(vue@3.5.39(typescript@5.9.3))
- '@vueuse/core': 13.9.0(vue@3.5.39(typescript@5.9.3))
- fuse.js: 7.4.2
+ '@scalar/api-reference@1.76.0(@oxc-project/types@0.155.0)(esbuild@0.28.2)(lightningcss@1.33.0)(rolldown@1.2.15)(tailwindcss@4.3.3)(typescript@6.0.3)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))(zod@4.6.7)':
+ dependencies:
+ '@headlessui/vue': 1.7.23(vue@3.5.44(typescript@6.0.3))
+ '@scalar/agent-chat': 0.12.46(tailwindcss@4.3.3)(typescript@6.0.3)(zod@4.6.7)
+ '@scalar/api-client': 3.23.3(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/asyncapi-to-markdown': 0.2.2(typescript@6.0.3)
+ '@scalar/blocks': 0.6.0(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/code-highlight': 0.4.11
+ '@scalar/components': 0.33.0(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/helpers': 0.16.4
+ '@scalar/icons': 0.7.8(typescript@6.0.3)
+ '@scalar/localization': 0.2.9(typescript@6.0.3)
+ '@scalar/oas-utils': 0.20.15(typescript@6.0.3)
+ '@scalar/openapi-to-markdown': 1.7.0(typescript@6.0.3)
+ '@scalar/schemas': 0.15.0
+ '@scalar/sidebar': 0.12.3(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/snippetz': 0.10.11
+ '@scalar/themes': 0.19.3
+ '@scalar/types': 0.25.0
+ '@scalar/use-hooks': 0.4.22(typescript@6.0.3)
+ '@scalar/use-toasts': 0.10.6(typescript@6.0.3)
+ '@scalar/validation': 0.6.7
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
+ '@unhead/vue': 3.4.3(@oxc-project/types@0.155.0)(esbuild@0.28.2)(lightningcss@1.33.0)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))(vue@3.5.44(typescript@6.0.3))
+ '@vueuse/core': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ fuse.js: 7.5.0
microdiff: 1.5.0
nanoid: 5.1.16
- vue: 3.5.39(typescript@5.9.3)
- yaml: 2.9.0
+ vue: 3.5.44(typescript@6.0.3)
+ yaml: 2.9.1
transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@nuxt/kit'
+ - '@nuxt/schema'
+ - '@oxc-project/types'
+ - '@rsbuild/core'
+ - '@rspack/core'
+ - '@unhead/cli'
+ - '@vitejs/devtools-kit'
- '@vue/composition-api'
+ - '@vue/test-utils'
- async-validator
- axios
+ - bun-types-no-globals
- change-case
- drauu
+ - esbuild
- idb-keyval
- jwt-decode
+ - lightningcss
- nprogress
+ - nuxt
+ - oxc-parser
- qrcode
+ - rolldown
+ - rollup
- sortablejs
- supports-color
- tailwindcss
- typescript
- universal-cookie
+ - unloader
+ - vite
+ - webpack
- zod
- '@scalar/asyncapi-upgrader@0.1.2':
+ '@scalar/asyncapi-to-markdown@0.2.2(typescript@6.0.3)':
+ dependencies:
+ '@scalar/asyncapi-upgrader': 0.1.18
+ '@scalar/helpers': 0.16.4
+ '@scalar/json-magic': 0.17.0
+ '@scalar/openapi-to-markdown': 1.7.0(typescript@6.0.3)
+ '@scalar/types': 0.25.0
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
+ remark-gfm: 4.0.1
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@scalar/asyncapi-upgrader@0.1.18':
dependencies:
- '@scalar/helpers': 0.9.0
+ '@scalar/helpers': 0.16.4
- '@scalar/blocks@0.1.4(tailwindcss@4.3.3)(typescript@5.9.3)':
+ '@scalar/blocks@0.6.0(tailwindcss@4.3.3)(typescript@6.0.3)':
dependencies:
- '@scalar/components': 0.27.6(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/helpers': 0.9.0
- '@scalar/icons': 0.7.3(typescript@5.9.3)
- '@scalar/snippetz': 0.9.21
- '@scalar/themes': 0.16.2
- '@scalar/types': 0.16.2
- '@scalar/workspace-store': 0.55.3(typescript@5.9.3)
+ '@scalar/components': 0.33.0(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/helpers': 0.16.4
+ '@scalar/icons': 0.7.8(typescript@6.0.3)
+ '@scalar/localization': 0.2.9(typescript@6.0.3)
+ '@scalar/snippetz': 0.10.11
+ '@scalar/themes': 0.19.3
+ '@scalar/types': 0.25.0
+ '@scalar/use-hooks': 0.4.22(typescript@6.0.3)
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
'@types/har-format': 1.2.16
- js-base64: 3.8.1
- vue: 3.5.39(typescript@5.9.3)
+ '@vueuse/core': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ js-base64: 3.9.4
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
+ - '@nuxt/kit'
+ - '@nuxt/schema'
- '@vue/composition-api'
+ - nuxt
- supports-color
- tailwindcss
- typescript
- '@scalar/code-highlight@0.4.1':
+ '@scalar/code-highlight@0.4.11':
dependencies:
- hast-util-to-text: 4.0.2
- highlight.js: 11.11.1
+ hast-util-to-text: 4.0.3
+ highlight.js: 11.12.0
lowlight: 3.3.0
rehype-external-links: 3.0.0
rehype-format: 5.0.1
@@ -4328,204 +4141,248 @@ snapshots:
remark-rehype: 11.1.2
remark-stringify: 11.0.0
unified: 11.0.5
- unist-util-visit: 5.1.0
+ unist-util-visit: 5.2.0
transitivePeerDependencies:
- supports-color
- '@scalar/components@0.27.6(tailwindcss@4.3.3)(typescript@5.9.3)':
+ '@scalar/components@0.33.0(tailwindcss@4.3.3)(typescript@6.0.3)':
dependencies:
- '@floating-ui/utils': 0.2.10
- '@floating-ui/vue': 1.1.9(vue@3.5.39(typescript@5.9.3))
+ '@floating-ui/utils': 0.2.12
+ '@floating-ui/vue': 2.0.1(vue@3.5.44(typescript@6.0.3))
'@headlessui/tailwindcss': 0.2.2(tailwindcss@4.3.3)
- '@headlessui/vue': 1.7.23(vue@3.5.39(typescript@5.9.3))
- '@scalar/code-highlight': 0.4.1
- '@scalar/helpers': 0.9.0
- '@scalar/icons': 0.7.3(typescript@5.9.3)
- '@scalar/themes': 0.16.2
- '@scalar/use-hooks': 0.4.7(typescript@5.9.3)
- '@vueuse/core': 13.9.0(vue@3.5.39(typescript@5.9.3))
- cva: 1.0.0-beta.4(typescript@5.9.3)
- radix-vue: 1.9.17(vue@3.5.39(typescript@5.9.3))
- vue: 3.5.39(typescript@5.9.3)
- vue-component-type-helpers: 3.3.7
+ '@headlessui/vue': 1.7.23(vue@3.5.44(typescript@6.0.3))
+ '@scalar/code-highlight': 0.4.11
+ '@scalar/helpers': 0.16.4
+ '@scalar/highlight': 0.6.0
+ '@scalar/icons': 0.7.8(typescript@6.0.3)
+ '@scalar/themes': 0.19.3
+ '@scalar/use-hooks': 0.4.22(typescript@6.0.3)
+ '@vueuse/core': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ cva: 1.0.0-beta.4(typescript@6.0.3)
+ radix-vue: 1.9.17(vue@3.5.44(typescript@6.0.3))
+ vue: 3.5.44(typescript@6.0.3)
+ vue-component-type-helpers: 3.3.13
transitivePeerDependencies:
+ - '@nuxt/kit'
+ - '@nuxt/schema'
- '@vue/composition-api'
+ - nuxt
- supports-color
- tailwindcss
- typescript
- '@scalar/helpers@0.9.0': {}
+ '@scalar/helpers@0.16.4': {}
+
+ '@scalar/highlight@0.6.0':
+ dependencies:
+ '@types/hast': 3.0.5
- '@scalar/icons@0.7.3(typescript@5.9.3)':
+ '@scalar/icons@0.7.8(typescript@6.0.3)':
dependencies:
'@phosphor-icons/core': 2.1.1
- '@types/node': 24.12.4
- chalk: 5.6.2
- vue: 3.5.39(typescript@5.9.3)
+ '@types/node': 24.19.2
+ chalk: 6.0.1
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
- typescript
- '@scalar/json-magic@0.12.17':
+ '@scalar/json-magic@0.17.0':
dependencies:
- '@scalar/helpers': 0.9.0
+ '@scalar/helpers': 0.16.4
pathe: 2.0.3
- yaml: 2.9.0
+ undici: 8.12.3
+ yaml: 2.9.1
- '@scalar/oas-utils@0.19.4(typescript@5.9.3)':
+ '@scalar/localization@0.2.9(typescript@6.0.3)':
dependencies:
- '@scalar/helpers': 0.9.0
- '@scalar/themes': 0.16.2
- '@scalar/types': 0.16.2
- '@scalar/workspace-store': 0.55.3(typescript@5.9.3)
- flatted: 3.4.2
- vue: 3.5.39(typescript@5.9.3)
- yaml: 2.9.0
+ '@scalar/helpers': 0.16.4
+ type-fest: 5.10.0
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
- typescript
- '@scalar/openapi-types@0.9.1': {}
+ '@scalar/oas-utils@0.20.15(typescript@6.0.3)':
+ dependencies:
+ '@scalar/helpers': 0.16.4
+ '@scalar/themes': 0.19.3
+ '@scalar/types': 0.25.0
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
+ flatted: 3.4.4
+ vue: 3.5.44(typescript@6.0.3)
+ yaml: 2.9.1
+ transitivePeerDependencies:
+ - typescript
- '@scalar/openapi-upgrader@0.2.9':
+ '@scalar/openapi-to-markdown@1.7.0(typescript@6.0.3)':
dependencies:
- '@scalar/openapi-types': 0.9.1
+ '@scalar/code-highlight': 0.4.11
+ '@scalar/helpers': 0.16.4
+ '@scalar/json-magic': 0.17.0
+ '@scalar/openapi-upgrader': 0.4.6
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
+ rehype-parse: 9.0.1
+ rehype-remark: 10.0.1
+ rehype-sanitize: 6.0.0
+ remark-gfm: 4.0.1
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
- '@scalar/schemas@0.7.2':
+ '@scalar/openapi-types@0.9.8': {}
+
+ '@scalar/openapi-upgrader@0.4.6':
dependencies:
- '@scalar/helpers': 0.9.0
- '@scalar/validation': 0.6.0
+ '@scalar/helpers': 0.16.4
+ '@scalar/openapi-types': 0.9.8
- '@scalar/sidebar@0.9.29(tailwindcss@4.3.3)(typescript@5.9.3)':
+ '@scalar/schemas@0.15.0':
dependencies:
- '@scalar/components': 0.27.6(tailwindcss@4.3.3)(typescript@5.9.3)
- '@scalar/helpers': 0.9.0
- '@scalar/icons': 0.7.3(typescript@5.9.3)
- '@scalar/themes': 0.16.2
- '@scalar/use-hooks': 0.4.7(typescript@5.9.3)
- '@scalar/workspace-store': 0.55.3(typescript@5.9.3)
- vue: 3.5.39(typescript@5.9.3)
+ '@scalar/helpers': 0.16.4
+ '@scalar/validation': 0.6.7
+
+ '@scalar/sidebar@0.12.3(tailwindcss@4.3.3)(typescript@6.0.3)':
+ dependencies:
+ '@scalar/components': 0.33.0(tailwindcss@4.3.3)(typescript@6.0.3)
+ '@scalar/helpers': 0.16.4
+ '@scalar/icons': 0.7.8(typescript@6.0.3)
+ '@scalar/themes': 0.19.3
+ '@scalar/use-hooks': 0.4.22(typescript@6.0.3)
+ '@scalar/workspace-store': 0.69.0(typescript@6.0.3)
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
+ - '@nuxt/kit'
+ - '@nuxt/schema'
- '@vue/composition-api'
+ - nuxt
- supports-color
- tailwindcss
- typescript
- '@scalar/snippetz@0.9.21':
+ '@scalar/snippetz@0.10.11':
dependencies:
- '@scalar/helpers': 0.9.0
- '@scalar/types': 0.16.2
- js-base64: 3.8.1
- stringify-object: 6.0.0
+ '@scalar/helpers': 0.16.4
+ '@scalar/types': 0.25.0
+ js-base64: 3.9.4
- '@scalar/themes@0.16.2':
+ '@scalar/themes@0.19.3':
dependencies:
nanoid: 5.1.16
'@scalar/typebox@0.1.3': {}
- '@scalar/types@0.16.2':
+ '@scalar/types@0.25.0':
dependencies:
- '@scalar/helpers': 0.9.0
+ '@scalar/helpers': 0.16.4
nanoid: 5.1.16
- type-fest: 5.8.0
- zod: 4.4.3
+ type-fest: 5.10.0
+ zod: 4.6.7
- '@scalar/use-codemirror@0.14.12(typescript@5.9.3)':
+ '@scalar/use-codemirror@0.14.16(typescript@6.0.3)':
dependencies:
- '@codemirror/autocomplete': 6.20.3
- '@codemirror/commands': 6.10.4
+ '@codemirror/autocomplete': 6.20.4
+ '@codemirror/commands': 6.11.1
'@codemirror/lang-css': 6.3.1
- '@codemirror/lang-html': 6.4.11
+ '@codemirror/lang-html': 6.4.12
'@codemirror/lang-json': 6.0.2
'@codemirror/lang-xml': 6.1.0
'@codemirror/lang-yaml': 6.1.3
- '@codemirror/language': 6.12.4
+ '@codemirror/language': 6.13.1
'@codemirror/lint': 6.9.7
- '@codemirror/state': 6.7.1
- '@codemirror/view': 6.43.6
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.6)
- vue: 3.5.39(typescript@5.9.3)
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.15
+ '@lezer/highlight': 1.2.5
+ '@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.13.1)(@codemirror/state@6.7.6)(@codemirror/view@6.43.15)
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
- typescript
- '@scalar/use-hooks@0.4.7(typescript@5.9.3)':
+ '@scalar/use-hooks@0.4.22(typescript@6.0.3)':
dependencies:
- '@scalar/use-toasts': 0.10.2(typescript@5.9.3)
- '@scalar/validation': 0.6.0
- '@vueuse/core': 13.9.0(vue@3.5.39(typescript@5.9.3))
- cva: 1.0.0-beta.4(typescript@5.9.3)
- tailwind-merge: 3.5.0
- vue: 3.5.39(typescript@5.9.3)
+ '@scalar/helpers': 0.16.4
+ '@scalar/use-toasts': 0.10.6(typescript@6.0.3)
+ '@scalar/validation': 0.6.7
+ '@vueuse/core': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ cva: 1.0.0-beta.4(typescript@6.0.3)
+ tailwind-merge: 3.7.0
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
+ - '@nuxt/kit'
+ - '@nuxt/schema'
+ - nuxt
- typescript
- '@scalar/use-toasts@0.10.2(typescript@5.9.3)':
+ '@scalar/use-toasts@0.10.6(typescript@6.0.3)':
dependencies:
- vue: 3.5.39(typescript@5.9.3)
- vue-sonner: 1.3.2
+ vue: 3.5.44(typescript@6.0.3)
+ vue-sonner: 2.0.9
transitivePeerDependencies:
+ - '@nuxt/kit'
+ - '@nuxt/schema'
+ - nuxt
- typescript
- '@scalar/validation@0.6.0': {}
+ '@scalar/validation@0.6.7': {}
- '@scalar/workspace-store@0.55.3(typescript@5.9.3)':
+ '@scalar/workspace-store@0.69.0(typescript@6.0.3)':
dependencies:
- '@scalar/asyncapi-upgrader': 0.1.2
- '@scalar/helpers': 0.9.0
- '@scalar/json-magic': 0.12.17
- '@scalar/openapi-upgrader': 0.2.9
- '@scalar/schemas': 0.7.2
- '@scalar/snippetz': 0.9.21
+ '@scalar/asyncapi-upgrader': 0.1.18
+ '@scalar/helpers': 0.16.4
+ '@scalar/json-magic': 0.17.0
+ '@scalar/openapi-upgrader': 0.4.6
+ '@scalar/schemas': 0.15.0
+ '@scalar/snippetz': 0.10.11
'@scalar/typebox': 0.1.3
- '@scalar/types': 0.16.2
- '@scalar/validation': 0.6.0
- js-base64: 3.8.1
- type-fest: 5.8.0
- vue: 3.5.39(typescript@5.9.3)
- yaml: 2.9.0
+ '@scalar/types': 0.25.0
+ '@scalar/validation': 0.6.7
+ js-base64: 3.9.4
+ type-fest: 5.10.0
+ vue: 3.5.44(typescript@6.0.3)
+ yaml: 2.9.1
transitivePeerDependencies:
- typescript
- '@shikijs/core@4.4.3':
+ '@shikijs/core@4.5.0':
dependencies:
- '@shikijs/primitive': 4.4.3
- '@shikijs/types': 4.4.3
- '@shikijs/vscode-textmate': 10.0.2
+ '@shikijs/primitive': 4.5.0
+ '@shikijs/types': 4.5.0
+ '@shikijs/vscode-textmate': 10.1.0
'@types/hast': 3.0.5
hast-util-to-html: 9.0.5
- '@shikijs/engine-javascript@4.4.3':
+ '@shikijs/engine-javascript@4.5.0':
dependencies:
- '@shikijs/types': 4.4.3
- '@shikijs/vscode-textmate': 10.0.2
+ '@shikijs/types': 4.5.0
+ '@shikijs/vscode-textmate': 10.1.0
oniguruma-to-es: 4.3.6
- '@shikijs/engine-oniguruma@4.4.3':
+ '@shikijs/engine-oniguruma@4.5.0':
dependencies:
- '@shikijs/types': 4.4.3
- '@shikijs/vscode-textmate': 10.0.2
+ '@shikijs/types': 4.5.0
+ '@shikijs/vscode-textmate': 10.1.0
- '@shikijs/langs@4.4.3':
+ '@shikijs/langs@4.5.0':
dependencies:
- '@shikijs/types': 4.4.3
+ '@shikijs/types': 4.5.0
- '@shikijs/primitive@4.4.3':
+ '@shikijs/primitive@4.5.0':
dependencies:
- '@shikijs/types': 4.4.3
- '@shikijs/vscode-textmate': 10.0.2
+ '@shikijs/types': 4.5.0
+ '@shikijs/vscode-textmate': 10.1.0
'@types/hast': 3.0.5
- '@shikijs/themes@4.4.3':
+ '@shikijs/themes@4.5.0':
dependencies:
- '@shikijs/types': 4.4.3
+ '@shikijs/types': 4.5.0
- '@shikijs/types@4.4.3':
+ '@shikijs/types@4.5.0':
dependencies:
- '@shikijs/vscode-textmate': 10.0.2
+ '@shikijs/vscode-textmate': 10.1.0
'@types/hast': 3.0.5
- '@shikijs/vscode-textmate@10.0.2': {}
+ '@shikijs/vscode-textmate@10.1.0': {}
'@standard-schema/spec@1.1.0': {}
@@ -4536,11 +4393,11 @@ snapshots:
'@tailwindcss/node@4.3.3':
dependencies:
'@jridgewell/remapping': 2.3.5
- enhanced-resolve: 5.25.1
+ enhanced-resolve: 5.26.0
jiti: 2.7.0
lightningcss: 1.32.0
magic-string: 0.30.21
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
tailwindcss: 4.3.3
'@tailwindcss/oxide-android-arm64@4.3.3':
@@ -4594,24 +4451,23 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
'@tailwindcss/oxide-win32-x64-msvc': 4.3.3
- '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))':
+ '@tailwindcss/vite@4.3.3(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
'@tailwindcss/node': 4.3.3
'@tailwindcss/oxide': 4.3.3
tailwindcss: 4.3.3
- vite: 8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
+ vite: 8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
- '@tanstack/virtual-core@3.17.3': {}
+ '@tanstack/virtual-core@3.19.7': {}
- '@tanstack/vue-virtual@3.13.31(vue@3.5.39(typescript@5.9.3))':
+ '@tanstack/vue-virtual@3.13.48(vue@3.5.44(typescript@6.0.3))':
dependencies:
- '@tanstack/virtual-core': 3.17.3
- vue: 3.5.39(typescript@5.9.3)
+ '@tanstack/virtual-core': 3.19.7
+ vue: 3.5.44(typescript@6.0.3)
- '@tybys/wasm-util@0.10.3':
+ '@tybys/wasm-util@0.10.4':
dependencies:
tslib: 2.8.1
- optional: true
'@types/debug@4.1.13':
dependencies:
@@ -4635,21 +4491,19 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
- '@types/mdx@2.0.13': {}
-
'@types/ms@2.1.0': {}
'@types/nlcst@2.0.3':
dependencies:
'@types/unist': 3.0.3
- '@types/node@24.12.4':
+ '@types/node@24.19.2':
dependencies:
- undici-types: 7.16.0
+ undici-types: 7.24.6
'@types/sax@1.2.7':
dependencies:
- '@types/node': 24.12.4
+ '@types/node': 24.19.2
'@types/unist@2.0.11': {}
@@ -4659,195 +4513,237 @@ snapshots:
'@types/web-bluetooth@0.0.21': {}
- '@ungap/structured-clone@1.3.1': {}
+ '@ungap/structured-clone@1.4.0': {}
- '@unhead/vue@2.1.15(vue@3.5.39(typescript@5.9.3))':
+ '@unhead/bundler@3.4.3(@oxc-project/types@0.155.0)(esbuild@0.28.2)(lightningcss@1.33.0)(rolldown@1.2.15)(unhead@3.4.3(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)))(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
- hookable: 6.1.1
- unhead: 2.1.15
- vue: 3.5.39(typescript@5.9.3)
-
- '@vercel/oidc@3.1.0': {}
-
- '@volar/kit@2.4.28(typescript@5.9.3)':
- dependencies:
- '@volar/language-service': 2.4.28
- '@volar/typescript': 2.4.28
+ magic-string: 1.4.3
+ oxc-walker: 1.1.1(@oxc-project/types@0.155.0)(rolldown@1.2.15)
+ unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ unplugin: 3.4.0(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ optionalDependencies:
+ esbuild: 0.28.2
+ lightningcss: 1.33.0
+ rolldown: 1.2.15
+ vite: 8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@oxc-project/types'
+ - '@rsbuild/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - rollup
+ - unloader
+
+ '@unhead/vue@3.4.3(@oxc-project/types@0.155.0)(esbuild@0.28.2)(lightningcss@1.33.0)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))(vue@3.5.44(typescript@6.0.3))':
+ dependencies:
+ '@unhead/bundler': 3.4.3(@oxc-project/types@0.155.0)(esbuild@0.28.2)(lightningcss@1.33.0)(rolldown@1.2.15)(unhead@3.4.3(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)))(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ hookable: 6.1.2
+ unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ unplugin: 3.4.0(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ vue: 3.5.44(typescript@6.0.3)
+ optionalDependencies:
+ vite: 8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@oxc-project/types'
+ - '@rsbuild/core'
+ - '@rspack/core'
+ - '@unhead/cli'
+ - '@vitejs/devtools-kit'
+ - bun-types-no-globals
+ - esbuild
+ - lightningcss
+ - oxc-parser
+ - rolldown
+ - rollup
+ - unloader
+
+ '@vercel/oidc@3.2.0': {}
+
+ '@volar/kit@2.4.30(typescript@6.0.3)':
+ dependencies:
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
+ '@volar/typescript': 2.4.30(typescript@6.0.3)
typesafe-path: 0.2.2
- typescript: 5.9.3
- vscode-languageserver-textdocument: 1.0.12
- vscode-uri: 3.1.0
+ typescript: 6.0.3
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-uri: 3.2.0
- '@volar/language-core@2.4.28':
+ '@volar/language-core@2.4.30':
dependencies:
- '@volar/source-map': 2.4.28
+ '@volar/source-map': 2.4.30
- '@volar/language-server@2.4.28':
+ '@volar/language-server@2.4.30(typescript@6.0.3)':
dependencies:
- '@volar/language-core': 2.4.28
- '@volar/language-service': 2.4.28
- '@volar/typescript': 2.4.28
+ '@volar/language-core': 2.4.30
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
+ '@volar/typescript': 2.4.30(typescript@6.0.3)
path-browserify: 1.0.1
request-light: 0.7.0
vscode-languageserver: 9.0.1
- vscode-languageserver-protocol: 3.17.5
- vscode-languageserver-textdocument: 1.0.12
- vscode-uri: 3.1.0
+ vscode-languageserver-protocol: 3.18.5
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ typescript: 6.0.3
- '@volar/language-service@2.4.28':
+ '@volar/language-service@2.4.30(typescript@6.0.3)':
dependencies:
- '@volar/language-core': 2.4.28
- vscode-languageserver-protocol: 3.17.5
- vscode-languageserver-textdocument: 1.0.12
- vscode-uri: 3.1.0
+ '@volar/language-core': 2.4.30
+ vscode-languageserver-protocol: 3.18.5
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ typescript: 6.0.3
- '@volar/source-map@2.4.28': {}
+ '@volar/source-map@2.4.30': {}
- '@volar/typescript@2.4.28':
+ '@volar/typescript@2.4.30(typescript@6.0.3)':
dependencies:
- '@volar/language-core': 2.4.28
+ '@volar/language-core': 2.4.30
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
path-browserify: 1.0.1
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ typescript: 6.0.3
'@vscode/emmet-helper@2.11.0':
dependencies:
emmet: 2.4.11
jsonc-parser: 2.3.1
- vscode-languageserver-textdocument: 1.0.12
- vscode-languageserver-types: 3.17.5
- vscode-uri: 3.1.0
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-languageserver-types: 3.18.5
+ vscode-uri: 3.2.0
'@vscode/l10n@0.0.18': {}
- '@vue/compiler-core@3.5.39':
+ '@vue/compiler-core@3.5.44':
dependencies:
- '@babel/parser': 7.29.7
- '@vue/shared': 3.5.39
+ '@babel/parser': 7.29.11
+ '@vue/shared': 3.5.44
entities: 7.0.1
estree-walker: 2.0.2
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
- '@vue/compiler-dom@3.5.39':
+ '@vue/compiler-dom@3.5.44':
dependencies:
- '@vue/compiler-core': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/compiler-core': 3.5.44
+ '@vue/shared': 3.5.44
- '@vue/compiler-sfc@3.5.39':
+ '@vue/compiler-sfc@3.5.44':
dependencies:
- '@babel/parser': 7.29.7
- '@vue/compiler-core': 3.5.39
- '@vue/compiler-dom': 3.5.39
- '@vue/compiler-ssr': 3.5.39
- '@vue/shared': 3.5.39
+ '@babel/parser': 7.29.11
+ '@vue/compiler-core': 3.5.44
+ '@vue/compiler-dom': 3.5.44
+ '@vue/compiler-ssr': 3.5.44
+ '@vue/shared': 3.5.44
estree-walker: 2.0.2
magic-string: 0.30.21
- postcss: 8.5.28
- source-map-js: 1.2.1
+ postcss: 8.5.31
+ source-map-js: 1.2.2
- '@vue/compiler-ssr@3.5.39':
+ '@vue/compiler-ssr@3.5.44':
dependencies:
- '@vue/compiler-dom': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/compiler-dom': 3.5.44
+ '@vue/shared': 3.5.44
- '@vue/reactivity@3.5.39':
+ '@vue/reactivity@3.5.44':
dependencies:
- '@vue/shared': 3.5.39
+ '@vue/shared': 3.5.44
- '@vue/runtime-core@3.5.39':
+ '@vue/runtime-core@3.5.44':
dependencies:
- '@vue/reactivity': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/reactivity': 3.5.44
+ '@vue/shared': 3.5.44
- '@vue/runtime-dom@3.5.39':
+ '@vue/runtime-dom@3.5.44':
dependencies:
- '@vue/reactivity': 3.5.39
- '@vue/runtime-core': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/reactivity': 3.5.44
+ '@vue/runtime-core': 3.5.44
+ '@vue/shared': 3.5.44
csstype: 3.2.3
- '@vue/server-renderer@3.5.39(vue@3.5.39(typescript@5.9.3))':
+ '@vue/server-renderer@3.5.44':
dependencies:
- '@vue/compiler-ssr': 3.5.39
- '@vue/shared': 3.5.39
- vue: 3.5.39(typescript@5.9.3)
+ '@vue/compiler-ssr': 3.5.44
+ '@vue/runtime-dom': 3.5.44
+ '@vue/shared': 3.5.44
- '@vue/shared@3.5.39': {}
+ '@vue/shared@3.5.44': {}
- '@vueuse/core@10.11.1(vue@3.5.39(typescript@5.9.3))':
+ '@vueuse/core@10.11.1(vue@3.5.44(typescript@6.0.3))':
dependencies:
'@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 10.11.1
- '@vueuse/shared': 10.11.1(vue@3.5.39(typescript@5.9.3))
- vue-demi: 0.14.10(vue@3.5.39(typescript@5.9.3))
+ '@vueuse/shared': 10.11.1(vue@3.5.44(typescript@6.0.3))
+ vue-demi: 0.14.10(vue@3.5.44(typescript@6.0.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@vueuse/core@13.9.0(vue@3.5.39(typescript@5.9.3))':
+ '@vueuse/core@15.0.0(vue@3.5.44(typescript@6.0.3))':
dependencies:
'@types/web-bluetooth': 0.0.21
- '@vueuse/metadata': 13.9.0
- '@vueuse/shared': 13.9.0(vue@3.5.39(typescript@5.9.3))
- vue: 3.5.39(typescript@5.9.3)
+ '@vueuse/metadata': 15.0.0
+ '@vueuse/shared': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ vue: 3.5.44(typescript@6.0.3)
- '@vueuse/integrations@13.9.0(focus-trap@7.8.0)(fuse.js@7.4.2)(vue@3.5.39(typescript@5.9.3))':
+ '@vueuse/integrations@15.0.0(focus-trap@8.2.3)(fuse.js@7.5.0)(vue@3.5.44(typescript@6.0.3))':
dependencies:
- '@vueuse/core': 13.9.0(vue@3.5.39(typescript@5.9.3))
- '@vueuse/shared': 13.9.0(vue@3.5.39(typescript@5.9.3))
- vue: 3.5.39(typescript@5.9.3)
+ '@vueuse/core': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ '@vueuse/shared': 15.0.0(vue@3.5.44(typescript@6.0.3))
+ vue: 3.5.44(typescript@6.0.3)
optionalDependencies:
- focus-trap: 7.8.0
- fuse.js: 7.4.2
+ focus-trap: 8.2.3
+ fuse.js: 7.5.0
'@vueuse/metadata@10.11.1': {}
- '@vueuse/metadata@13.9.0': {}
+ '@vueuse/metadata@15.0.0': {}
- '@vueuse/shared@10.11.1(vue@3.5.39(typescript@5.9.3))':
+ '@vueuse/shared@10.11.1(vue@3.5.44(typescript@6.0.3))':
dependencies:
- vue-demi: 0.14.10(vue@3.5.39(typescript@5.9.3))
+ vue-demi: 0.14.10(vue@3.5.44(typescript@6.0.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@vueuse/shared@13.9.0(vue@3.5.39(typescript@5.9.3))':
- dependencies:
- vue: 3.5.39(typescript@5.9.3)
-
- acorn-jsx@5.3.2(acorn@8.16.0):
+ '@vueuse/shared@15.0.0(vue@3.5.44(typescript@6.0.3))':
dependencies:
- acorn: 8.16.0
+ vue: 3.5.44(typescript@6.0.3)
- acorn@8.16.0: {}
+ '@workflow/serde@4.1.0': {}
- ai@6.0.33(zod@4.6.5):
+ ai@7.0.142(zod@4.6.7):
dependencies:
- '@ai-sdk/gateway': 3.0.13(zod@4.6.5)
- '@ai-sdk/provider': 3.0.2
- '@ai-sdk/provider-utils': 4.0.5(zod@4.6.5)
- '@opentelemetry/api': 1.9.0
- zod: 4.6.5
+ '@ai-sdk/gateway': 4.0.115(zod@4.6.7)
+ '@ai-sdk/provider': 4.0.28
+ '@ai-sdk/provider-utils': 5.0.61(zod@4.6.7)
+ zod: 4.6.7
ajv-draft-04@1.0.0(ajv@8.20.0):
optionalDependencies:
ajv: 8.20.0
+ ajv-i18n@4.2.0(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+
ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
- fast-uri: 3.1.8
+ fast-uri: 3.1.9
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- am-i-vibing@0.4.0:
+ am-i-vibing@0.5.0:
dependencies:
process-ancestry: 0.1.0
- ansi-regex@5.0.1: {}
+ ansi-regex@6.4.0: {}
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
+ ansi-styles@6.2.3: {}
anymatch@3.1.3:
dependencies:
@@ -4864,73 +4760,68 @@ snapshots:
aria-query@5.3.2: {}
- array-iterate@2.0.1: {}
-
- astring@1.9.0: {}
-
- astro-expressive-code@0.44.1(astro@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0)):
+ astro-expressive-code@0.44.3(astro@7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)):
dependencies:
- astro: 7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0)
- rehype-expressive-code: 0.44.1
+ astro: 7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ rehype-expressive-code: 0.44.3
url-extras: 0.1.0
- astro@7.3.5(@types/node@24.12.4)(jiti@2.7.0)(yaml@2.9.0):
+ astro@7.4.2(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1):
dependencies:
- '@astrojs/compiler-rs': 0.5.0
- '@astrojs/internal-helpers': 0.11.0
- '@astrojs/markdown-satteri': 0.4.2
- '@astrojs/telemetry': 3.3.3
- '@capsizecss/unpack': 4.0.0
- '@clack/prompts': 1.7.0
+ '@astrojs/compiler-rs': 0.5.2
+ '@astrojs/internal-helpers': 0.13.0
+ '@astrojs/markdown-satteri': 0.4.5
+ '@astrojs/telemetry': 3.4.1
+ '@capsizecss/unpack': 4.0.1
+ '@clack/prompts': 1.8.1
'@oslojs/encoding': 1.1.0
- am-i-vibing: 0.4.0
+ am-i-vibing: 0.5.0
aria-query: 5.3.2
axobject-query: 4.1.0
ci-info: 4.4.0
clsx: 2.1.1
common-ancestor-path: 2.0.0
cookie: 2.0.1
- devalue: 5.8.1
+ devalue: 6.0.3
diff: 9.0.0
dset: 3.1.4
- es-module-lexer: 2.3.2
- esbuild: 0.28.2
- find-proc: 0.2.0
+ es-module-lexer: 3.0.4
flattie: 1.1.1
fontace: 0.4.1
- get-tsconfig: 5.0.0-beta.4
+ get-tsconfig: 5.0.0-beta.6
github-slugger: 2.0.0
html-escaper: 3.0.3
- http-cache-semantics: 4.2.0
- js-yaml: 4.3.2
+ http-cache-semantics: 4.3.0
jsonc-parser: 3.3.1
- magic-string: 1.2.1
- magicast: 0.5.3
+ magic-string: 1.4.3
+ magicast: 0.5.5
mrmime: 2.0.1
neotraverse: 1.0.1
obug: 3.0.0
- p-limit: 7.3.1
- p-queue: 9.3.3
- package-manager-detector: 1.6.0
+ p-limit: 7.3.3
+ p-queue: 9.3.5
+ package-manager-detector: 1.9.0
piccolore: 0.1.3
- picomatch: 4.0.5
- shiki: 4.4.3
- smol-toml: 1.9.0
+ picomatch: 4.0.7
+ rolldown: 1.2.15
+ shiki: 4.5.0
+ smol-toml: 1.9.1
svgo: 4.1.0
tinyclip: 1.0.3
- tinyexec: 1.2.2
+ tinyexec: 1.3.1
tinyglobby: 0.2.17
- ultrahtml: 1.6.0
- unifont: 0.7.5
- unstorage: 1.17.5
- verkit: 0.4.1
- vite: 8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
- vitefu: 1.1.3(vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))
+ tinyps: 0.5.1
+ ultrahtml: 1.7.0
+ unifont: 1.0.3
+ unstorage: 1.17.6
+ verkit: 0.5.0
+ vite: 8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ vitefu: 1.1.3(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
xxhash-wasm: 1.1.0
yargs-parser: 22.0.0
- zod: 4.6.5
+ zod: 4.6.7
optionalDependencies:
- sharp: 0.35.4(@types/node@24.12.4)
+ sharp: 0.35.5(@types/node@24.19.2)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -4950,6 +4841,7 @@ snapshots:
- '@vitejs/devtools'
- aws4fetch
- db0
+ - esbuild
- idb-keyval
- ioredis
- jiti
@@ -4969,7 +4861,7 @@ snapshots:
bcp-47-match@2.0.3: {}
- bcp-47@2.1.0:
+ bcp-47@2.1.2:
dependencies:
is-alphabetical: 2.0.1
is-alphanumerical: 2.0.1
@@ -4979,7 +4871,7 @@ snapshots:
ccount@2.0.1: {}
- chalk@5.6.2: {}
+ chalk@6.0.1: {}
character-entities-html4@2.1.0: {}
@@ -4989,40 +4881,26 @@ snapshots:
character-reference-invalid@2.0.1: {}
- chokidar@4.0.3:
- dependencies:
- readdirp: 4.1.2
-
chokidar@5.0.0:
dependencies:
- readdirp: 5.0.0
+ readdirp: 5.1.1
ci-info@4.4.0: {}
- cliui@8.0.1:
+ cliui@9.0.1:
dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
+ string-width: 7.2.0
+ strip-ansi: 7.2.0
+ wrap-ansi: 9.0.2
clsx@2.1.1: {}
- collapse-white-space@2.1.0: {}
-
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
-
- color-name@1.1.4: {}
-
comma-separated-tokens@2.0.3: {}
commander@11.1.0: {}
common-ancestor-path@2.0.0: {}
- convert-hrtime@5.0.0: {}
-
cookie-es@1.2.3: {}
cookie@2.0.1: {}
@@ -5046,12 +4924,12 @@ snapshots:
css-tree@2.2.1:
dependencies:
mdn-data: 2.0.28
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
css-tree@3.2.1:
dependencies:
mdn-data: 2.27.1
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
css-what@7.0.0: {}
@@ -5063,11 +4941,11 @@ snapshots:
csstype@3.2.3: {}
- cva@1.0.0-beta.4(typescript@5.9.3):
+ cva@1.0.0-beta.4(typescript@6.0.3):
dependencies:
clsx: 2.1.1
optionalDependencies:
- typescript: 5.9.3
+ typescript: 6.0.3
debug@4.4.3:
dependencies:
@@ -5085,7 +4963,7 @@ snapshots:
detect-libc@2.1.2: {}
- devalue@5.8.1: {}
+ devalue@6.0.3: {}
devlop@1.1.0:
dependencies:
@@ -5120,9 +4998,9 @@ snapshots:
'@emmetio/abbreviation': 2.3.3
'@emmetio/css-abbreviation': 2.1.8
- emoji-regex@8.0.0: {}
+ emoji-regex@10.6.0: {}
- enhanced-resolve@5.25.1:
+ enhanced-resolve@5.26.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.3
@@ -5133,21 +5011,7 @@ snapshots:
entities@7.0.1: {}
- es-module-lexer@2.3.2: {}
-
- esast-util-from-estree@2.0.0:
- dependencies:
- '@types/estree-jsx': 1.0.5
- devlop: 1.1.0
- estree-util-visit: 2.0.0
- unist-util-position-from-estree: 2.0.0
-
- esast-util-from-js@2.0.1:
- dependencies:
- '@types/estree-jsx': 1.0.5
- acorn: 8.16.0
- esast-util-from-estree: 2.0.0
- vfile-message: 4.0.3
+ es-module-lexer@3.0.4: {}
esbuild@0.28.2:
optionalDependencies:
@@ -5177,56 +5041,24 @@ snapshots:
'@esbuild/win32-arm64': 0.28.2
'@esbuild/win32-ia32': 0.28.2
'@esbuild/win32-x64': 0.28.2
+ optional: true
escalade@3.2.0: {}
escape-string-regexp@5.0.0: {}
- estree-util-attach-comments@3.0.0:
- dependencies:
- '@types/estree': 1.0.9
-
- estree-util-build-jsx@3.0.1:
- dependencies:
- '@types/estree-jsx': 1.0.5
- devlop: 1.1.0
- estree-util-is-identifier-name: 3.0.0
- estree-walker: 3.0.3
-
- estree-util-is-identifier-name@3.0.0: {}
-
- estree-util-scope@1.0.0:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
-
- estree-util-to-js@2.0.0:
- dependencies:
- '@types/estree-jsx': 1.0.5
- astring: 1.9.0
- source-map: 0.7.6
-
- estree-util-visit@2.0.0:
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/unist': 3.0.3
-
estree-walker@2.0.2: {}
- estree-walker@3.0.3:
- dependencies:
- '@types/estree': 1.0.9
-
eventemitter3@5.0.4: {}
- eventsource-parser@3.1.0: {}
+ eventsource-parser@3.1.1: {}
- expressive-code@0.44.1:
+ expressive-code@0.44.3:
dependencies:
- '@expressive-code/core': 0.44.1
- '@expressive-code/plugin-frames': 0.44.1
- '@expressive-code/plugin-shiki': 0.44.1
- '@expressive-code/plugin-text-markers': 0.44.1
+ '@expressive-code/core': 0.44.3
+ '@expressive-code/plugin-frames': 0.44.3
+ '@expressive-code/plugin-shiki': 0.44.3
+ '@expressive-code/plugin-text-markers': 0.44.3
extend@3.0.2: {}
@@ -5238,29 +5070,25 @@ snapshots:
dependencies:
fast-string-truncated-width: 3.0.3
- fast-uri@3.1.8: {}
+ fast-uri@3.1.9: {}
fast-wrap-ansi@0.2.2:
dependencies:
fast-string-width: 3.0.2
- fdir@6.5.0(picomatch@4.0.4):
+ fdir@6.5.0(picomatch@4.0.7):
optionalDependencies:
- picomatch: 4.0.4
+ picomatch: 4.0.7
- fdir@6.5.0(picomatch@4.0.5):
- optionalDependencies:
- picomatch: 4.0.5
-
- find-proc@0.2.0: {}
-
- flatted@3.4.2: {}
+ flatted@3.4.4: {}
flattie@1.1.1: {}
- focus-trap@7.8.0:
+ fnv1a-64@0.1.2: {}
+
+ focus-trap@8.2.3:
dependencies:
- tabbable: 6.5.0
+ tabbable: 6.5.1
fontace@0.4.1:
dependencies:
@@ -5273,15 +5101,13 @@ snapshots:
fsevents@2.3.3:
optional: true
- function-timeout@1.0.2: {}
-
- fuse.js@7.4.2: {}
+ fuse.js@7.5.0: {}
get-caller-file@2.0.5: {}
- get-own-enumerable-keys@1.0.0: {}
+ get-east-asian-width@1.7.0: {}
- get-tsconfig@5.0.0-beta.4:
+ get-tsconfig@5.0.0-beta.6:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -5298,7 +5124,7 @@ snapshots:
defu: 6.1.7
destr: 2.0.5
iron-webcrypto: 1.2.1
- node-mock-http: 1.0.4
+ node-mock-http: 1.0.5
radix3: 1.1.2
ufo: 1.6.4
uncrypto: 0.1.3
@@ -5316,7 +5142,7 @@ snapshots:
hast-util-phrasing: 3.0.1
hast-util-whitespace: 3.0.0
html-whitespace-sensitive-tag-names: 3.0.1
- unist-util-visit-parents: 6.0.2
+ unist-util-visit-parents: 6.1.0
hast-util-from-html@2.0.3:
dependencies:
@@ -5333,7 +5159,7 @@ snapshots:
'@types/unist': 3.0.3
devlop: 1.1.0
hastscript: 9.0.1
- property-information: 7.1.0
+ property-information: 7.2.0
vfile: 6.0.3
vfile-location: 5.0.3
web-namespaces: 2.0.1
@@ -5374,14 +5200,14 @@ snapshots:
dependencies:
'@types/hast': 3.0.5
'@types/unist': 3.0.3
- '@ungap/structured-clone': 1.3.1
+ '@ungap/structured-clone': 1.4.0
hast-util-from-parse5: 8.0.3
hast-util-to-parse5: 8.0.1
html-void-elements: 3.0.0
mdast-util-to-hast: 13.2.1
parse5: 7.3.0
unist-util-position: 5.0.0
- unist-util-visit: 5.1.0
+ unist-util-visit: 5.2.0
vfile: 6.0.3
web-namespaces: 2.0.1
zwitch: 2.0.4
@@ -5389,7 +5215,7 @@ snapshots:
hast-util-sanitize@5.0.2:
dependencies:
'@types/hast': 3.0.5
- '@ungap/structured-clone': 1.3.1
+ '@ungap/structured-clone': 1.4.0
unist-util-position: 5.0.0
hast-util-select@6.0.4:
@@ -5405,31 +5231,10 @@ snapshots:
hast-util-to-string: 3.0.1
hast-util-whitespace: 3.0.0
nth-check: 2.1.1
- property-information: 7.1.0
- space-separated-tokens: 2.0.2
- unist-util-visit: 5.1.0
- zwitch: 2.0.4
-
- hast-util-to-estree@3.1.3:
- dependencies:
- '@types/estree': 1.0.9
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.5
- comma-separated-tokens: 2.0.3
- devlop: 1.1.0
- estree-util-attach-comments: 3.0.0
- estree-util-is-identifier-name: 3.0.0
- hast-util-whitespace: 3.0.0
- mdast-util-mdx-expression: 2.0.1
- mdast-util-mdx-jsx: 3.2.0
- mdast-util-mdxjs-esm: 2.0.1
- property-information: 7.1.0
+ property-information: 7.2.0
space-separated-tokens: 2.0.2
- style-to-js: 1.1.21
- unist-util-position: 5.0.0
+ unist-util-visit: 5.2.0
zwitch: 2.0.4
- transitivePeerDependencies:
- - supports-color
hast-util-to-html@9.0.5:
dependencies:
@@ -5440,37 +5245,34 @@ snapshots:
hast-util-whitespace: 3.0.0
html-void-elements: 3.0.0
mdast-util-to-hast: 13.2.1
- property-information: 7.1.0
+ property-information: 7.2.0
space-separated-tokens: 2.0.2
stringify-entities: 4.0.4
zwitch: 2.0.4
- hast-util-to-jsx-runtime@2.3.6:
+ hast-util-to-mdast@10.1.2:
dependencies:
- '@types/estree': 1.0.9
'@types/hast': 3.0.5
- '@types/unist': 3.0.3
- comma-separated-tokens: 2.0.3
- devlop: 1.1.0
- estree-util-is-identifier-name: 3.0.0
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.4.0
+ hast-util-phrasing: 3.0.1
+ hast-util-to-html: 9.0.5
+ hast-util-to-text: 4.0.3
hast-util-whitespace: 3.0.0
- mdast-util-mdx-expression: 2.0.1
- mdast-util-mdx-jsx: 3.2.0
- mdast-util-mdxjs-esm: 2.0.1
- property-information: 7.1.0
- space-separated-tokens: 2.0.2
- style-to-js: 1.1.21
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-hast: 13.2.1
+ mdast-util-to-string: 4.0.0
+ rehype-minify-whitespace: 6.0.2
+ trim-trailing-lines: 2.1.0
unist-util-position: 5.0.0
- vfile-message: 4.0.3
- transitivePeerDependencies:
- - supports-color
+ unist-util-visit: 5.2.0
hast-util-to-parse5@8.0.1:
dependencies:
'@types/hast': 3.0.5
comma-separated-tokens: 2.0.3
devlop: 1.1.0
- property-information: 7.1.0
+ property-information: 7.2.0
space-separated-tokens: 2.0.2
web-namespaces: 2.0.1
zwitch: 2.0.4
@@ -5479,12 +5281,9 @@ snapshots:
dependencies:
'@types/hast': 3.0.5
- hast-util-to-text@4.0.2:
+ hast-util-to-text@4.0.3:
dependencies:
'@types/hast': 3.0.5
- '@types/unist': 3.0.3
- hast-util-is-element: 3.0.0
- unist-util-find-after: 5.0.0
hast-util-whitespace@3.0.0:
dependencies:
@@ -5495,12 +5294,14 @@ snapshots:
'@types/hast': 3.0.5
comma-separated-tokens: 2.0.3
hast-util-parse-selector: 4.0.0
- property-information: 7.1.0
+ property-information: 7.2.0
space-separated-tokens: 2.0.2
- highlight.js@11.11.1: {}
+ highlight.js@11.11.2: {}
+
+ highlight.js@11.12.0: {}
- hookable@6.1.1: {}
+ hookable@6.1.2: {}
html-escaper@3.0.3: {}
@@ -5508,17 +5309,11 @@ snapshots:
html-whitespace-sensitive-tag-names@3.0.1: {}
- http-cache-semantics@4.2.0: {}
+ http-cache-semantics@4.3.0: {}
- i18next@26.3.6(typescript@5.9.3):
+ i18next@26.5.11(typescript@6.0.3):
optionalDependencies:
- typescript: 5.9.3
-
- identifier-regex@1.1.0:
- dependencies:
- reserved-identifiers: 1.2.0
-
- inline-style-parser@0.2.7: {}
+ typescript: 6.0.3
iron-webcrypto@1.2.1: {}
@@ -5535,24 +5330,13 @@ snapshots:
is-docker@4.0.0: {}
- is-fullwidth-code-point@3.0.0: {}
-
is-hexadecimal@2.0.1: {}
- is-identifier@1.1.0:
- dependencies:
- identifier-regex: 1.1.0
- super-regex: 1.1.0
-
- is-obj@3.0.0: {}
-
is-plain-obj@4.1.0: {}
- is-regexp@3.1.0: {}
-
jiti@2.7.0: {}
- js-base64@3.8.1: {}
+ js-base64@3.9.4: {}
js-yaml@4.3.2:
dependencies:
@@ -5674,74 +5458,61 @@ snapshots:
dependencies:
'@types/hast': 3.0.5
devlop: 1.1.0
- highlight.js: 11.11.1
+ highlight.js: 11.11.2
- lru-cache@11.5.1: {}
+ lru-cache@11.5.3: {}
magic-string@0.30.21:
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
-
- magic-string@1.2.1:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/sourcemap-codec': 1.6.0
- magicast@0.5.3:
+ magic-string@1.4.3:
dependencies:
- '@babel/parser': 7.29.7
- '@babel/types': 7.29.7
- source-map-js: 1.2.1
+ '@jridgewell/sourcemap-codec': 1.6.0
- make-asynchronous@1.1.0:
+ magicast@0.5.5:
dependencies:
- p-event: 6.0.1
- type-fest: 4.41.0
- web-worker: 1.5.0
-
- markdown-extensions@2.0.0: {}
+ '@babel/parser': 7.29.11
+ '@babel/types': 7.29.11
+ source-map-js: 1.2.2
markdown-table@3.0.4: {}
- mdast-util-definitions@6.0.0:
- dependencies:
- '@types/mdast': 4.0.4
- '@types/unist': 3.0.3
- unist-util-visit: 5.1.0
-
- mdast-util-directive@3.1.0:
+ mdast-util-directive@3.1.1:
dependencies:
'@types/mdast': 4.0.4
'@types/unist': 3.0.3
ccount: 2.0.1
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
+ mdast-util-from-markdown: 2.1.0
+ mdast-util-to-markdown: 2.2.0
+ micromark-util-character: 2.1.1
parse-entities: 4.0.2
stringify-entities: 4.0.4
- unist-util-visit-parents: 6.0.2
+ unist-util-visit-parents: 6.1.0
transitivePeerDependencies:
- supports-color
- mdast-util-find-and-replace@3.0.2:
+ mdast-util-find-and-replace@3.0.4:
dependencies:
'@types/mdast': 4.0.4
escape-string-regexp: 5.0.0
unist-util-is: 6.0.1
- unist-util-visit-parents: 6.0.2
+ unist-util-visit-parents: 6.1.0
- mdast-util-from-markdown@2.0.3:
+ mdast-util-from-markdown@2.1.0:
dependencies:
'@types/mdast': 4.0.4
'@types/unist': 3.0.3
decode-named-character-reference: 1.3.0
devlop: 1.1.0
mdast-util-to-string: 4.0.0
- micromark: 4.0.2
+ micromark: 4.0.3
micromark-util-decode-numeric-character-reference: 2.0.2
micromark-util-decode-string: 2.0.1
micromark-util-normalize-identifier: 2.0.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
unist-util-stringify-position: 4.0.0
transitivePeerDependencies:
- supports-color
@@ -5751,24 +5522,24 @@ snapshots:
'@types/mdast': 4.0.4
ccount: 2.0.1
devlop: 1.1.0
- mdast-util-find-and-replace: 3.0.2
+ mdast-util-find-and-replace: 3.0.4
micromark-util-character: 2.1.1
mdast-util-gfm-footnote@2.1.0:
dependencies:
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
+ mdast-util-from-markdown: 2.1.0
+ mdast-util-to-markdown: 2.2.0
micromark-util-normalize-identifier: 2.0.1
transitivePeerDependencies:
- supports-color
- mdast-util-gfm-strikethrough@2.0.0:
+ mdast-util-gfm-strikethrough@2.0.1:
dependencies:
'@types/mdast': 4.0.4
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
+ mdast-util-from-markdown: 2.1.0
+ mdast-util-to-markdown: 2.2.0
transitivePeerDependencies:
- supports-color
@@ -5777,8 +5548,8 @@ snapshots:
'@types/mdast': 4.0.4
devlop: 1.1.0
markdown-table: 3.0.4
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
+ mdast-util-from-markdown: 2.1.0
+ mdast-util-to-markdown: 2.2.0
transitivePeerDependencies:
- supports-color
@@ -5786,69 +5557,20 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
+ mdast-util-from-markdown: 2.1.0
+ mdast-util-to-markdown: 2.2.0
transitivePeerDependencies:
- supports-color
mdast-util-gfm@3.1.0:
dependencies:
- mdast-util-from-markdown: 2.0.3
+ mdast-util-from-markdown: 2.1.0
mdast-util-gfm-autolink-literal: 2.0.1
mdast-util-gfm-footnote: 2.1.0
- mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-strikethrough: 2.0.1
mdast-util-gfm-table: 2.0.0
mdast-util-gfm-task-list-item: 2.0.0
- mdast-util-to-markdown: 2.1.2
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdx-expression@2.0.1:
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.5
- '@types/mdast': 4.0.4
- devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdx-jsx@3.2.0:
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.5
- '@types/mdast': 4.0.4
- '@types/unist': 3.0.3
- ccount: 2.0.1
- devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
- parse-entities: 4.0.2
- stringify-entities: 4.0.4
- unist-util-stringify-position: 4.0.0
- vfile-message: 4.0.3
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdx@3.0.0:
- dependencies:
- mdast-util-from-markdown: 2.0.3
- mdast-util-mdx-expression: 2.0.1
- mdast-util-mdx-jsx: 3.2.0
- mdast-util-mdxjs-esm: 2.0.1
- mdast-util-to-markdown: 2.1.2
- transitivePeerDependencies:
- - supports-color
-
- mdast-util-mdxjs-esm@2.0.1:
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.5
- '@types/mdast': 4.0.4
- devlop: 1.1.0
- mdast-util-from-markdown: 2.0.3
- mdast-util-to-markdown: 2.1.2
+ mdast-util-to-markdown: 2.2.0
transitivePeerDependencies:
- supports-color
@@ -5861,24 +5583,26 @@ snapshots:
dependencies:
'@types/hast': 3.0.5
'@types/mdast': 4.0.4
- '@ungap/structured-clone': 1.3.1
+ '@ungap/structured-clone': 1.4.0
devlop: 1.1.0
micromark-util-sanitize-uri: 2.0.1
trim-lines: 3.0.1
unist-util-position: 5.0.0
- unist-util-visit: 5.1.0
+ unist-util-visit: 5.2.0
vfile: 6.0.3
- mdast-util-to-markdown@2.1.2:
+ mdast-util-to-markdown@2.2.0:
dependencies:
'@types/mdast': 4.0.4
'@types/unist': 3.0.3
longest-streak: 3.1.0
mdast-util-phrasing: 4.1.0
mdast-util-to-string: 4.0.0
+ micromark-util-character: 2.1.1
micromark-util-classify-character: 2.0.1
micromark-util-decode-string: 2.0.1
- unist-util-visit: 5.1.0
+ micromark-util-html-tag-name: 2.0.1
+ unist-util-visit: 5.2.0
zwitch: 2.0.4
mdast-util-to-string@4.0.0:
@@ -5891,33 +5615,34 @@ snapshots:
microdiff@1.5.0: {}
- micromark-core-commonmark@2.0.3:
+ micromark-core-commonmark@2.0.4:
dependencies:
decode-named-character-reference: 1.3.0
devlop: 1.1.0
micromark-factory-destination: 2.0.1
micromark-factory-label: 2.0.1
- micromark-factory-space: 2.0.1
+ micromark-factory-space: 2.1.0
micromark-factory-title: 2.0.1
micromark-factory-whitespace: 2.0.1
micromark-util-character: 2.1.1
micromark-util-chunked: 2.0.1
micromark-util-classify-character: 2.0.1
+ micromark-util-edit-map: 1.0.0
micromark-util-html-tag-name: 2.0.1
micromark-util-normalize-identifier: 2.0.1
micromark-util-resolve-all: 2.0.1
micromark-util-subtokenize: 2.1.0
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-extension-directive@4.0.0:
dependencies:
devlop: 1.1.0
- micromark-factory-space: 2.0.1
+ micromark-factory-space: 2.1.0
micromark-factory-whitespace: 2.0.1
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
parse-entities: 4.0.2
micromark-extension-gfm-autolink-literal@2.1.0:
@@ -5925,18 +5650,18 @@ snapshots:
micromark-util-character: 2.1.1
micromark-util-sanitize-uri: 2.0.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-extension-gfm-footnote@2.1.0:
dependencies:
devlop: 1.1.0
- micromark-core-commonmark: 2.0.3
- micromark-factory-space: 2.0.1
+ micromark-core-commonmark: 2.0.4
+ micromark-factory-space: 2.1.0
micromark-util-character: 2.1.1
micromark-util-normalize-identifier: 2.0.1
micromark-util-sanitize-uri: 2.0.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-extension-gfm-strikethrough@2.1.0:
dependencies:
@@ -5945,138 +5670,75 @@ snapshots:
micromark-util-classify-character: 2.0.1
micromark-util-resolve-all: 2.0.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
- micromark-extension-gfm-table@2.1.1:
+ micromark-extension-gfm-table@2.1.2:
dependencies:
devlop: 1.1.0
- micromark-factory-space: 2.0.1
+ micromark-factory-space: 2.1.0
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-extension-gfm-tagfilter@2.0.0:
dependencies:
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-extension-gfm-task-list-item@2.1.0:
dependencies:
devlop: 1.1.0
- micromark-factory-space: 2.0.1
+ micromark-factory-space: 2.1.0
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-extension-gfm@3.0.0:
dependencies:
micromark-extension-gfm-autolink-literal: 2.1.0
micromark-extension-gfm-footnote: 2.1.0
micromark-extension-gfm-strikethrough: 2.1.0
- micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-table: 2.1.2
micromark-extension-gfm-tagfilter: 2.0.0
micromark-extension-gfm-task-list-item: 2.1.0
micromark-util-combine-extensions: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-extension-mdx-expression@3.0.1:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- micromark-factory-mdx-expression: 2.0.3
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
-
- micromark-extension-mdx-jsx@3.0.2:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- estree-util-is-identifier-name: 3.0.0
- micromark-factory-mdx-expression: 2.0.3
- micromark-factory-space: 2.0.1
- micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- vfile-message: 4.0.3
-
- micromark-extension-mdx-md@2.0.0:
- dependencies:
- micromark-util-types: 2.0.2
-
- micromark-extension-mdxjs-esm@3.0.0:
- dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- micromark-core-commonmark: 2.0.3
- micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- unist-util-position-from-estree: 2.0.0
- vfile-message: 4.0.3
-
- micromark-extension-mdxjs@3.0.0:
- dependencies:
- acorn: 8.16.0
- acorn-jsx: 5.3.2(acorn@8.16.0)
- micromark-extension-mdx-expression: 3.0.1
- micromark-extension-mdx-jsx: 3.0.2
- micromark-extension-mdx-md: 2.0.0
- micromark-extension-mdxjs-esm: 3.0.0
- micromark-util-combine-extensions: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-factory-destination@2.0.1:
dependencies:
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-factory-label@2.0.1:
dependencies:
devlop: 1.1.0
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
- micromark-factory-mdx-expression@2.0.3:
+ micromark-factory-space@2.1.0:
dependencies:
- '@types/estree': 1.0.9
- devlop: 1.1.0
- micromark-factory-space: 2.0.1
micromark-util-character: 2.1.1
- micromark-util-events-to-acorn: 2.0.3
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- unist-util-position-from-estree: 2.0.0
- vfile-message: 4.0.3
-
- micromark-factory-space@2.0.1:
- dependencies:
- micromark-util-character: 2.1.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-factory-title@2.0.1:
dependencies:
- micromark-factory-space: 2.0.1
+ micromark-factory-space: 2.1.0
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-factory-whitespace@2.0.1:
dependencies:
- micromark-factory-space: 2.0.1
+ micromark-factory-space: 2.1.0
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-util-character@2.1.1:
dependencies:
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-util-chunked@2.0.1:
dependencies:
@@ -6086,12 +5748,12 @@ snapshots:
dependencies:
micromark-util-character: 2.1.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-util-combine-extensions@2.0.1:
dependencies:
micromark-util-chunked: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-util-decode-numeric-character-reference@2.0.2:
dependencies:
@@ -6104,17 +5766,11 @@ snapshots:
micromark-util-decode-numeric-character-reference: 2.0.2
micromark-util-symbol: 2.0.1
- micromark-util-encode@2.0.1: {}
-
- micromark-util-events-to-acorn@2.0.3:
+ micromark-util-edit-map@1.0.0:
dependencies:
- '@types/estree': 1.0.9
- '@types/unist': 3.0.3
- devlop: 1.1.0
- estree-util-visit: 2.0.0
- micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
- vfile-message: 4.0.3
+ micromark-util-types: 2.0.3
+
+ micromark-util-encode@2.0.1: {}
micromark-util-html-tag-name@2.0.1: {}
@@ -6124,7 +5780,7 @@ snapshots:
micromark-util-resolve-all@2.0.1:
dependencies:
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-util-sanitize-uri@2.0.1:
dependencies:
@@ -6137,31 +5793,32 @@ snapshots:
devlop: 1.1.0
micromark-util-chunked: 2.0.1
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
micromark-util-symbol@2.0.1: {}
- micromark-util-types@2.0.2: {}
+ micromark-util-types@2.0.3: {}
- micromark@4.0.2:
+ micromark@4.0.3:
dependencies:
'@types/debug': 4.1.13
debug: 4.4.3
decode-named-character-reference: 1.3.0
devlop: 1.1.0
- micromark-core-commonmark: 2.0.3
- micromark-factory-space: 2.0.1
+ micromark-core-commonmark: 2.0.4
+ micromark-factory-space: 2.1.0
micromark-util-character: 2.1.1
micromark-util-chunked: 2.0.1
micromark-util-combine-extensions: 2.0.1
micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-edit-map: 1.0.0
micromark-util-encode: 2.0.1
micromark-util-normalize-identifier: 2.0.1
micromark-util-resolve-all: 2.0.1
micromark-util-sanitize-uri: 2.0.1
micromark-util-subtokenize: 2.1.0
micromark-util-symbol: 2.0.1
- micromark-util-types: 2.0.2
+ micromark-util-types: 2.0.3
transitivePeerDependencies:
- supports-color
@@ -6171,7 +5828,7 @@ snapshots:
muggle-string@0.4.1: {}
- nanoid@3.3.19: {}
+ nanoid@3.3.20: {}
nanoid@5.1.16: {}
@@ -6185,7 +5842,7 @@ snapshots:
node-fetch-native@1.6.7: {}
- node-mock-http@1.0.4: {}
+ node-mock-http@1.0.5: {}
normalize-path@3.0.0: {}
@@ -6201,8 +5858,6 @@ snapshots:
node-fetch-native: 1.6.7
ufo: 1.6.4
- ohash@2.0.11: {}
-
oniguruma-parser@0.12.2: {}
oniguruma-to-es@4.3.6:
@@ -6211,24 +5866,23 @@ snapshots:
regex: 6.1.0
regex-recursion: 6.0.2
- p-event@6.0.1:
- dependencies:
- p-timeout: 6.1.4
+ oxc-walker@1.1.1(@oxc-project/types@0.155.0)(rolldown@1.2.15):
+ optionalDependencies:
+ '@oxc-project/types': 0.155.0
+ rolldown: 1.2.15
- p-limit@7.3.1:
+ p-limit@7.3.3:
dependencies:
yocto-queue: 1.2.2
- p-queue@9.3.3:
+ p-queue@9.3.5:
dependencies:
eventemitter3: 5.0.4
- p-timeout: 7.0.1
+ p-timeout: 7.0.2
- p-timeout@6.1.4: {}
+ p-timeout@7.0.2: {}
- p-timeout@7.0.1: {}
-
- package-manager-detector@1.6.0: {}
+ package-manager-detector@1.9.0: {}
pagefind@1.5.2:
optionalDependencies:
@@ -6250,17 +5904,6 @@ snapshots:
is-decimal: 2.0.1
is-hexadecimal: 2.0.1
- parse-latin@7.0.0:
- dependencies:
- '@types/nlcst': 2.0.3
- '@types/unist': 3.0.3
- nlcst-to-string: 4.0.0
- unist-util-modify-children: 4.0.0
- unist-util-visit-children: 3.0.0
- vfile: 6.0.3
-
- parse-ms@4.0.0: {}
-
parse5@7.3.0:
dependencies:
entities: 6.0.1
@@ -6275,89 +5918,54 @@ snapshots:
picomatch@2.3.2: {}
- picomatch@4.0.4: {}
-
- picomatch@4.0.5: {}
+ picomatch@4.0.7: {}
- postcss-nested@6.2.0(postcss@8.5.28):
+ postcss-nested@7.0.2(postcss@8.5.31):
dependencies:
- postcss: 8.5.28
- postcss-selector-parser: 6.1.2
+ postcss: 8.5.31
+ postcss-selector-parser: 7.1.7
- postcss-selector-parser@6.1.2:
+ postcss-selector-parser@7.1.7:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss@8.5.28:
+ postcss@8.5.31:
dependencies:
- nanoid: 3.3.19
+ nanoid: 3.3.20
picocolors: 1.1.1
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
- prettier@3.8.3: {}
+ prettier@3.9.10: {}
- pretty-ms@9.3.0:
- dependencies:
- parse-ms: 4.0.0
+ pretty-ms@10.0.0: {}
prismjs@1.30.0: {}
process-ancestry@0.1.0: {}
- property-information@7.1.0: {}
+ property-information@7.2.0: {}
- radix-vue@1.9.17(vue@3.5.39(typescript@5.9.3)):
+ radix-vue@1.9.17(vue@3.5.44(typescript@6.0.3)):
dependencies:
'@floating-ui/dom': 1.8.0
- '@floating-ui/vue': 1.1.11(vue@3.5.39(typescript@5.9.3))
- '@internationalized/date': 3.12.2
- '@internationalized/number': 3.6.7
- '@tanstack/vue-virtual': 3.13.31(vue@3.5.39(typescript@5.9.3))
- '@vueuse/core': 10.11.1(vue@3.5.39(typescript@5.9.3))
- '@vueuse/shared': 10.11.1(vue@3.5.39(typescript@5.9.3))
+ '@floating-ui/vue': 1.1.11(vue@3.5.44(typescript@6.0.3))
+ '@internationalized/date': 3.12.4
+ '@internationalized/number': 3.6.9
+ '@tanstack/vue-virtual': 3.13.48(vue@3.5.44(typescript@6.0.3))
+ '@vueuse/core': 10.11.1(vue@3.5.44(typescript@6.0.3))
+ '@vueuse/shared': 10.11.1(vue@3.5.44(typescript@6.0.3))
aria-hidden: 1.2.6
defu: 6.1.7
fast-deep-equal: 3.1.3
nanoid: 5.1.16
- vue: 3.5.39(typescript@5.9.3)
+ vue: 3.5.44(typescript@6.0.3)
transitivePeerDependencies:
- '@vue/composition-api'
radix3@1.1.2: {}
- readdirp@4.1.2: {}
-
- readdirp@5.0.0: {}
-
- recma-build-jsx@1.0.0:
- dependencies:
- '@types/estree': 1.0.9
- estree-util-build-jsx: 3.0.1
- vfile: 6.0.3
-
- recma-jsx@1.0.1(acorn@8.16.0):
- dependencies:
- acorn: 8.16.0
- acorn-jsx: 5.3.2(acorn@8.16.0)
- estree-util-to-js: 2.0.0
- recma-parse: 1.0.0
- recma-stringify: 1.0.0
- unified: 11.0.5
-
- recma-parse@1.0.0:
- dependencies:
- '@types/estree': 1.0.9
- esast-util-from-js: 2.0.1
- unified: 11.0.5
- vfile: 6.0.3
-
- recma-stringify@1.0.0:
- dependencies:
- '@types/estree': 1.0.9
- estree-util-to-js: 2.0.0
- unified: 11.0.5
- vfile: 6.0.3
+ readdirp@5.1.1: {}
regex-recursion@6.0.2:
dependencies:
@@ -6369,24 +5977,29 @@ snapshots:
dependencies:
regex-utilities: 2.3.0
- rehype-expressive-code@0.44.1:
+ rehype-expressive-code@0.44.3:
dependencies:
- expressive-code: 0.44.1
+ expressive-code: 0.44.3
rehype-external-links@3.0.0:
dependencies:
'@types/hast': 3.0.5
- '@ungap/structured-clone': 1.3.1
+ '@ungap/structured-clone': 1.4.0
hast-util-is-element: 3.0.0
is-absolute-url: 4.0.1
space-separated-tokens: 2.0.2
- unist-util-visit: 5.1.0
+ unist-util-visit: 5.2.0
rehype-format@5.0.1:
dependencies:
'@types/hast': 3.0.5
hast-util-format: 1.1.0
+ rehype-minify-whitespace@6.0.2:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-minify-whitespace: 1.0.1
+
rehype-parse@9.0.1:
dependencies:
'@types/hast': 3.0.5
@@ -6399,13 +6012,13 @@ snapshots:
hast-util-raw: 9.1.0
vfile: 6.0.3
- rehype-recma@1.0.0:
+ rehype-remark@10.0.1:
dependencies:
- '@types/estree': 1.0.9
'@types/hast': 3.0.5
- hast-util-to-estree: 3.1.3
- transitivePeerDependencies:
- - supports-color
+ '@types/mdast': 4.0.4
+ hast-util-to-mdast: 10.1.2
+ unified: 11.0.5
+ vfile: 6.0.3
rehype-sanitize@6.0.0:
dependencies:
@@ -6418,17 +6031,10 @@ snapshots:
hast-util-to-html: 9.0.5
unified: 11.0.5
- rehype@13.0.2:
- dependencies:
- '@types/hast': 3.0.5
- rehype-parse: 9.0.1
- rehype-stringify: 10.0.1
- unified: 11.0.5
-
remark-directive@4.0.0:
dependencies:
'@types/mdast': 4.0.4
- mdast-util-directive: 3.1.0
+ mdast-util-directive: 3.1.1
micromark-extension-directive: 4.0.0
unified: 11.0.5
transitivePeerDependencies:
@@ -6445,18 +6051,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- remark-mdx@3.1.1:
- dependencies:
- mdast-util-mdx: 3.0.0
- micromark-extension-mdxjs: 3.0.0
- transitivePeerDependencies:
- - supports-color
-
remark-parse@11.0.0:
dependencies:
'@types/mdast': 4.0.4
- mdast-util-from-markdown: 2.0.3
- micromark-util-types: 2.0.2
+ mdast-util-from-markdown: 2.1.0
+ micromark-util-types: 2.0.3
unified: 11.0.5
transitivePeerDependencies:
- supports-color
@@ -6469,219 +6068,156 @@ snapshots:
unified: 11.0.5
vfile: 6.0.3
- remark-smartypants@3.0.2:
- dependencies:
- retext: 9.0.0
- retext-smartypants: 6.2.0
- unified: 11.0.5
- unist-util-visit: 5.1.0
-
remark-stringify@11.0.0:
dependencies:
'@types/mdast': 4.0.4
- mdast-util-to-markdown: 2.1.2
+ mdast-util-to-markdown: 2.2.0
unified: 11.0.5
request-light@0.5.8: {}
request-light@0.7.0: {}
- require-directory@2.1.1: {}
-
require-from-string@2.0.2: {}
- reserved-identifiers@1.2.0: {}
-
resolve-pkg-maps@1.0.0: {}
- retext-latin@4.0.0:
- dependencies:
- '@types/nlcst': 2.0.3
- parse-latin: 7.0.0
- unified: 11.0.5
-
retext-smartypants@6.2.0:
dependencies:
'@types/nlcst': 2.0.3
nlcst-to-string: 4.0.0
- unist-util-visit: 5.1.0
-
- retext-stringify@4.0.0:
- dependencies:
- '@types/nlcst': 2.0.3
- nlcst-to-string: 4.0.0
- unified: 11.0.5
-
- retext@9.0.0:
- dependencies:
- '@types/nlcst': 2.0.3
- retext-latin: 4.0.0
- retext-stringify: 4.0.0
- unified: 11.0.5
+ unist-util-visit: 5.2.0
- rolldown@1.2.5:
+ rolldown@1.2.15:
dependencies:
- '@oxc-project/types': 0.146.0
+ '@oxc-project/types': 0.155.0
'@rolldown/pluginutils': 1.0.1
optionalDependencies:
- '@rolldown/binding-android-arm-eabi': 1.2.5
- '@rolldown/binding-android-arm64': 1.2.5
- '@rolldown/binding-darwin-arm64': 1.2.5
- '@rolldown/binding-darwin-x64': 1.2.5
- '@rolldown/binding-freebsd-x64': 1.2.5
- '@rolldown/binding-linux-arm-gnueabihf': 1.2.5
- '@rolldown/binding-linux-arm64-gnu': 1.2.5
- '@rolldown/binding-linux-arm64-musl': 1.2.5
- '@rolldown/binding-linux-ppc64-gnu': 1.2.5
- '@rolldown/binding-linux-s390x-gnu': 1.2.5
- '@rolldown/binding-linux-x64-gnu': 1.2.5
- '@rolldown/binding-linux-x64-musl': 1.2.5
- '@rolldown/binding-openharmony-arm64': 1.2.5
- '@rolldown/binding-win32-arm64-msvc': 1.2.5
- '@rolldown/binding-win32-x64-msvc': 1.2.5
-
- satteri@0.10.4:
+ '@rolldown/binding-android-arm-eabi': 1.2.15
+ '@rolldown/binding-android-arm64': 1.2.15
+ '@rolldown/binding-darwin-arm64': 1.2.15
+ '@rolldown/binding-darwin-x64': 1.2.15
+ '@rolldown/binding-freebsd-x64': 1.2.15
+ '@rolldown/binding-linux-arm-gnueabihf': 1.2.15
+ '@rolldown/binding-linux-arm64-gnu': 1.2.15
+ '@rolldown/binding-linux-arm64-musl': 1.2.15
+ '@rolldown/binding-linux-ppc64-gnu': 1.2.15
+ '@rolldown/binding-linux-s390x-gnu': 1.2.15
+ '@rolldown/binding-linux-x64-gnu': 1.2.15
+ '@rolldown/binding-linux-x64-musl': 1.2.15
+ '@rolldown/binding-openharmony-arm64': 1.2.15
+ '@rolldown/binding-win32-arm64-msvc': 1.2.15
+ '@rolldown/binding-win32-x64-msvc': 1.2.15
+
+ satteri@0.10.5:
dependencies:
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.5
'@types/mdast': 4.0.4
'@types/unist': 3.0.3
optionalDependencies:
- '@bruits/satteri-darwin-x64': 0.10.4
- '@bruits/satteri-linux-arm64-gnu': 0.10.4
- '@bruits/satteri-linux-arm64-musl': 0.10.4
- '@bruits/satteri-linux-x64-gnu': 0.10.4
- '@bruits/satteri-wasm32-wasi': 0.10.4
- '@bruits/satteri-win32-arm64-msvc': 0.10.4
- '@bruits/satteri-win32-x64-msvc': 0.10.4
-
- satteri@0.9.5:
- dependencies:
- '@types/estree-jsx': 1.0.5
- '@types/hast': 3.0.5
- '@types/mdast': 4.0.4
- '@types/unist': 3.0.3
- optionalDependencies:
- '@bruits/satteri-darwin-arm64': 0.9.5
- '@bruits/satteri-darwin-x64': 0.9.5
- '@bruits/satteri-linux-arm64-gnu': 0.9.5
- '@bruits/satteri-linux-arm64-musl': 0.9.5
- '@bruits/satteri-linux-x64-gnu': 0.9.5
- '@bruits/satteri-linux-x64-musl': 0.9.5
- '@bruits/satteri-wasm32-wasi': 0.9.5
- '@bruits/satteri-win32-arm64-msvc': 0.9.5
- '@bruits/satteri-win32-x64-msvc': 0.9.5
+ '@bruits/satteri-darwin-arm64': 0.10.5
+ '@bruits/satteri-darwin-x64': 0.10.5
+ '@bruits/satteri-linux-arm64-gnu': 0.10.5
+ '@bruits/satteri-linux-arm64-musl': 0.10.5
+ '@bruits/satteri-linux-x64-gnu': 0.10.5
+ '@bruits/satteri-linux-x64-musl': 0.10.5
+ '@bruits/satteri-wasm32-wasi': 0.10.5
+ '@bruits/satteri-win32-arm64-msvc': 0.10.5
+ '@bruits/satteri-win32-x64-msvc': 0.10.5
sax@1.6.1: {}
semver@7.8.5: {}
- set-cookie-parser@3.1.0: {}
+ set-cookie-parser@3.1.3: {}
- sharp@0.35.4(@types/node@24.12.4):
+ sharp@0.35.5(@types/node@24.19.2):
dependencies:
'@img/colour': 1.1.0
detect-libc: 2.1.2
semver: 7.8.5
optionalDependencies:
- '@img/sharp-darwin-arm64': 0.35.4
- '@img/sharp-darwin-x64': 0.35.4
- '@img/sharp-freebsd-wasm32': 0.35.4
- '@img/sharp-libvips-darwin-arm64': 1.3.3
- '@img/sharp-libvips-darwin-x64': 1.3.3
- '@img/sharp-libvips-linux-arm': 1.3.3
- '@img/sharp-libvips-linux-arm64': 1.3.3
- '@img/sharp-libvips-linux-ppc64': 1.3.3
- '@img/sharp-libvips-linux-riscv64': 1.3.3
- '@img/sharp-libvips-linux-s390x': 1.3.3
- '@img/sharp-libvips-linux-x64': 1.3.3
- '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
- '@img/sharp-libvips-linuxmusl-x64': 1.3.3
- '@img/sharp-linux-arm': 0.35.4
- '@img/sharp-linux-arm64': 0.35.4
- '@img/sharp-linux-ppc64': 0.35.4
- '@img/sharp-linux-riscv64': 0.35.4
- '@img/sharp-linux-s390x': 0.35.4
- '@img/sharp-linux-x64': 0.35.4
- '@img/sharp-linuxmusl-arm64': 0.35.4
- '@img/sharp-linuxmusl-x64': 0.35.4
- '@img/sharp-webcontainers-wasm32': 0.35.4
- '@img/sharp-win32-arm64': 0.35.4
- '@img/sharp-win32-ia32': 0.35.4
- '@img/sharp-win32-x64': 0.35.4
- '@types/node': 24.12.4
-
- shiki@4.4.3:
- dependencies:
- '@shikijs/core': 4.4.3
- '@shikijs/engine-javascript': 4.4.3
- '@shikijs/engine-oniguruma': 4.4.3
- '@shikijs/langs': 4.4.3
- '@shikijs/themes': 4.4.3
- '@shikijs/types': 4.4.3
- '@shikijs/vscode-textmate': 10.0.2
+ '@img/sharp-darwin-arm64': 0.35.5
+ '@img/sharp-darwin-x64': 0.35.5
+ '@img/sharp-freebsd-wasm32': 0.35.5
+ '@img/sharp-libvips-darwin-arm64': 1.3.4
+ '@img/sharp-libvips-darwin-x64': 1.3.4
+ '@img/sharp-libvips-linux-arm': 1.3.4
+ '@img/sharp-libvips-linux-arm64': 1.3.4
+ '@img/sharp-libvips-linux-ppc64': 1.3.4
+ '@img/sharp-libvips-linux-riscv64': 1.3.4
+ '@img/sharp-libvips-linux-s390x': 1.3.4
+ '@img/sharp-libvips-linux-x64': 1.3.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.4
+ '@img/sharp-linux-arm': 0.35.5
+ '@img/sharp-linux-arm64': 0.35.5
+ '@img/sharp-linux-ppc64': 0.35.5
+ '@img/sharp-linux-riscv64': 0.35.5
+ '@img/sharp-linux-s390x': 0.35.5
+ '@img/sharp-linux-x64': 0.35.5
+ '@img/sharp-linuxmusl-arm64': 0.35.5
+ '@img/sharp-linuxmusl-x64': 0.35.5
+ '@img/sharp-webcontainers-wasm32': 0.35.5
+ '@img/sharp-win32-arm64': 0.35.5
+ '@img/sharp-win32-ia32': 0.35.5
+ '@img/sharp-win32-x64': 0.35.5
+ '@types/node': 24.19.2
+
+ shiki@4.5.0:
+ dependencies:
+ '@shikijs/core': 4.5.0
+ '@shikijs/engine-javascript': 4.5.0
+ '@shikijs/engine-oniguruma': 4.5.0
+ '@shikijs/langs': 4.5.0
+ '@shikijs/themes': 4.5.0
+ '@shikijs/types': 4.5.0
+ '@shikijs/vscode-textmate': 10.1.0
'@types/hast': 3.0.5
sisteransi@1.0.5: {}
sitemap@9.0.1:
dependencies:
- '@types/node': 24.12.4
+ '@types/node': 24.19.2
'@types/sax': 1.2.7
arg: 5.0.2
sax: 1.6.1
- smol-toml@1.9.0: {}
-
- source-map-js@1.2.1: {}
+ smol-toml@1.9.1: {}
- source-map@0.7.6: {}
+ source-map-js@1.2.2: {}
space-separated-tokens@2.0.2: {}
- stream-replace-string@2.0.0: {}
+ std-env@4.3.0: {}
string-byte-length@3.0.1: {}
string-byte-slice@3.0.1: {}
- string-width@4.2.3:
+ string-width@7.2.0:
dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.7.0
+ strip-ansi: 7.2.0
+
+ string-width@8.3.0:
+ dependencies:
+ get-east-asian-width: 1.7.0
+ strip-ansi: 7.2.0
stringify-entities@4.0.4:
dependencies:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
- stringify-object@6.0.0:
- dependencies:
- get-own-enumerable-keys: 1.0.0
- is-identifier: 1.1.0
- is-obj: 3.0.0
- is-regexp: 3.1.0
-
- strip-ansi@6.0.1:
+ strip-ansi@7.2.0:
dependencies:
- ansi-regex: 5.0.1
+ ansi-regex: 6.4.0
- style-mod@4.1.3: {}
-
- style-to-js@1.1.21:
- dependencies:
- style-to-object: 1.0.14
-
- style-to-object@1.0.14:
- dependencies:
- inline-style-parser: 0.2.7
-
- super-regex@1.1.0:
- dependencies:
- function-timeout: 1.0.2
- make-asynchronous: 1.1.0
- time-span: 5.1.0
+ style-mod@4.1.4: {}
svgo@4.1.0:
dependencies:
@@ -6693,42 +6229,37 @@ snapshots:
picocolors: 1.1.1
sax: 1.6.1
- swrv@1.2.0(vue@3.5.39(typescript@5.9.3)):
+ swrv@1.3.0(vue@3.5.44(typescript@6.0.3)):
dependencies:
- vue: 3.5.39(typescript@5.9.3)
+ vue: 3.5.44(typescript@6.0.3)
- tabbable@6.5.0: {}
+ tabbable@6.5.1: {}
tagged-tag@1.0.0: {}
- tailwind-merge@3.5.0: {}
+ tailwind-merge@3.7.0: {}
tailwindcss@4.3.3: {}
tapable@2.3.3: {}
- time-span@5.1.0:
- dependencies:
- convert-hrtime: 5.0.0
-
tiny-inflate@1.0.3: {}
tinyclip@1.0.3: {}
- tinyexec@1.2.2: {}
-
- tinyglobby@0.2.16:
- dependencies:
- fdir: 6.5.0(picomatch@4.0.4)
- picomatch: 4.0.4
+ tinyexec@1.3.1: {}
tinyglobby@0.2.17:
dependencies:
- fdir: 6.5.0(picomatch@4.0.5)
- picomatch: 4.0.5
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
+
+ tinyps@0.5.1: {}
trim-lines@3.0.1: {}
+ trim-trailing-lines@2.1.0: {}
+
trough@2.2.0: {}
truncate-json@3.0.1:
@@ -6739,9 +6270,7 @@ snapshots:
tslib@2.8.1: {}
- type-fest@4.41.0: {}
-
- type-fest@5.8.0:
+ type-fest@5.10.0:
dependencies:
tagged-tag: 1.0.0
@@ -6751,21 +6280,36 @@ snapshots:
dependencies:
semver: 7.8.5
- typescript@5.9.3: {}
+ typescript@6.0.3: {}
ufo@1.6.4: {}
- ultrahtml@1.6.0: {}
+ ultrahtml@1.7.0: {}
uncrypto@0.1.3: {}
- undici-types@7.16.0: {}
+ undici-types@7.24.6: {}
+
+ undici@7.30.1: {}
- undici@8.11.2: {}
+ undici@8.12.3: {}
- unhead@2.1.15:
+ unhead@3.4.3(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)):
dependencies:
- hookable: 6.1.1
+ hookable: 6.1.2
+ unplugin: 3.4.0(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ optionalDependencies:
+ vite: 8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rsbuild/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - esbuild
+ - rolldown
+ - rollup
+ - unloader
+ - webpack
unified@11.0.5:
dependencies:
@@ -6777,65 +6321,53 @@ snapshots:
trough: 2.2.0
vfile: 6.0.3
- unifont@0.7.5:
+ unifont@1.0.3:
dependencies:
css-tree: 3.2.1
- ohash: 2.0.11
- undici: 8.11.2
-
- unist-util-find-after@5.0.0:
- dependencies:
- '@types/unist': 3.0.3
- unist-util-is: 6.0.1
+ fnv1a-64: 0.1.2
+ std-env: 4.3.0
+ undici: 8.12.3
unist-util-is@6.0.1:
dependencies:
'@types/unist': 3.0.3
- unist-util-modify-children@4.0.0:
- dependencies:
- '@types/unist': 3.0.3
- array-iterate: 2.0.1
-
- unist-util-position-from-estree@2.0.0:
- dependencies:
- '@types/unist': 3.0.3
-
unist-util-position@5.0.0:
dependencies:
'@types/unist': 3.0.3
- unist-util-remove-position@5.0.0:
- dependencies:
- '@types/unist': 3.0.3
- unist-util-visit: 5.1.0
-
unist-util-stringify-position@4.0.0:
dependencies:
'@types/unist': 3.0.3
- unist-util-visit-children@3.0.0:
+ unist-util-visit-parents@6.1.0:
dependencies:
'@types/unist': 3.0.3
+ unist-util-is: 6.0.1
- unist-util-visit-parents@6.0.2:
+ unist-util-visit@5.2.0:
dependencies:
'@types/unist': 3.0.3
unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.1.0
- unist-util-visit@5.1.0:
+ unplugin@3.4.0(esbuild@0.28.2)(rolldown@1.2.15)(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)):
dependencies:
- '@types/unist': 3.0.3
- unist-util-is: 6.0.1
- unist-util-visit-parents: 6.0.2
+ '@jridgewell/remapping': 2.3.5
+ picomatch: 4.0.7
+ webpack-virtual-modules: 0.6.2
+ optionalDependencies:
+ esbuild: 0.28.2
+ rolldown: 1.2.15
+ vite: 8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
- unstorage@1.17.5:
+ unstorage@1.17.6:
dependencies:
anymatch: 3.1.3
chokidar: 5.0.0
destr: 2.0.5
h3: 1.15.11
- lru-cache: 11.5.1
+ lru-cache: 11.5.3
node-fetch-native: 1.6.7
ofetch: 1.5.1
ufo: 1.6.4
@@ -6844,7 +6376,7 @@ snapshots:
util-deprecate@1.0.2: {}
- verkit@0.4.1: {}
+ verkit@0.5.0: {}
vfile-location@5.0.3:
dependencies:
@@ -6861,101 +6393,103 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0):
+ vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1):
dependencies:
lightningcss: 1.33.0
- picomatch: 4.0.5
- postcss: 8.5.28
- rolldown: 1.2.5
+ picomatch: 4.0.7
+ postcss: 8.5.31
+ rolldown: 1.2.15
tinyglobby: 0.2.17
optionalDependencies:
- '@types/node': 24.12.4
+ '@types/node': 24.19.2
esbuild: 0.28.2
fsevents: 2.3.3
jiti: 2.7.0
- yaml: 2.9.0
+ yaml: 2.9.1
- vitefu@1.1.3(vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)):
+ vitefu@1.1.3(vite@8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)):
optionalDependencies:
- vite: 8.2.1(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
+ vite: 8.3.5(@types/node@24.19.2)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
- volar-service-css@0.0.70(@volar/language-service@2.4.28):
+ volar-service-css@0.0.71(@volar/language-service@2.4.30(typescript@6.0.3)):
dependencies:
vscode-css-languageservice: 6.3.10
- vscode-languageserver-textdocument: 1.0.12
- vscode-uri: 3.1.0
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-uri: 3.2.0
optionalDependencies:
- '@volar/language-service': 2.4.28
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
- volar-service-emmet@0.0.70(@volar/language-service@2.4.28):
+ volar-service-emmet@0.0.71(@volar/language-service@2.4.30(typescript@6.0.3)):
dependencies:
'@emmetio/css-parser': 0.4.1
'@emmetio/html-matcher': 1.3.0
'@vscode/emmet-helper': 2.11.0
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
optionalDependencies:
- '@volar/language-service': 2.4.28
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
- volar-service-html@0.0.70(@volar/language-service@2.4.28):
+ volar-service-html@0.0.71(@volar/language-service@2.4.30(typescript@6.0.3)):
dependencies:
vscode-html-languageservice: 5.6.2
- vscode-languageserver-textdocument: 1.0.12
- vscode-uri: 3.1.0
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-uri: 3.2.0
optionalDependencies:
- '@volar/language-service': 2.4.28
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
- volar-service-prettier@0.0.70(@volar/language-service@2.4.28)(prettier@3.8.3):
+ volar-service-prettier@0.0.71(@volar/language-service@2.4.30(typescript@6.0.3))(prettier@3.9.10):
dependencies:
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
optionalDependencies:
- '@volar/language-service': 2.4.28
- prettier: 3.8.3
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
+ prettier: 3.9.10
- volar-service-typescript-twoslash-queries@0.0.70(@volar/language-service@2.4.28):
+ volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.30(typescript@6.0.3)):
dependencies:
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
optionalDependencies:
- '@volar/language-service': 2.4.28
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
- volar-service-typescript@0.0.70(@volar/language-service@2.4.28):
+ volar-service-typescript@0.0.71(@volar/language-service@2.4.30(typescript@6.0.3)):
dependencies:
path-browserify: 1.0.1
semver: 7.8.5
typescript-auto-import-cache: 0.3.6
- vscode-languageserver-textdocument: 1.0.12
+ vscode-languageserver-textdocument: 1.0.16
vscode-nls: 5.2.0
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
optionalDependencies:
- '@volar/language-service': 2.4.28
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
- volar-service-yaml@0.0.70(@volar/language-service@2.4.28):
+ volar-service-yaml@0.0.71(@volar/language-service@2.4.30(typescript@6.0.3)):
dependencies:
- vscode-uri: 3.1.0
- yaml-language-server: 1.20.0
+ vscode-uri: 3.2.0
+ yaml-language-server: 1.23.0
optionalDependencies:
- '@volar/language-service': 2.4.28
+ '@volar/language-service': 2.4.30(typescript@6.0.3)
vscode-css-languageservice@6.3.10:
dependencies:
'@vscode/l10n': 0.0.18
- vscode-languageserver-textdocument: 1.0.12
+ vscode-languageserver-textdocument: 1.0.16
vscode-languageserver-types: 3.17.5
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
vscode-html-languageservice@5.6.2:
dependencies:
'@vscode/l10n': 0.0.18
- vscode-languageserver-textdocument: 1.0.12
- vscode-languageserver-types: 3.17.5
- vscode-uri: 3.1.0
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-languageserver-types: 3.18.5
+ vscode-uri: 3.2.0
vscode-json-languageservice@4.1.8:
dependencies:
jsonc-parser: 3.3.1
- vscode-languageserver-textdocument: 1.0.12
- vscode-languageserver-types: 3.17.5
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-languageserver-types: 3.18.5
vscode-nls: 5.2.0
- vscode-uri: 3.1.0
+ vscode-uri: 3.2.0
+
+ vscode-jsonrpc@10.0.0: {}
vscode-jsonrpc@8.2.0: {}
@@ -6964,88 +6498,91 @@ snapshots:
vscode-jsonrpc: 8.2.0
vscode-languageserver-types: 3.17.5
- vscode-languageserver-textdocument@1.0.12: {}
+ vscode-languageserver-protocol@3.18.5:
+ dependencies:
+ vscode-jsonrpc: 10.0.0
+ vscode-languageserver-types: 3.18.5
+
+ vscode-languageserver-textdocument@1.0.16: {}
vscode-languageserver-types@3.17.5: {}
+ vscode-languageserver-types@3.18.5: {}
+
vscode-languageserver@9.0.1:
dependencies:
vscode-languageserver-protocol: 3.17.5
vscode-nls@5.2.0: {}
- vscode-uri@3.1.0: {}
+ vscode-uri@3.2.0: {}
- vue-component-type-helpers@3.3.7: {}
+ vue-component-type-helpers@3.3.13: {}
- vue-demi@0.14.10(vue@3.5.39(typescript@5.9.3)):
+ vue-demi@0.14.10(vue@3.5.44(typescript@6.0.3)):
dependencies:
- vue: 3.5.39(typescript@5.9.3)
+ vue: 3.5.44(typescript@6.0.3)
- vue-sonner@1.3.2: {}
+ vue-sonner@2.0.9: {}
- vue@3.5.39(typescript@5.9.3):
+ vue@3.5.44(typescript@6.0.3):
dependencies:
- '@vue/compiler-dom': 3.5.39
- '@vue/compiler-sfc': 3.5.39
- '@vue/runtime-dom': 3.5.39
- '@vue/server-renderer': 3.5.39(vue@3.5.39(typescript@5.9.3))
- '@vue/shared': 3.5.39
+ '@vue/compiler-dom': 3.5.44
+ '@vue/compiler-sfc': 3.5.44
+ '@vue/runtime-dom': 3.5.44
+ '@vue/server-renderer': 3.5.44
+ '@vue/shared': 3.5.44
optionalDependencies:
- typescript: 5.9.3
+ typescript: 6.0.3
w3c-keyname@2.2.8: {}
web-namespaces@2.0.1: {}
- web-worker@1.5.0: {}
+ webpack-virtual-modules@0.6.2: {}
- wrap-ansi@7.0.0:
+ wrap-ansi@9.0.2:
dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.2.0
xxhash-wasm@1.1.0: {}
y18n@5.0.8: {}
- yaml-language-server@1.20.0:
+ yaml-language-server@1.23.0:
dependencies:
'@vscode/l10n': 0.0.18
ajv: 8.20.0
ajv-draft-04: 1.0.0(ajv@8.20.0)
- prettier: 3.8.3
+ ajv-i18n: 4.2.0(ajv@8.20.0)
+ prettier: 3.9.10
request-light: 0.5.8
vscode-json-languageservice: 4.1.8
vscode-languageserver: 9.0.1
- vscode-languageserver-textdocument: 1.0.12
- vscode-languageserver-types: 3.17.5
- vscode-uri: 3.1.0
- yaml: 2.7.1
+ vscode-languageserver-textdocument: 1.0.16
+ vscode-languageserver-types: 3.18.5
+ vscode-uri: 3.2.0
+ yaml: 2.8.3
- yaml@2.7.1: {}
+ yaml@2.8.3: {}
- yaml@2.9.0: {}
-
- yargs-parser@21.1.1: {}
+ yaml@2.9.1: {}
yargs-parser@22.0.0: {}
- yargs@17.7.2:
+ yargs@18.2.0:
dependencies:
- cliui: 8.0.1
+ cliui: 9.0.1
escalade: 3.2.0
get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
+ string-width: 8.3.0
y18n: 5.0.8
- yargs-parser: 21.1.1
+ yargs-parser: 22.0.0
yocto-queue@1.2.2: {}
- zod@4.4.3: {}
-
- zod@4.6.5: {}
+ zod@4.6.7: {}
zwitch@2.0.4: {}
diff --git a/scripts/check-external-links.mjs b/scripts/check-external-links.mjs
index 80eb2ac..481198b 100644
--- a/scripts/check-external-links.mjs
+++ b/scripts/check-external-links.mjs
@@ -50,7 +50,12 @@ export async function fetchStatus(url, { timeoutMs = 20000, fetchImpl = fetch }
const res = await fetchImpl(url, {
redirect: "follow",
signal: AbortSignal.timeout(timeoutMs),
- headers: { "User-Agent": "odal-node-link-check (+https://github.com/odal-node/dpp-web)" },
+ headers: {
+ "User-Agent": "odal-node-link-check (+https://github.com/odal-node/dpp-web)",
+ // Ask for a page the way a browser does. crates.io answers 404 to a
+ // request that does not accept text/html, and a reader's click does.
+ Accept: "text/html,application/xhtml+xml,*/*;q=0.8",
+ },
});
await res.body?.cancel();
return res.status;
diff --git a/scripts/check-external-links.test.mjs b/scripts/check-external-links.test.mjs
index 07b30af..6647990 100644
--- a/scripts/check-external-links.test.mjs
+++ b/scripts/check-external-links.test.mjs
@@ -53,3 +53,20 @@ test("a real request: redirects are followed, a missing page is a 404, a stalled
server.close();
}
});
+
+test("a page that only answers a request for HTML is not reported broken", async () => {
+ // crates.io does this: a crate page answers 404 unless the request accepts
+ // text/html, so a checker that does not ask for HTML reports a live page gone.
+ const server = createServer((req, res) => {
+ const wantsHtml = (req.headers.accept ?? "").includes("text/html");
+ res.writeHead(wantsHtml ? 200 : 404).end();
+ });
+ await new Promise((r) => server.listen(0, "127.0.0.1", r));
+ const base = `http://127.0.0.1:${server.address().port}`;
+ try {
+ assert.equal(await fetchStatus(`${base}/crates/dpp-domain`), 200);
+ } finally {
+ server.closeAllConnections();
+ server.close();
+ }
+});
diff --git a/scripts/check-links.mjs b/scripts/check-links.mjs
index 24d623a..26d5923 100644
--- a/scripts/check-links.mjs
+++ b/scripts/check-links.mjs
@@ -13,6 +13,8 @@
// * Cross-site links are resolved against the *other* site's build. A link
// from the docs to odal-node.io/roadmap is invisible to either site's own
// tooling, which is exactly how that one survived.
+// * A `#fragment` must name an id on the page it lands on, so a reworded
+// heading cannot leave its old anchor links pointing at nothing.
//
// Usage: node scripts/check-links.mjs
import { readdirSync, readFileSync, existsSync, statSync } from 'node:fs';
@@ -33,17 +35,41 @@ const walk = (dir, out = []) => {
};
// A published path resolves if it names a real file, or a directory holding an
-// index.html — the two shapes Astro's static output emits.
-const resolves = (dist, path) => {
+// index.html: the two shapes Astro's static output emits. Returns that file,
+// or null.
+const resolveFile = (dist, path) => {
const clean = decodeURI(path.split('#')[0].split('?')[0]);
- if (clean === '' || clean === '/') return existsSync(join(dist, 'index.html'));
- const base = join(dist, clean);
- if (extname(clean)) return existsSync(base);
- return existsSync(join(base, 'index.html')) || existsSync(`${base}.html`);
+ const candidates =
+ clean === '' || clean === '/'
+ ? [join(dist, 'index.html')]
+ : extname(clean)
+ ? [join(dist, clean)]
+ : [join(dist, clean, 'index.html'), `${join(dist, clean)}.html`];
+ return candidates.find((c) => existsSync(c)) ?? null;
+};
+
+// A fragment resolves if the page it lands on has an element with that id. A
+// renamed heading changes its id, and the link to it still finds the page, so
+// a path-only check passes it while the reader lands at the top. Pages whose
+// anchors exist only after a script runs are listed here and skipped.
+const SCRIPT_ANCHORED = new Set([join('site/dpp-docs/dist', 'api', 'index.html')]);
+const idCache = new Map();
+const idsOf = (file) => {
+ if (!idCache.has(file)) {
+ const html = readFileSync(file, 'utf8').replace(//g, '');
+ idCache.set(file, new Set([...html.matchAll(/\s(?:id|name)="([^"]+)"/g)].map((m) => m[1])));
+ }
+ return idCache.get(file);
+};
+const fragmentOf = (attr) => {
+ const hash = attr.indexOf('#');
+ if (hash === -1 || hash === attr.length - 1) return null;
+ return decodeURIComponent(attr.slice(hash + 1));
};
const broken = [];
let linkCount = 0;
+let anchorCount = 0;
let pageCount = 0;
for (const site of SITES) {
@@ -65,6 +91,17 @@ for (const site of SITES) {
let target = null;
let dist = site.dist;
+ if (attr.startsWith('#')) {
+ // An anchor on this page: only the fragment can be wrong.
+ const fragment = fragmentOf(attr);
+ if (fragment === null) continue;
+ anchorCount += 1;
+ if (!idsOf(file).has(fragment)) {
+ broken.push({ from: relative(process.cwd(), file), target: attr });
+ }
+ continue;
+ }
+
if (attr.startsWith('/')) {
target = attr;
} else {
@@ -75,18 +112,29 @@ for (const site of SITES) {
}
}
- // Anchors, mailto:, and third-party origins are out of scope.
+ // mailto: and third-party origins are out of scope.
if (target === null) continue;
linkCount += 1;
- if (!resolves(dist, target)) {
+ const landed = resolveFile(dist, target);
+ if (landed === null) {
broken.push({ from: relative(process.cwd(), file), target: attr });
+ continue;
+ }
+ const fragment = fragmentOf(target);
+ if (fragment !== null && extname(landed) === '.html' && !SCRIPT_ANCHORED.has(landed)) {
+ anchorCount += 1;
+ if (!idsOf(landed).has(fragment)) {
+ broken.push({ from: relative(process.cwd(), file), target: attr });
+ }
}
}
}
}
if (broken.length === 0) {
- console.log(`link check: ${linkCount} internal links across ${pageCount} pages, all resolve.`);
+ console.log(
+ `link check: ${linkCount} internal links and ${anchorCount} anchors across ${pageCount} pages, all resolve.`,
+ );
process.exit(0);
}
diff --git a/site/dpp-docs/astro.config.mjs b/site/dpp-docs/astro.config.mjs
index 0318616..428ca0e 100644
--- a/site/dpp-docs/astro.config.mjs
+++ b/site/dpp-docs/astro.config.mjs
@@ -114,7 +114,7 @@ export default defineConfig({
'@id': 'https://odal-node.io/#core',
name: 'Odal Node core library (dpp-core)',
description:
- 'The open-source Rust library Odal Node is built on: the EU Digital Product Passport model and its versioned schemas, validation and product-group rules, signing and verification, GS1 Digital Link parsing, the Asset Administration Shell export and the EU registry types. Apache-2.0; anyone may use it.',
+ 'The open-source Rust library Odal Node is built on: the EU Digital Product Passport model and its versioned schemas, validation and product-group rules, signing and verification, product identifiers and their digital links (GS1 Digital Link, identification link, DID), the Asset Administration Shell export and the EU registry types. Apache-2.0; anyone may use it.',
codeRepository: 'https://github.com/odal-node/dpp-core',
programmingLanguage: 'Rust',
license: 'https://www.apache.org/licenses/LICENSE-2.0',
diff --git a/site/dpp-docs/openapi-source.json b/site/dpp-docs/openapi-source.json
index 81c1878..9104015 100644
--- a/site/dpp-docs/openapi-source.json
+++ b/site/dpp-docs/openapi-source.json
@@ -3,5 +3,5 @@
"_path_comment": "MUST be the bundled single-file spec, never api/openapi.yaml. The engine authors its description as a tree (a root of $refs plus paths/ and components/) and commits api/openapi.bundled.yaml as the single-file form every consumer reads — committed precisely so this vendoring step can read one blob out of git history. This pin still named the root after that split, so a sync would have copied 278 lines of relative `$ref: paths/...` pointers over the vendored spec; nothing here resolves them, and the rendered docs would have lost every endpoint and schema.",
"repository": "odal-node/dpp-engine",
"path": "api/openapi.bundled.yaml",
- "commit": "04f1a527d3cfba3ff25e45c171b9d16558366a46"
+ "commit": "22f8d8b46f9bb12d477389b666707042d9db5e8c"
}
diff --git a/site/dpp-docs/package.json b/site/dpp-docs/package.json
index 29137d8..cf0c9c0 100644
--- a/site/dpp-docs/package.json
+++ b/site/dpp-docs/package.json
@@ -14,15 +14,15 @@
"check:openapi": "node scripts/sync-openapi.mjs --check"
},
"dependencies": {
- "@astrojs/sitemap": "^3.7.3",
- "@astrojs/starlight": "^0.41.7",
+ "@astrojs/sitemap": "^3.7.4",
+ "@astrojs/starlight": "^0.42.7",
"@odal/brand-tokens": "workspace:*",
- "@scalar/api-reference": "^1.62.5",
- "astro": "^7.3.5",
- "vue": "^3.5.39"
+ "@scalar/api-reference": "^1.76.0",
+ "astro": "^7.4.2",
+ "vue": "^3.5.44"
},
"devDependencies": {
- "@astrojs/check": "^0.9",
- "typescript": "^5"
+ "@astrojs/check": "^0.9.12",
+ "typescript": "^6.0.3"
}
}
diff --git a/site/dpp-docs/public/openapi.yaml b/site/dpp-docs/public/openapi.yaml
index 3b830cf..a598a3e 100644
--- a/site/dpp-docs/public/openapi.yaml
+++ b/site/dpp-docs/public/openapi.yaml
@@ -1,29 +1,28 @@
openapi: 3.1.0
info:
title: Odal Node API
- version: 0.14.0
+ version: 0.15.0
description: |
- **Sovereign Digital Product Passport Infrastructure**
-
- The Odal API is split across two deployable services:
-
- - **Node** (`http://localhost:8001`) — the MVP service that bundles vault,
- identity, and integrator on a single port with sub-path routing:
- `/vault/*`, `/identity/*`, `/integrator/*`.
- - **Resolver** (`http://localhost:8003`) — standalone public resolver for
- QR code scans and supply-chain integrations. Unauthenticated.
-
- All authenticated vault endpoints are versioned under `/vault/api/v1/`.
- Path parameters use OpenAPI 3.1 `{id}` brace syntax (aligned with
- Axum 0.8 routing).
-
- Authentication uses `Authorization: Bearer odal_sk_...` API keys (SHA-256
- hashed, prefix-indexed) or HTTP Basic auth for local development.
-
- Regulation references:
- - EU Ecodesign for Sustainable Products Regulation (ESPR) 2024/1781
- - EU Battery Regulation 2023/1542
- - W3C DID Core Spec 1.0 / W3C VC Data Model 2.0
+ The HTTP API of a self-hosted Odal Node: create, validate, sign, publish and
+ serve EU Digital Product Passports. Pre-production: the API can still change
+ between minor versions.
+
+ Two deployables serve it:
+
+ - **Node** (`http://localhost:8001`): one process with three route groups,
+ `/vault/*` (passport lifecycle), `/identity/*` (`did:web` document) and
+ `/integrator/*` (CSV/XLSX import).
+ - **Resolver** (`http://localhost:8003`): the public, unauthenticated reader
+ that GS1 Digital Link scans land on.
+
+ Authenticated vault routes are under `/vault/api/v1/`. Send an API key as
+ `Authorization: Bearer odal_sk_...`; each key has the scope `read`, `write`
+ or `admin`. The local admin credential (HTTP Basic) exists to mint the first
+ key. Errors are RFC 9457 problem documents.
+
+ Regulations implemented: Regulation (EU) 2024/1781 (ESPR) and Regulation
+ (EU) 2023/1542 (batteries). Identity follows W3C DID Core 1.0 and the W3C
+ Verifiable Credentials Data Model 2.0.
contact:
name: Odal Support
email: contact@odal-node.io
@@ -34,22 +33,22 @@ info:
x-legal-entity: Odal Node
servers:
- url: http://localhost:8001
- description: Local development — odal-node (vault + identity public + integrator)
+ description: 'Local development: the node (vault, public identity routes, integrator)'
- url: http://localhost:8002
- description: Local development — odal-identity (standalone; hosts the mTLS internal signing surface)
+ description: 'Local development: the standalone identity service (hosts the mTLS internal signing surface)'
- url: http://localhost:8003
- description: Local development — odal-resolver (public)
+ description: 'Local development: the public resolver'
tags:
- name: DPP Management
description: Create, read, update, list, and audit Digital Product Passports.
- name: DPP Lifecycle
- description: Lifecycle transitions — publish, suspend, retire, end-of-life, and transfer of responsibility.
+ description: 'Lifecycle transitions: publish, suspend, retire, end of life, and transfer of responsibility.'
- name: Evidence Dossiers
- description: Signed, self-contained evidence dossiers — generate, fetch, and verify (stored or uploaded) offline, with zero trust in the issuing node.
+ description: 'Signed, self-contained evidence dossiers: generate, fetch and verify (stored or uploaded) offline, with zero trust in the issuing node.'
- name: Registry
- description: EU-registry registration state — per-passport and operator-wide, plus the operator's verified-registry standing.
+ description: EU registry registration state, per passport and operator-wide, plus the operator's verified-registry standing.
- name: Scan Telemetry
- description: Aggregate, privacy-safe resolution counts — per-passport and operator-wide rollups.
+ description: Aggregate resolution counts with no per-person data, per passport and operator-wide rollups.
- name: Operator
description: Operator configuration (branding, legal info, retention policy).
- name: Facilities
@@ -57,31 +56,33 @@ tags:
- name: Operator Identifiers
description: Economic-operator identifiers (ESPR Art. 13) stamped onto new passports.
- name: API Keys
- description: API key management — create, list, revoke.
+ description: 'API key management: create, list, revoke.'
- name: Webhooks
- description: Signed outbound event delivery — subscribe, list, remove, test.
+ description: 'Signed outbound event delivery: subscribe, list, remove, test.'
+ - name: Personal Data
+ description: Erasing the records a passport's `personalData` statements name. A record is held outside the passport so it can be erased, and no route reads one.
- name: Plugins
- description: Signed product-group plugin hot-install — verify, persist, hot-swap (admin-only).
+ description: 'Signed product group plugin installation: verify, persist, hot-swap (admin-only).'
- name: Ruleset
- description: Compliance Current — the signed, versioned ruleset channel. Re-read it and hot-swap a verified bundle without a node restart (admin-only).
+ description: The signed, versioned ruleset channel. Re-read it and hot-swap a verified bundle without a node restart (admin-only).
- name: Node
description: Node setup state, and what credential the caller presented. `/whoami` reports only what the request already carried; it is not a lookup.
- name: Public (Vault)
description: Unauthenticated vault endpoints for inter-service communication.
- name: Credentialed Access
- description: Audience-scoped passport reads authenticated by a verifiable credential rather than an API key — repairers, market-surveillance authorities. Deliberately outside both `/public` (a public URL whose body varies by caller breaks caching and the meaning of `publicJwsSignature`) and `/api/v1` (API keys are the operator's own machine access; a repairer or authority holds a credential and no key).
+ description: 'Audience-scoped passport reads authenticated by a verifiable credential rather than an API key: repairers, market surveillance authorities. Deliberately outside both `/public` (a public URL whose body varies by caller breaks caching and the meaning of `publicJwsSignature`) and `/api/v1` (API keys are the operator''s own machine access; a repairer or authority holds a credential and no key).'
- name: Vault (internal)
description: mTLS service-to-service telemetry ingestion (resolver → vault only).
- name: Integrator
- description: CSV/XLSX bulk import — product groups, their versioned JSON Schemas, templates, upload, and async job polling.
+ description: 'CSV/XLSX bulk import: product groups, their versioned JSON Schemas, templates, upload, and async job polling.'
- name: Identity
- description: Public did:web identity — DID document, health, readiness. On the fused node these are served under `/identity/*`. The standalone identity service (:8002) serves them at the root — `/health`, `/ready`, `/.well-known/did.json`.
+ description: 'Public did:web identity: DID document, health, readiness. On the fused node these are served under `/identity/*`, and the DID document also at the root, `/.well-known/did.json`, where the did:web method resolves the node''s DID. The standalone identity service (:8002) serves them at the root: `/health`, `/ready`, `/.well-known/did.json`.'
- name: Identity (internal)
- description: mTLS service-to-service signing/rotation. **Not exposed by the fused node**, which signs in-process — reachable only on the standalone identity service, and only from a client presenting `CN=odal-vault`.
+ description: mTLS service-to-service signing/rotation. **Not exposed by the fused node**, which signs in-process. Reachable only on the standalone identity service, and only from a client presenting `CN=odal-vault`.
- name: Public Resolver
description: Unauthenticated public endpoints for QR scan resolution.
- name: Health
- description: Health and readiness probes, plus the vault's build metadata — every deployable's unauthenticated liveness surface in one place.
+ description: 'Health and readiness probes, plus the vault''s build metadata: every deployable''s unauthenticated liveness surface in one place.'
paths:
/vault/api/v1/dpp:
post:
@@ -137,7 +138,31 @@ paths:
'403':
$ref: '#/components/responses/Forbidden'
'409':
- $ref: '#/components/responses/IdempotentRequestInFlight'
+ description: |
+ One of two conflicts, told apart by the problem document.
+
+ **An earlier attempt carrying this `Idempotency-Key` is still running.**
+ Returned instead of letting a duplicate execute alongside it. Retry
+ shortly with the same key and the same body; `Retry-After` carries the
+ suggested delay. A claim left behind by a process that died mid-request
+ is reclaimed automatically after 60 seconds, so this can never wedge a
+ key permanently.
+
+ **`carrierSerial` is already attributed to another passport under the
+ same GTIN.** `errors[0].field` is `/carrierSerial`. A label that names
+ two passports resolves to neither: choose another serial, or declare
+ this passport as the successor of the one that holds it with
+ `supersedesId`.
+ headers:
+ Retry-After:
+ description: Seconds to wait before retrying. Sent for the idempotency conflict only.
+ schema:
+ type: integer
+ minimum: 1
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
'422':
$ref: '#/components/responses/ValidationError'
/vault/api/v1/dpp/validate:
@@ -150,18 +175,27 @@ paths:
cannot disagree.
**Two verdicts, because create and publish deliberately differ.** Create is
- lenient about a product group with no resolvable JSON Schema — a draft is allowed
- to be incomplete — while publish fails closed on it, since a signed
+ lenient about a product group with no resolvable JSON Schema (a draft is allowed
+ to be incomplete) while publish fails closed on it, since a signed
passport must have passed a real schema check. A body can therefore be
creatable but not yet clear the publish-time schema gate, and that gap is
reported rather than hidden until publish is attempted.
- A body that create **would reject** gets back the identical `422` create
- would have returned, not a paraphrase of it. A body create would accept
+ A body that create **would reject** gets back the identical rejection create
+ would have returned, not a paraphrase of it: a `422`, or a `409` for a
+ `carrierSerial` another passport already holds. A body create would accept
returns `200` with the two verdicts.
+ The `422` includes the personal-data check. A field the product group's
+ schema marks as able to hold personal data that has a value and no
+ `personalData` statement, a statement about a field that is not marked, an
+ `outside` statement naming no record, and a basis a governing act does not
+ admit are all refused here as they are on create, each naming its field. The
+ check reads no store, so it is part of the preview. It never reads what a
+ field says.
+
**`productGroupDataValid` is not a publish verdict.** It reports one of publish's
- preconditions — the product group-data gates — and publish applies others this
+ preconditions (the product group-data gates) and publish applies others this
route does not run:
- the **registry identity** requirement (a default facility and a primary
@@ -198,6 +232,15 @@ paths:
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
+ '409':
+ description: |
+ `carrierSerial` is already attributed to another passport under the same
+ GTIN. The identical `409` create would have returned. `errors[0].field`
+ is `/carrierSerial`.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
'422':
$ref: '#/components/responses/ValidationError'
/vault/api/v1/dpps:
@@ -259,7 +302,7 @@ paths:
description: |
Look up a passport by exact (product group, product identifier, batch)
match, across `draft` and `active` statuses. Backs the import
- delta-matcher — not intended as a general-purpose search (use `GET /dpps`
+ delta-matcher, not intended as a general-purpose search (use `GET /dpps`
for that). `batchId` omitted matches only passports with no batch set.
tags:
- DPP Management
@@ -356,7 +399,13 @@ paths:
application/json:
schema:
type: object
- description: Free-form merge-patch. Supply only the fields being changed.
+ description: |
+ Free-form merge-patch. Supply only the fields being changed.
+
+ `carrierSerial` is fixed when the passport is created. A value other
+ than the serial the passport prints is refused with `422` naming
+ `/carrierSerial`, not ignored, because it is what the label carries.
+ The same value is accepted.
responses:
'200':
description: Updated DPP record.
@@ -382,7 +431,7 @@ paths:
summary: Get DPP audit history
description: |
Returns the chronological audit trail for a passport: creation,
- status transitions, field updates, etc. Unbounded — returns the full
+ status transitions, field updates, etc. Unbounded: returns the full
trail with no pagination or limit.
tags:
- DPP Management
@@ -415,16 +464,16 @@ paths:
operationId: getDppVersions
summary: List a DPP's archived versions, or reconstitute one
description: |
- Returns every archived version of a passport, oldest first — or, with
+ Returns every archived version of a passport, oldest first, or, with
`asOf`, the single version that was current at that instant.
✅ EN 18221:2026 clause 4.2: an authenticated, authorised reader can
retrieve the passport as it stood at any given moment.
- 🚨 **Not `POST /dpp/{dppId}/retire`.** That moves a passport to the terminal
+ **Not `POST /dpp/{dppId}/retire`.** That moves a passport to the terminal
`retired` lifecycle status after its retention period has elapsed. This is
- the standard's sense of the word — historical versions of a passport that is
- still live — and the two are unrelated.
+ the standard's sense of the word (historical versions of a passport that is
+ still live) and the two are unrelated.
Archiving begins at the **first change** to a passport, as the clause
requires, so a passport that has never changed has no archived versions and
@@ -459,9 +508,9 @@ paths:
`GET /dpp/{dppId}` already serves; this route does not return it, so
that "which version is this" stays answerable.
- the moment is **before the passport was created**, where nothing was
- its state — not an archived version, and not the live record either.
+ its state, not an archived version, and not the live record either.
- 🚨 The second case is a `404` rather than the initial version. Asking for
+ The second case is a `404` rather than the initial version. Asking for
a version at a time before the record existed is a question with no true
answer, and answering with the initial one would assert that the passport
existed then.
@@ -475,7 +524,7 @@ paths:
Always an array, with or without `asOf`: one response shape is simpler to consume than two, and a client that parses an array does not have to remember which query it sent to know what it is holding.
- An **empty** array is reachable only without `asOf`, and it says the passport has never changed — archiving begins at the first change, so there is nothing historical to return and the live record is the state at every moment so far. With `asOf`, a moment no archived version covers is a `404` rather than an empty array, because the answer there is the live record and this route deliberately does not serve it.
+ An **empty** array is reachable only without `asOf`, and it says the passport has never changed: archiving begins at the first change, so there is nothing historical to return and the live record is the state at every moment so far. With `asOf`, a moment no archived version covers is a `404` rather than an empty array, because the answer there is the live record and this route deliberately does not serve it.
content:
application/json:
schema:
@@ -500,16 +549,16 @@ paths:
summary: Re-check plausibility-lint findings
description: |
Recomputes the plausibility lint and persists the refreshed `lintResult`
- (pack version, findings, assessed-at timestamp). Findings are non-binding —
- arithmetic and physical-plausibility checks distinct from binding
- compliance rules — and never gate publish or any other transition.
+ (pack version, findings, assessed-at timestamp). Findings are non-binding
+ (arithmetic and physical-plausibility checks distinct from binding
+ compliance rules) and never gate publish or any other transition.
Two sets of checks run. The `dpp-rules` plausibility **pack** runs against
the DPP's current product group data, and `packVersion` names its version.
The **envelope** checks run against fields every product group carries, so
they apply to a DPP with no product group data at all: today that is
`lineage.life_status_unsupported`, which reports a `lifeStatus` that the
- record's own `derivedFrom` edges do not support — a unit claiming
+ record's own `derivedFrom` edges do not support: a unit claiming
`remanufactured` whose only edge says `repurposing`, or an `original` that
claims a predecessor at all.
@@ -533,7 +582,7 @@ paths:
`publishReadiness.passportScope` answers a different question from the
blockers: whether Art. 77(1) requires a battery passport for this record at
all. The Regulation defines five battery categories and that article reaches
- three — LMT, electric-vehicle, and industrial above 2 kWh — so a portable or
+ three (LMT, electric-vehicle, and industrial above 2 kWh) so a portable or
SLI passport is voluntary. This node applies the content gate either way,
which for a voluntary passport is stricter than the article requires; the
`note` says so rather than leaving the caller to wonder why they are being
@@ -553,7 +602,7 @@ paths:
'200':
description: |
Lint findings refreshed. Returns the full passport record, plus
- `publishReadiness` — whether this passport would clear the publish gates
+ `publishReadiness`: whether this passport would clear the publish gates
that can be answered without attempting the transition.
content:
application/json:
@@ -632,12 +681,12 @@ paths:
its own records: `sealedPayloadHash` is the digest it asked the backend
to seal, so a passport re-published after sealing shows as `superseded`
without any AdES tooling. That is a record of what was requested, not
- proof of what the CAdES covers — the validator's extracted message
+ proof of what the CAdES covers: the validator's extracted message
digest is the cross-check. A `superseded` seal remains valid for the
signature it does cover; a seal over the new signature has not landed
yet.
- `404` when the passport has no seal — it may be unpublished, its seal may
+ `404` when the passport has no seal: it may be unpublished, its seal may
still be queued, or the node may have no QTSP configured. An unsealed
passport has no seal resource rather than an empty one.
tags:
@@ -673,7 +722,7 @@ paths:
refuses unless it demonstrably is.
**This buys a second seal for a digest already paid for.** The node's own
- repair sweep deliberately cannot do that — it only queues passports
+ repair sweep deliberately cannot do that: it only queues passports
carrying *no seal at all*, which is what lets it run unattended without
spending money twice. A broken seal is the case where spending it again is
right: the row was paid for and carries nothing, so the passport is
@@ -748,22 +797,28 @@ paths:
How many published passports carry no seal, plus the outbox totals
behind that number.
+ `unsealedPublished` counts the live ones and `unsealedTerminal` the ones
+ that have since been retired, superseded or deactivated. Terminal
+ passports still serve publicly and still owe a seal, so the repair sweep
+ seals them; they are counted apart so that the number to act on is not
+ padded with records whose product ended long ago.
+
`unsealedPublished` is the headline; the three row counts are context.
They answer different questions and can legitimately disagree: the
counts describe outbox **rows**, while the obligation is about
**passports**. Enqueueing happens after the publish commits, so a crash
- in that window publishes a passport that no row will ever cover —
+ in that window publishes a passport that no row will ever cover:
`pending: 0, exhausted: 0` is therefore consistent with any number of
unsealed passports, and a summary built on rows alone would report all
clear. A repair sweep queues those passports on its next pass.
A passport whose seal covers a *superseded* signature is not counted
- here — it carries a seal, and that seal remains a valid attestation of
+ here: it carries a seal, and that seal remains a valid attestation of
the signature it was bought for. `GET /vault/api/v1/dpp/{dppId}/seal`
reports that case per passport as `coverage`.
When `sealingConfigured` is `false` no seal provider is selected, so
- every count is `0` because this node has no outbox — not because it has
+ every count is `0` because this node has no outbox, not because it has
nothing outstanding.
tags:
- DPP Management
@@ -787,16 +842,23 @@ paths:
Transition a DPP from `draft` to `active`.
On success:
- 1. `qrCodeUrl` is set to the passport's GS1 Digital Link carrier —
+ 1. `qrCodeUrl` is set to the passport's GS1 Digital Link carrier:
`{resolverBase}/01/{gtin}/21/{serial}` for a trade item, else
`{resolverBase}/dpp/{id}`
2. The identity service signs the VC payload with Ed25519 (best-effort;
- signing failure does not block publish — `jwsSignature` may be null)
+ signing failure does not block publish: `jwsSignature` may be null)
3. `retentionLocked` is set to `true` permanently
4. `status` = `active`, `publishedAt` = now
5. A `dpp.published` NATS event is emitted (fire-after-commit)
No request body is required.
+
+ Refused with `422` naming `/carrierSerial` when another published passport
+ already prints the same carrier serial under the same GTIN and is not in
+ this one's amendment chain. Create refuses that too, but two creates that
+ arrive together can both pass it; this is where the label goes live, so
+ the second to publish stays a draft rather than making one label name two
+ passports.
tags:
- DPP Lifecycle
security:
@@ -832,9 +894,9 @@ paths:
operationId: amendDpp
summary: Amend a published DPP by issuing a successor
description: |
- Correct a published DPP. A published passport cannot be edited in place —
- its signatures commit to its bytes and the retention guard refuses the
- write — so this issues a **new** passport instead.
+ Correct a published DPP. A published passport cannot be edited in place
+ (its signatures commit to its bytes and the retention guard refuses the
+ write) so this issues a **new** passport instead.
The successor is a copy of `dppId` with the `patch` applied, carrying
`supersedesId` back to `dppId` and `version` incremented. It goes through
@@ -879,8 +941,8 @@ paths:
responses:
'201':
description: |
- Successor published and predecessor superseded. Returns the **successor**
- — a different record from the one named in the path, with its own `id`,
+ Successor published and predecessor superseded. Returns the **successor**:
+ a different record from the one named in the path, with its own `id`,
`version` incremented, and `supersedesId` set to `dppId`.
content:
application/json:
@@ -907,13 +969,13 @@ paths:
replacement named in `supersededBy`.
**The link is checked here, not written.** The successor must already carry
- `supersedesId` pointing back at this passport, set when it was created —
+ `supersedesId` pointing back at this passport, set when it was created:
`supersedesId` is a protected field and no field patch can add it later. A
successor that does not declare the link is refused with `422`.
That ordering is deliberate. Writing the link during this transition would
leave, on a failure between the two writes, a retired passport with nothing
- pointing at its replacement — the one state a reader cannot recover from.
+ pointing at its replacement: the one state a reader cannot recover from.
Requiring the link to exist first makes that unreachable.
**Both must already be published.** A draft successor retiring a live
@@ -1017,7 +1079,7 @@ paths:
Retired DPPs are immutable and retained for regulatory record-keeping.
No request body is required.
- 🚨 **Not archiving.** EN 18221 clause 4.2 archiving is the retention of
+ **Not archiving.** EN 18221 clause 4.2 archiving is the retention of
historical versions of a passport that is still live, and it is served by
`GET /dpp/{dppId}/versions`. This route ends a record's publication life.
tags:
@@ -1056,7 +1118,7 @@ paths:
summary: Declare a DPP end-of-life
description: |
Transition a `published` or `suspended` DPP to `deactivated`
- (terminal). The record is retained, never deleted — the passport
+ (terminal). The record is retained, never deleted: the passport
outlives the product. Destruction (`reason.kind: destroyed`) is only
lawful with a recognised derogation from the unsold-goods destruction
ban (ESPR Art. 25 delegated act).
@@ -1174,7 +1236,7 @@ paths:
$ref: '#/components/responses/Forbidden'
'404':
description: |
- This DPP has no transfer chain at all — no handover has ever been
+ This DPP has no transfer chain at all: no handover has ever been
initiated for it. A chain that exists but carries nothing pending is a
`422`, not this.
content:
@@ -1204,7 +1266,7 @@ paths:
counterparty went silent could never be transferred again.
**This records an outcome, not who caused it.** A node serves one operator,
- and the only credentials it accepts are that operator's — the incoming
+ and the only credentials it accepts are that operator's: the incoming
operator holds no key here and cannot call this route. So reject and cancel
are both initiated by *this* node's operator; they differ in the outcome
written to the record and in the states core permits them from, not in who
@@ -1235,7 +1297,7 @@ paths:
$ref: '#/components/responses/Forbidden'
'404':
description: |
- This DPP has no transfer chain at all — no handover has ever been
+ This DPP has no transfer chain at all: no handover has ever been
initiated for it. A chain that exists but carries nothing pending is a
`422`, not this.
content:
@@ -1259,7 +1321,7 @@ paths:
becomes terminal and the passport's transfer chain is free to carry a new
handover.
- **This records an outcome, not who caused it** — see reject, which is the
+ **This records an outcome, not who caused it**: see reject, which is the
same call with a different outcome written to the record.
Core permits a cancel from one state more than a reject: `Accepted` as well
@@ -1294,7 +1356,7 @@ paths:
$ref: '#/components/responses/Forbidden'
'404':
description: |
- This DPP has no transfer chain at all — no handover has ever been
+ This DPP has no transfer chain at all: no handover has ever been
initiated for it. A chain that exists but carries nothing pending is a
`422`, not this.
content:
@@ -1314,14 +1376,14 @@ paths:
operationId: generateDppEvidence
summary: Generate and store a signed evidence dossier
description: |
- Assembles a self-contained, signed dossier proving a passport's full
- proof chain — both JWS signatures, DID document snapshots, the
- hash-chained audit trail, and (when present) the transfer chain and
- end-of-life record — and persists it. See
+ Assembles and persists a self-contained, signed dossier proving a
+ passport's full proof chain: both JWS signatures, DID document snapshots,
+ the hash-chained audit trail, and, when present, the transfer chain and the
+ end-of-life record. See
`docs/architecture/EVIDENCE-DOSSIER.md` for the complete format
specification.
- Authenticated tier only — the dossier's `fullView` member carries
+ Authenticated tier only: the dossier's `fullView` member carries
full-view (non-redacted) passport data. Requires the passport to have
been published at least once; a draft has no signature to export.
tags:
@@ -1359,7 +1421,7 @@ paths:
description: |
Every evidence dossier generated for this passport, newest first.
- Summaries only — each row carries the dossier's id, when it was generated
+ Summaries only: each row carries the dossier's id, when it was generated
and what it covers, but not the document itself. Dossiers embed full-view
passport data and both signature chains, so they are large and are fetched
one at a time through `GET /api/v1/evidence/{id}`.
@@ -1370,7 +1432,7 @@ paths:
superseded by anything else here, which is why the list is not filtered
down to a latest.
- Empty for a passport that has never been published — there is no signature
+ Empty for a passport that has never been published: there is no signature
to attest to before then.
tags:
- Evidence Dossiers
@@ -1402,7 +1464,7 @@ paths:
get:
operationId: getEvidenceDossier
summary: Fetch one stored dossier's document
- description: Returns the dossier document itself — the same shape `POST .../evidence` returns on generation, not the summary wrapper the list endpoint shows.
+ description: 'Returns the dossier document itself: the same shape `POST .../evidence` returns on generation, not the summary wrapper the list endpoint shows.'
tags:
- Evidence Dossiers
security:
@@ -1432,7 +1494,7 @@ paths:
summary: Verify a stored dossier
description: |
An integrity check against the stored dossier's own signatures and
- hash chains. A tamper is still a `200` response — the report's
+ hash chains. A tamper is still a `200` response: the report's
`checks` name which check failed.
tags:
- Evidence Dossiers
@@ -1483,7 +1545,7 @@ paths:
'401':
$ref: '#/components/responses/Unauthorized'
'422':
- description: Not a valid dossier — malformed JSON or an unrecognised field.
+ description: Not a valid dossier (malformed JSON or an unrecognised field).
/vault/api/v1/dpp/{dppId}/registry:
get:
operationId: getDppRegistryStatus
@@ -1493,7 +1555,7 @@ paths:
any handover notifications, and who is responsible for it now.
Registration is the legal obligation the rest of the system exists to
- discharge, and this is where an operator sees whether it has been —
+ discharge, and this is where an operator sees whether it has been:
the state otherwise lives only in outbox tables, metrics and log lines.
**Absent is not zero.** A deployment without the registry queues reports
@@ -1523,6 +1585,251 @@ paths:
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
+ /vault/api/v1/dpp/{dppId}/registry/handle:
+ post:
+ operationId: recordDppRegistryHandle
+ summary: Record the registry's handle for a submission this node lost it for
+ description: |
+ Records the correlation identifier of a passport's registry submission, for a
+ registration that is waiting for a person.
+
+ The node's drain recovers a lost handle itself where it can, by the unique
+ product identifier the passport was submitted under. It leaves three cases
+ alone, because choosing would give a passport another passport's
+ registration: several submissions report the identifier, none could be
+ placed, and an adapter that cannot look a submission up. A row in one of them
+ stays `submitted` and says why in `message` on
+ `GET /vault/api/v1/dpp/{dppId}/registry`. Someone who has read the right
+ correlation identifier off the registry's own interface gives it to the row
+ here.
+
+ **The handle is checked, not taken on trust.** The submission it names is
+ read back from the registry, and the request is refused unless that
+ submission reports the unique product identifier this passport was submitted
+ under. A typo, or the handle of a neighbouring passport, is refused with
+ `422` and nothing is recorded. An identifier is not unique to a passport — a
+ successor can be submitted under its predecessor's — so a match says the
+ submission *reports* the identifier, which is all the registry says.
+
+ **It records the handle and nothing else.** The node's drain polls the
+ submission by it on its next pass and applies the registry's ruling then,
+ which is the one place that decides what a registration or a refusal does to
+ a row. The row's attempts start again, so it stops reading as stalled while
+ it is being polled. `registry` in the response is what the registry reported
+ when the handle was checked, so the answer is known now without waiting for
+ that pass.
+
+ The write is recorded in the passport's audit trail as
+ `registry_handle_recorded`, with who recorded which handle and what the
+ registry reported.
+
+ Not idempotency-keyed, and does not need to be: a row that already holds this
+ handle answers `200` with `recorded: false` and changes nothing, so a retry
+ after a lost response does not fail on its own success. A row that holds a
+ *different* handle is refused with `409`; one the registry gave is never
+ overwritten.
+ tags:
+ - Registry
+ security:
+ - BearerApiKey: []
+ - BasicAuth: []
+ parameters:
+ - name: dppId
+ in: path
+ required: true
+ schema:
+ $ref: '#/components/schemas/DppId'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RecordRegistryHandleRequest'
+ responses:
+ '200':
+ description: |
+ The row holds the handle: this request recorded it, or the row already
+ held it.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RecordRegistryHandleResponse'
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthorized'
+ '403':
+ $ref: '#/components/responses/Forbidden'
+ '404':
+ description: |
+ No passport with that id, or the passport has no registry registration —
+ it owes one only once published. Distinct from `409` and `422`, which mean
+ a registration exists and is not in a state, or does not match, what this
+ records.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '409':
+ description: |
+ The registration is not in a state that takes a handle. The detail says
+ which: the registry has not accepted the submission yet, so there is no
+ handle to record; it has already ruled, so none is needed; or the row
+ already holds a different correlation identifier, which is never
+ overwritten.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '422':
+ description: |
+ The handle was not recorded because it was not shown to be this
+ passport's. The detail says which: the submission it names reports other
+ passports' identifiers, or none; the registry has not finished checking
+ it, so it reports no passport yet; no submission with that identifier was
+ found in the part of the registry's list this node read; this node's
+ registry connection cannot read a submission's contents; or the row's
+ stored payload is unreadable, so there is nothing to check against. Also
+ returned for a `correlationId` that is empty, over 200 characters, or
+ contains whitespace or control characters.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '501':
+ description: This node has no registry queues, so there is no registration to record a handle on.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '502':
+ description: |
+ The registry could not be read, so the handle could not be checked and was
+ not recorded. Safe to retry.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ /vault/api/v1/dpp/{dppId}/registry/abandon:
+ post:
+ operationId: abandonDppRegistration
+ summary: Give up on a registration the registry never accepted
+ description: |
+ Ends a passport's registry registration queue row as `abandoned`, for a
+ registration the registry never accepted. The node retries a `pending`
+ registration with backoff for as long as the passport is published; when the
+ registry refuses the payload on every attempt, or the product is withdrawn
+ before it was ever registered, that is forever. This is how a person ends it.
+
+ **The registry is checked, not taken on trust.** A `pending` registration
+ whose first attempt got through and whose reply was lost looks exactly like
+ one that never did: the registry holds a submission for the passport and this
+ node has no record that it does. Abandoning that one would leave a
+ registration the registry may grant that the node believes it dropped. So the
+ registry's task list is read, and the request is refused unless **all** of it
+ was read and none of it reports the unique product identifier the passport
+ was submitted under. A list too long to read in full, a task still being
+ checked, and a connection that cannot look a submission up are each refused
+ with `422`: none of them shows the registry to hold nothing. A submission the
+ registry does hold is a `409`, and names its correlation identifier.
+
+ **Only after an attempt has failed.** The registration must be `pending`, must
+ have been tried at least once, and must be waiting for its next attempt. A row
+ being attempted is still due, and only a finished attempt pushes it out, so
+ this cannot land between the node reading the row and submitting it. A
+ `submitted` registration is one the registry holds and is never abandoned from
+ here.
+
+ **It ends the queue row, not the passport.** The passport stays published, and
+ `GET /vault/api/v1/registry` counts the registration as `abandoned` so it is
+ not read as still owed. Nothing the node's drain writes moves a row out of
+ `abandoned`. Publishing the passport again queues it afresh.
+
+ The write is recorded in the passport's audit trail as `registry_abandoned`,
+ with who gave up on it, the reason, and what the row had been saying.
+
+ Not idempotency-keyed, and does not need to be: a registration that is already
+ abandoned answers `200` with `alreadyAbandoned: true` and changes nothing, asks
+ the registry nothing and writes the trail nothing, so a retry after a lost
+ response does not fail on its own success.
+ tags:
+ - Registry
+ security:
+ - BearerApiKey: []
+ - BasicAuth: []
+ parameters:
+ - name: dppId
+ in: path
+ required: true
+ schema:
+ $ref: '#/components/schemas/DppId'
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AbandonRegistrationRequest'
+ responses:
+ '200':
+ description: |
+ The registration is abandoned: by this request, or already.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AbandonRegistrationResponse'
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthorized'
+ '403':
+ $ref: '#/components/responses/Forbidden'
+ '404':
+ description: |
+ No passport with that id, or the passport has no registry registration —
+ it owes one only once published. Distinct from `409` and `422`, which mean
+ a registration exists and cannot be abandoned as it stands.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '409':
+ description: |
+ The registration cannot be abandoned. The detail says which: the registry
+ has accepted the submission, so it holds a registration or is deciding one;
+ the registry has already ruled; the registry holds a submission for the
+ passport's identifier (the detail names its correlation identifier, or the
+ candidates); or the node has not tried the registration yet, or is about to
+ or is trying it now.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '422':
+ description: |
+ The registry could not be shown to hold nothing for the passport, so the
+ registration was not abandoned. The detail says which: part of the task list
+ was not read, or a task is still being checked; this node's registry
+ connection cannot look a submission up; or the registration's stored payload
+ is unreadable, so there is nothing to look up by. Also returned for a
+ `reason` that is empty, over 500 characters, or contains control characters.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '501':
+ description: This node has no registry queues, so there is no registration to abandon.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ '502':
+ description: |
+ The registry could not be read, so it could not be shown to hold nothing and
+ the registration was not abandoned. Safe to retry.
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
/vault/api/v1/registry:
get:
operationId: getRegistryRollup
@@ -1536,7 +1843,7 @@ paths:
electronic identification means expire), and a lapsed operator cannot
register or amend anything until it verifies again.
- **Absent is not zero** — see the per-passport route.
+ **Absent is not zero**: see the per-passport route.
tags:
- Registry
security:
@@ -1558,7 +1865,7 @@ paths:
description: |
Aggregate, privacy-safe resolution counts for one passport over a
trailing window. Scans and QR-image renders are reported as separate
- fields and are never summed — a render is label production, not a
+ fields and are never summed: a render is label production, not a
resolution. Nothing about the scanner (IP, agent, session) is collected
or returned; the counters carry no such fields. Returns zeros for a
passport that has never been scanned.
@@ -1599,7 +1906,7 @@ paths:
summary: Operator-wide scan telemetry rollup
description: |
Aggregate resolution counts across all of the operator's passports over
- a trailing window — the "your passports were resolved N times" figure.
+ a trailing window: the "your passports were resolved N times" figure.
Scans and QR-image renders are separate; nothing about the scanner is
collected.
tags:
@@ -1655,7 +1962,7 @@ paths:
Merge-patch the operator's configuration. Only supplied fields
are changed.
- Requires an admin-scoped key. Reading the configuration back does not —
+ Requires an admin-scoped key. Reading the configuration back does not:
`GET` is open to any authenticated caller, since a passport's issuer is
public information the moment one is published.
tags:
@@ -1711,7 +2018,7 @@ paths:
operationId: addFacility
summary: Add a facility
description: |
- Add a facility. The identifier is validated by scheme — a `gln` must
+ Add a facility. The identifier is validated by scheme: a `gln` must
pass the GS1 mod-10 check digit. Requires an admin-scoped key.
Facilities are retired, never deleted, so a duplicate created by a retried
@@ -1748,7 +2055,7 @@ paths:
delete:
operationId: removeFacility
summary: Remove a facility
- description: 'Retires the facility (soft-delete): the row is kept as Annex III provenance for passports that already stamped its identifier — never hard-deleted. Requires an admin-scoped key.'
+ description: 'Retires the facility (soft-delete): the row is kept as Annex III provenance for passports that already stamped its identifier, never hard-deleted. Requires an admin-scoped key.'
tags:
- Facilities
security:
@@ -1865,7 +2172,7 @@ paths:
operationId: addOperatorIdentifier
summary: Add an operator identifier
description: |
- Add an economic-operator identifier. Validated by scheme — LEI uses
+ Add an economic-operator identifier. Validated by scheme: LEI uses
ISO 7064 MOD 97-10; DUNS is 9 digits; EORI/VAT require a country prefix.
Requires an admin-scoped key.
@@ -1904,7 +2211,7 @@ paths:
delete:
operationId: removeOperatorIdentifier
summary: Remove an operator identifier
- description: 'Retires the identifier (soft-delete): the row is kept as Art. 13 provenance for passports that already stamped its value — never hard-deleted. Requires an admin-scoped key.'
+ description: 'Retires the identifier (soft-delete): the row is kept as Art. 13 provenance for passports that already stamped its value, never hard-deleted. Requires an admin-scoped key.'
tags:
- Operator Identifiers
security:
@@ -1998,7 +2305,7 @@ paths:
summary: List active API keys
description: |
Lists all active API keys for this deployment. Only the key prefix
- is returned — the full secret is shown once at creation time.
+ is returned: the full secret is shown once at creation time.
Requires an admin-scoped key.
tags:
@@ -2024,16 +2331,16 @@ paths:
summary: Create a new API key
description: |
Generate a new API key. The response includes the full plain-text
- `secret` — this is the only time it will be shown. Store it securely.
+ `secret`: this is the only time it will be shown. Store it securely.
**A replayed request does not return the secret.** This route accepts an
`Idempotency-Key`, but the secret is never stored, so a retry that finds a
completed key answers with the key record and
- `"secretAlreadyDelivered": true` in place of `secret`. That is the honest
- answer: the credential exists and was handed to the first attempt. If that
+ `"secretAlreadyDelivered": true` in place of `secret`. The
+ credential exists and was handed to the first attempt. If that
response was lost, revoke the key and create another.
- Requires an admin-scoped key — including the first one, which is minted
+ Requires an admin-scoped key, including the first one, which is minted
with the operator's Basic credential.
tags:
- API Keys
@@ -2072,8 +2379,8 @@ paths:
is set to false. Subsequent auth attempts with this key will fail.
**A key cannot revoke itself.** Revoking the credential this very request
- authenticated with would lock the caller — and everything sharing that key
- — out of every authenticated route, so it is refused with `409`.
+ authenticated with would lock the caller (and everything sharing that key)
+ out of every authenticated route, so it is refused with `409`.
Authenticate with a different key, or with the operator's Basic credential,
which carries no key id and is therefore the lockout-recovery path.
@@ -2129,13 +2436,20 @@ paths:
on `GET /vault/credential/dpp/{dppId}`.
**Only a legitimate interest, never an authority.** An operator naming its
- own authorised repairer attests something no one else can — membership of
+ own authorised repairer attests something no one else can: membership of
that network is a fact the operator alone holds, and no EU register of
authorised repairers exists to hold it instead. An operator naming itself a
market surveillance authority attests nothing, because the standing being
claimed is conferred by a member state. The three authority roles are
refused with `422`.
+ **Narrow by category as well as by group.** `productCategories` limits
+ the credential to passports that state one of the listed categories,
+ within `productGroups`. An operator that places both EV and LMT batteries
+ can vouch for a repairer of one and not the other. A list that cannot work
+ as written is refused rather than signed. Otherwise the holder, not the
+ operator, would be the one to find out, from reads served the public view.
+
**Issuing is not trusting.** A credential minted here is honoured by *this*
node only if the node also trusts its own DID (`CREDENTIAL_ISSUERS_SELF`).
An operator running more than one node ordinarily mints on one and honours
@@ -2150,7 +2464,7 @@ paths:
keyed set: the node stores no record of what it signed and publishes no
status list, so a duplicate cannot be found afterwards and could not be
withdrawn if it were. A retry under the same key replays the original
- response — including `credentialJws`, which is what stops the retry from
+ response, including `credentialJws`, which is what stops the retry from
minting a *second* live credential.
Requires an admin-scoped key.
@@ -2184,9 +2498,14 @@ paths:
$ref: '#/components/responses/IdempotentRequestInFlight'
'422':
description: |
- The request cannot produce a usable credential — an authority role, a
- `holderDid` that is not a DID, a `country` that is not alpha-2, or a
- `validForDays` outside 1–90.
+ The request cannot produce a usable credential: an authority role, a
+ `holderDid` that is not a DID, a `country` that is not alpha-2, a
+ `validForDays` outside 1–90, or a `productCategories` list that cannot
+ work as written (one given without `productGroups`, one holding a value
+ no named group's passports can state, or one that leaves a named group
+ with no passport the credential could read). For the last two, the
+ `detail` names the values or groups at fault and what those groups'
+ passports can state.
content:
application/problem+json:
schema:
@@ -2199,6 +2518,72 @@ paths:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
+ /vault/api/v1/personal-data/{record}:
+ delete:
+ operationId: erasePersonalDataRecord
+ summary: Erase a record of personal data
+ description: |
+ Erases a record that a passport's `personalData` statement names
+ (`{"held": "outside", "record": ""}`), keeping a tombstone. This is how
+ a withdrawn consent (GDPR Art. 7(3)) is honoured: a published passport is
+ signed, frozen, archived and copied to the back-up provider, so the personal
+ data is held in a record that can be erased instead.
+
+ **Erasing touches nothing else.** Not the passport, which is signed and
+ frozen. Not the statement in it, which keeps naming the record, so a reader
+ following the statement learns that the record is gone rather than that it
+ never existed. Not any other record.
+
+ **Idempotent.** Erasing a record that is already erased returns the receipt
+ it was given the first time, so a caller that lost the answer asks again. It
+ takes no `Idempotency-Key`.
+
+ **The tombstone is not free of personal data.** It keeps the identifier, the
+ passport and field the record belonged to, and when it was erased: none of
+ the content. A passport identifier can relate to whoever owns the item, and
+ information that can be linked to a person is personal data (GDPR Recital
+ 26). The receipt is therefore as sensitive as the passport's individual-item
+ data, and the operator needs a basis for keeping the tombstone; to show that
+ it erased (Art. 5(2)) is one. Nothing in this node deletes it.
+
+ **No route reads a record.** A record is served by no resolver, public,
+ credentialed or authenticated view of a passport, and is never part of the
+ archive of past versions or of the back-up copy. Serving one is a disclosure
+ that needs a basis of its own, which only the controller can establish for
+ each purpose.
+
+ Admin-scoped, like every other route that removes something: the write scope
+ produces and moves passports, and none of that destroys anything.
+ tags:
+ - Personal Data
+ security:
+ - BearerApiKey: []
+ - BasicAuth: []
+ parameters:
+ - name: record
+ in: path
+ required: true
+ description: The record's identifier, as the passport's statement names it (`personalData..record`).
+ schema:
+ type: string
+ minLength: 1
+ responses:
+ '200':
+ description: The record is erased. The same receipt on every call after the first.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PersonalDataErasureReceipt'
+ '401':
+ $ref: '#/components/responses/Unauthorized'
+ '403':
+ $ref: '#/components/responses/Forbidden'
+ '404':
+ description: 'This node never held a record with that identifier, which includes a string that could not have been one. A record that was held and is erased is not a `404`: it answers `200` with its receipt.'
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
/vault/api/v1/unsold-goods:
get:
operationId: listUnsoldGoods
@@ -2252,7 +2637,7 @@ paths:
**This is not a passport.** There is no digital product passport anywhere in
Art. 24 or Art. 25: the subject is an *operator over a financial year*, the
medium is the operator's own website, and the trigger is discarding unsold
- stock — none of which is a product placed on the market. These routes
+ stock: none of which is a product placed on the market. These routes
therefore sit beside the other operator-scoped ones, and no `unsold-goods`
product group carries passports.
@@ -2267,7 +2652,7 @@ paths:
`productCategory` is the operator's own categorisation for Art. 24(1)(a).
**Retry with an `Idempotency-Key`.** This route serves no `DELETE`, so a
- duplicate line is permanent — and Art. 24 is disclosed publicly for a
+ duplicate line is permanent, and Art. 24 is disclosed publicly for a
financial year, so a discard counted twice overstates what the operator
actually did.
@@ -2302,7 +2687,7 @@ paths:
$ref: '#/components/responses/IdempotentRequestInFlight'
'422':
description: |
- The line cannot be recorded — a `reportingPeriod` that is not a
+ The line cannot be recorded: a `reportingPeriod` that is not a
four-digit year, a negative count or weight, a `countryOfDisposal` that
is not alpha-2, a destruction with no justification, or a justification
on something that was not destroyed.
@@ -2316,7 +2701,7 @@ paths:
summary: List webhook subscriptions
description: |
Lists webhook subscriptions (active and retired). The signing secret is
- never returned here — only in the create response. Admin-scoped.
+ never returned here, only in the create response. Admin-scoped.
tags:
- Webhooks
security:
@@ -2341,7 +2726,7 @@ paths:
description: |
Register a receiver URL (must be https and resolve to a public host,
unless the node sets WEBHOOK_ALLOW_PRIVATE_TARGETS). The response includes
- the `secret` — shown ONCE — used to verify the `X-Odal-Signature` header
+ the `secret` (shown ONCE) used to verify the `X-Odal-Signature` header
on every delivery. Admin-scoped.
**A replayed request does not return the secret.** This route accepts an
@@ -2446,12 +2831,12 @@ paths:
operationId: installPlugin
summary: Install a signed product group plugin
description: |
- Verify, persist, and hot-swap a signed product group plugin — no node restart.
+ Verify, persist, and hot-swap a signed product group plugin: no node restart.
The node verifies the uploaded artifact's detached signature against its
pinned publisher key, gates the plugin's declared ABI, instantiate-smokes
the module, persists it (so a restart re-loads it), and atomically swaps
- it into service. Any rejection is fail-closed — the previously installed
+ it into service. Any rejection is fail-closed: the previously installed
plugin keeps serving. Admin-scoped.
Both a portable `.wasm` (compiled on the node) and a precompiled `.cwasm`
@@ -2502,7 +2887,7 @@ paths:
'409':
$ref: '#/components/responses/IdempotentRequestInFlight'
'422':
- description: The artifact was rejected — bad signature, incompatible ABI, or a non-instantiable/incompatible module.
+ description: 'The artifact was rejected: bad signature, incompatible ABI, or a non-instantiable/incompatible module.'
'501':
description: This node has no plugin host configured; runtime install is unavailable.
/vault/api/v1/ruleset/reload:
@@ -2510,13 +2895,13 @@ paths:
operationId: reloadRuleset
summary: Re-read the signed ruleset channel and hot-swap a verified bundle
description: |
- Adopt a newly published compliance ruleset — no node restart.
+ Adopt a newly published compliance ruleset: no node restart.
The node re-reads its configured channel, verifies the bundle's manifest
signature against the pinned publisher key, checks the content hash, refuses
a bundle whose rules do not take effect yet or that is older than the one
already in force, and only then swaps it in atomically. Requests in flight
- keep serving throughout. Any rejection is fail-closed — the ruleset already
+ keep serving throughout. Any rejection is fail-closed: the ruleset already
in force keeps validating. Admin-scoped.
The node also polls the channel on its own (`RULESET_POLL_INTERVAL_SECS`),
@@ -2542,11 +2927,11 @@ paths:
'403':
description: A non-admin credential attempted to reload the ruleset.
'422':
- description: 'The bundle was refused and the ruleset in force is unchanged. The problem `code` says which refusal: `RULESET_REJECTED` (bad signature, content-hash mismatch, or a malformed manifest — distrust the bytes), `RULESET_NOT_YET_EFFECTIVE` (authentic but its rules start later — leave it staged and re-offer it once the date arrives), or `RULESET_SUPERSEDED` (authentic but older than what is running — the rollback refusal; something served a stale bundle).'
+ description: 'The bundle was refused and the ruleset in force is unchanged. The problem `code` says which refusal: `RULESET_REJECTED` (bad signature, content-hash mismatch, or a malformed manifest; distrust the bytes), `RULESET_NOT_YET_EFFECTIVE` (authentic but its rules start later; leave it staged and re-offer it once the date arrives), or `RULESET_SUPERSEDED` (authentic but older than what is running; this is the rollback refusal, and something served a stale bundle).'
'501':
description: This node has no signed ruleset channel configured; it is running its compiled-in baseline and there is nothing to re-read.
'503':
- description: The channel could not be read at all — the bundle file is missing or unreadable, or what arrived was not a bundle. Transport-level; retry once the drop is fixed.
+ description: 'The channel could not be read at all: the bundle file is missing or unreadable, or what arrived was not a bundle. Transport-level; retry once the drop is fixed.'
/vault/api/v1/node/state:
get:
operationId: getNodeState
@@ -2575,7 +2960,7 @@ paths:
summary: Identity and scope of the presented credential
description: |
Echoes back what the caller's own credential is. A client cannot otherwise
- discover what it is allowed to do — a `read` key learns it is read-only by
+ discover what it is allowed to do: a `read` key learns it is read-only by
having a write rejected, which cannot be checked ahead of time.
Reports only what the caller already presented; it reveals nothing about
@@ -2606,7 +2991,7 @@ paths:
service internally. Returns 404 for drafts, 410 for suspended.
A passport that has been superseded serves the record that replaced it,
- so the body's `id` is not always `dppId` — see the 200 below.
+ so the body's `id` is not always `dppId`: see the 200 below.
tags:
- Public (Vault)
security: []
@@ -2619,7 +3004,7 @@ paths:
- name: schema_view
in: query
required: false
- description: Request a read-time schema-upcast view. Set to a newer product group schema version (e.g. `2.0.0`); the response becomes `{ passport, schemaView }` — the canonical signed passport plus the derived view with lens provenance. The original is never re-signed.
+ description: 'Request a read-time schema-upcast view. Set to a newer product group schema version (e.g. `2.0.0`); the response becomes `{ passport, schemaView }`: the canonical signed passport plus the derived view with lens provenance. The original is never re-signed.'
schema:
type: string
example: 2.0.0
@@ -2628,13 +3013,13 @@ paths:
description: |-
Published passport record. With `?schema_view`, the body is instead `{ passport, schemaView }`.
- 🚨 **The body's `id` is not always the `dppId` that was asked for.** A passport in the `superseded` status serves the published record that replaced it. ESPR Art. 9(1) has the data carrier link to *the* passport for the product, and a carrier is printed on a physical thing and cannot be recalled — so this door has to keep landing on whichever record is current, which is what `/01/{gtin}` beside it has always done.
+ **The body's `id` is not always the `dppId` that was asked for.** A passport in the `superseded` status serves the published record that replaced it. ESPR Art. 9(1) has the data carrier link to *the* passport for the product, and a carrier is printed on a physical thing and cannot be recalled, so this door has to keep landing on whichever record is current, which is what `/01/{gtin}` beside it has always done.
What is served is the successor's own signed public view, and its `supersedesId` names the passport that was asked for: the pointer is part of a document the reader can verify rather than a claim beside one. The chain is followed rather than stepped once, so `A → B → C` serves `C` when `A` is scanned.
A superseded passport whose successor is **not published yet** keeps serving its own frozen view, as does one retired or deactivated with no replacement at all. In that view `status` reads as it did at publish, because the body is the payload `publicJwsSignature` was computed over.
- When — and only when — the body is a different record from the one asked for, the response carries `Content-Location` naming where that record lives (RFC 9110 §8.7). Its **presence** is the signal: a client can tell "this is your record" from "this is the record that replaced it" without comparing `id` against what it sent. It is a relative reference, so it resolves correctly wherever this API is mounted.
+ When (and only when) the body is a different record from the one asked for, the response carries `Content-Location` naming where that record lives (RFC 9110 §8.7). Its **presence** is the signal: a client can tell "this is your record" from "this is the record that replaced it" without comparing `id` against what it sent. It is a relative reference, so it resolves correctly wherever this API is mounted.
headers:
Content-Location:
description: Present only on a superseded read, naming the record actually served, relative to the request URI (e.g. `./0b6b…`). Absent on an ordinary read.
@@ -2670,7 +3055,7 @@ paths:
operationId: publicGetDppByGtin
summary: Public read of a published DPP by its printed GS1 label
description: |
- Unauthenticated read of the published passport a GS1 label names — the
+ Unauthenticated read of the published passport a GS1 label names: the
same signed public view the by-id route serves, found by the label printed
on the product instead of by passport id. The resolver's
`/01/{gtin}[/10/{batch}][/21/{serial}]` routes forward the label here.
@@ -2680,11 +3065,21 @@ paths:
does not name one:
- `serial` (AI 21) names the passport whose carrier serial it is, at any
- level. `batch` is not consulted once a serial is given.
+ level. `batch` is consulted only if the serial finds nothing.
- `batch` (AI 10) alone names the batch-level passport for that lot.
- Neither names the model-level passport, or a passport with no batch and
no serial.
+ **A level with no passport answers with the one above it.** An unknown
+ serial resolves to the batch-level passport for the label's `batch`, if it
+ carries one and one exists, and otherwise to the model-level passport; an
+ unknown batch resolves to the model-level passport. That is how a GS1
+ resolver answers a granular identifier, and it keeps a unit whose serial
+ was stamped by the manufacturer's own system, and never attributed here,
+ reaching the passport of its model. `404` means nothing is on record at any
+ level the label names. A level that does have a passport always answers: a
+ suspended unit is `410`, never its model's passport.
+
A label keeps working after its passport is amended: the successor is
served, not the superseded record.
@@ -2693,7 +3088,7 @@ paths:
this label was ever published here, while `410` means one was and has since
been suspended. Only the second is a recall signal, and a consumer who
scanned a product needs to be able to tell them apart. `422` is a
- structurally invalid GTIN-14 — a bad check digit or wrong length — which is
+ structurally invalid GTIN-14 (a bad check digit or wrong length) which is
a malformed request rather than an answer about any product.
Only the passport's `public` audience view is returned, carrying the
@@ -2760,6 +3155,26 @@ paths:
carrying the proof computed over that view. Credentialed reads are
recorded to the passport's audit trail; anonymous reads are not.
+ **A credential that does not cover this passport gets the public view,
+ not an error.** A credential may narrow itself to product groups and to
+ product categories, and both are checked against the passport being read:
+ the group against its `productGroup`, the category against the one its
+ data states, such as a battery's `batteryType`. A credential naming
+ categories does not cover a passport whose group states none. Out of scope,
+ a valid credential gets a `200` with the public view, byte-identical to
+ `/public/dpp/{dppId}`, so the body carries no `disclosureSet`; only an
+ elevated view names one. Denying instead would make this route a probe for
+ which group or category a passport is in. The read is still recorded to
+ the audit trail, with the public classes it was reduced to. `401` is for a
+ credential that fails verification, never for one out of scope.
+
+ **Why a credential was out of scope is in the
+ `X-DPP-Credential-Out-Of-Scope` header**, not the body, because the body
+ is the public view exactly: the payload `publicJwsSignature` signs. The
+ group is checked first, so a credential that misses both axes is reported
+ for the group. The header says nothing the public body does not: the group
+ is in the body, and every group's category field is public.
+
Returns the public view (not an error) when credential verification
is not configured on this node.
tags:
@@ -2780,6 +3195,29 @@ paths:
responses:
'200':
description: Passport filtered to the resolved audience.
+ headers:
+ X-DPP-Credential-Out-Of-Scope:
+ description: |
+ Present only when a verified credential was served the public view
+ because it does not cover this passport, naming the axis that
+ missed:
+
+ - `product-group`: the credential names product groups, and not
+ this passport's;
+ - `product-category`: it names product categories, and not the one
+ this passport states;
+ - `no-product-category`: it names product categories, and this
+ passport's group states none.
+
+ Absent on an anonymous read, on a read the credential covers, and
+ on a node with credential verification unconfigured.
+ required: false
+ schema:
+ type: string
+ enum:
+ - product-group
+ - product-category
+ - no-product-category
content:
application/json:
schema:
@@ -2851,7 +3289,7 @@ paths:
"Knows of" is wider than "has a schema for". A product group reached by an
act while carrying no catalog descriptor is listed too, with a `null`
- `title` — that group has no schema, plugin or template to be discovered from,
+ `title`: that group has no schema, plugin or template to be discovered from,
so this is the only place it can be asked about.
**Every date is served with its `basis`.** Most of the catalog is undated,
@@ -2865,7 +3303,7 @@ paths:
the technical requirements do not, in which case nothing is bindingly
determinable yet however clearly the duty is written.
- Schema versions are not restated here — see `/integrator/api/v1/schemas`,
+ Schema versions are not restated here: see `/integrator/api/v1/schemas`,
which is their one home.
tags:
- Integrator
@@ -2885,7 +3323,7 @@ paths:
The passport obligation for a single product group. Unauthenticated.
A key neither catalog knows is a `404` rather than an entry with an empty
- obligation — "this node knows nothing about it" and "no passport is
+ obligation: "this node knows nothing about it" and "no passport is
required" are different answers, and the second would be a compliance claim
the node is not entitled to make.
@@ -2958,14 +3396,14 @@ paths:
summary: Fetch a product group's current JSON Schema
description: |
The schema a passport created today is validated against, resolved through
- the same registry the publish gate uses — never a copy, which would drift in
+ the same registry the publish gate uses, never a copy, which would drift in
the direction where a body passes here and fails at publish. Unauthenticated.
Every `description` is omitted from the served document. Those fields make
regulatory assertions that have not been verified against primary text, and
serving them would turn developer-facing comments into a product surface.
- Everything that decides accept or reject — types, `enum`, `required`,
- `pattern`, bounds, `additionalProperties` — is served in full, so a client
+ Everything that decides accept or reject (types, `enum`, `required`,
+ `pattern`, bounds, `additionalProperties`) is served in full, so a client
can pre-validate a body and get the verdict the create route would give.
tags:
- Integrator
@@ -3045,14 +3483,14 @@ paths:
as `battery-ev`, `battery-lmt` and `battery-industrial`.
The served set is deliberately **not enumerated here.** It is derived from
- one table in the handler, and the `404` body lists it — so a template added
+ one table in the handler, and the `404` body lists it, so a template added
there is named by the refusal without anyone remembering to edit this
sentence. That table exists because this list previously had three homes
that disagreed, and this description was one of them.
**There is no bare `battery` template.** What a battery passport must carry
is decided per category, and the state-of-health parameters are two disjoint
- sets under Annex VII Part A — an EV battery reports state of certified
+ sets under Annex VII Part A: an EV battery reports state of certified
energy alone, while stationary and LMT batteries report a five-parameter
list. One file cannot carry three obligations without offering columns some
categories must not fill.
@@ -3067,7 +3505,7 @@ paths:
All three battery templates are **generated** from the same rules table the
publish-time content gate reads, so a template cannot fall behind the
obligation it exists to satisfy. Their rows import under the `battery`
- product group — the category is carried by the row's own `batteryType`
+ product group: the category is carried by the row's own `batteryType`
column, not by a product group of its own.
Structured data points use four flat-file conventions: repeating groups
@@ -3092,8 +3530,8 @@ paths:
nothing. Rows from all three import under the `battery` product group.
The parameter keeps its name because renaming a path parameter renames
- the method argument in every generated client, and for the eight
- non-battery templates the two are still the same string.
+ the method argument in every generated client, and for every
+ non-battery template the two are still the same string.
schema:
type: string
example: battery-ev
@@ -3129,11 +3567,15 @@ paths:
operationId: importFile
summary: Bulk-import passports from a file
description: |
- Upload a CSV or XLSX file to create draft passports for a product group
- (`battery`, `textile`, `steel`, `aluminium`, `tyre`). The caller's
- `Authorization: Bearer` token is validated and forwarded to the vault.
+ Upload a CSV or XLSX file to create draft passports for a product group.
+ The caller's `Authorization: Bearer` token is validated and forwarded to
+ the vault.
+
+ The importable set is deliberately **not enumerated here**: it is one list
+ in the handler, and the `404` body names every accepted key. This sentence
+ listed five product groups long after the importer reached more.
- A battery **template** key is accepted here too — `battery-ev`,
+ A battery **template** key is accepted here too: `battery-ev`,
`battery-lmt` and `battery-industrial` all import as `battery`, since the
category is carried by the row's own `batteryType` column rather than being
a product group of its own. An operator who downloads `battery-ev` can post
@@ -3143,7 +3585,7 @@ paths:
- `> 100` valid rows → an async job is queued, `202` with a `jobId`.
- `mode=dry_run` → validate only, `200` with the would-be results.
- Every import — dry-run or apply, sync or async — mints a job id and
+ Every import (dry-run or apply, sync or async) mints a job id and
persists a row-addressed report retrievable via the job-status
endpoint, even when this endpoint's own response is synchronous.
tags:
@@ -3182,7 +3624,7 @@ paths:
schema:
$ref: '#/components/schemas/ImportSyncResponse'
'202':
- description: Async import job accepted — poll the job-status endpoint.
+ description: Async import job accepted. Poll the job-status endpoint.
content:
application/json:
schema:
@@ -3197,6 +3639,8 @@ paths:
$ref: '#/components/responses/IdempotentRequestInFlight'
'422':
$ref: '#/components/responses/ValidationError'
+ '429':
+ $ref: '#/components/responses/ImportBusy'
/integrator/api/v1/imports/{job_id}:
get:
operationId: getImportJobStatus
@@ -3244,6 +3688,29 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/DidDocument'
+ /.well-known/did.json:
+ get:
+ operationId: getRootDidDocument
+ summary: did:web DID document, at the did:web resolution path
+ description: |
+ Serves the operator's `did:web` DID document at the path the did:web method
+ resolves a pathless DID to: `did:web:` is looked up at
+ `https:///.well-known/did.json`. The node's DID is pathless, so this
+ is where a verifier fetches it.
+
+ The same document as `/identity/.well-known/did.json`, which stays for
+ callers that already use it. The standalone identity service serves this
+ path too. Public, unauthenticated.
+ tags:
+ - Identity
+ security: []
+ responses:
+ '200':
+ description: The DID document.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DidDocument'
/internal/sign:
servers:
- url: http://localhost:8002
@@ -3254,7 +3721,7 @@ paths:
description: |
Signs a base64-encoded canonical-JSON payload with the operator's
Ed25519 key (auto-provisioned on first use). Returns a compact JWS.
- Service-to-service only — gated by mTLS (`CN=odal-vault`).
+ Service-to-service only: gated by mTLS (`CN=odal-vault`).
tags:
- Identity (internal)
security:
@@ -3285,10 +3752,10 @@ paths:
summary: Verify a JWS this service issued (internal, mTLS)
description: |
Checks a compact JWS against the named operator's key *and* confirms
- it was signed over the given payload — a validly-signed JWS for
+ it was signed over the given payload: a validly-signed JWS for
different content does not pass. Never errors on a signature that
simply fails to verify; that is `{ "valid": false }`, not a fault.
- Service-to-service only — gated by mTLS (`CN=odal-vault`).
+ Service-to-service only: gated by mTLS (`CN=odal-vault`).
tags:
- Identity (internal)
security:
@@ -3301,7 +3768,7 @@ paths:
$ref: '#/components/schemas/InternalVerifyRequest'
responses:
'200':
- description: 'Verification result. Always `200` — an unverifiable signature is `{ "valid": false }`, not an error status.'
+ description: 'Verification result. Always `200`: an unverifiable signature is `{ "valid": false }`, not an error status.'
content:
application/json:
schema:
@@ -3318,7 +3785,7 @@ paths:
description: |
Archives the current key (so prior signatures still verify), generates
a new primary key, and rebuilds the DID document. Service-to-service
- only — gated by mTLS (`CN=odal-vault`).
+ only: gated by mTLS (`CN=odal-vault`).
tags:
- Identity (internal)
security:
@@ -3371,7 +3838,7 @@ paths:
success representation.
**Serving is conditional on verification, so verification failures are
- statuses of this route.** The resolver holds no passport data — it fetches
+ statuses of this route.** The resolver holds no passport data: it fetches
from the vault's public tier and verifies the public signature against the
operator's DID before building any representation. A passport it cannot
verify is never served unmarked: `409` when the signature does not check
@@ -3400,7 +3867,7 @@ paths:
schema:
type: object
description: |
- An IDTA Asset Administration Shell `Environment` — shells
+ An IDTA Asset Administration Shell `Environment`: shells
and submodels in one self-contained document.
`conceptDescriptions` is **absent**, not empty. This node
@@ -3417,7 +3884,7 @@ paths:
**Schema-valid, not conformance-certified.** Every
Environment is validated in `dpp-core`'s CI against IDTA's
published AAS JSON Schemas for metamodel **3.0, 3.1 and
- 3.2**, and must satisfy all three — no single revision is
+ 3.2**, and must satisfy all three: no single revision is
the strictest, so the intersection is the only target that
means "loadable whichever revision your toolchain
implements".
@@ -3450,11 +3917,11 @@ paths:
`resolverBase` is per-deployment (`RESOLVER_BASE_URL`,
required, no default). Error responses carry no
- `Link` — an error is not a representation of the passport.
+ `Link`: an error is not a representation of the passport.
'404':
description: |
No published passport with this identifier, or the identifier is not a
- valid passport id — the resolver reports a malformed id as "not found"
+ valid passport id: the resolver reports a malformed id as "not found"
rather than as a bad request, since to a consumer holding a data
carrier the two are the same answer.
content:
@@ -3482,7 +3949,7 @@ paths:
description: Consumer-facing error page.
'410':
description: |
- The passport exists and has been withdrawn from public view — it is
+ The passport exists and has been withdrawn from public view: it is
suspended. Distinct from `404`: the identifier is confirmed real and
service is being declined, which is the signal a consumer scanning a
recalled product needs.
@@ -3505,7 +3972,7 @@ paths:
'502':
description: |
The vault this resolver fronts could not be read. Deliberately not
- `404` — the identifier may be perfectly good, so a consumer should
+ `404`: the identifier may be perfectly good, so a consumer should
retry rather than conclude the product has no passport.
content:
application/problem+json:
@@ -3540,7 +4007,7 @@ paths:
This endpoint is on the **resolver** service (port 8003).
**Every response is `image/png`, including the failures.** This route is
- addressed by ``, so an error carries no problem document — the
+ addressed by ``, so an error carries no problem document: the
body is empty and the status line is the whole of the answer. A client that
needs a readable reason should ask `GET /dpp/{dppId}`, which answers the
same failures as `application/problem+json`.
@@ -3580,14 +4047,14 @@ paths:
type: string
format: binary
'410':
- description: The passport has been withdrawn from public view — it is suspended. Empty body.
+ description: 'The passport has been withdrawn from public view: it is suspended. Empty body.'
content:
image/png:
schema:
type: string
format: binary
'422':
- description: The passport carries no data carrier to encode — no GTIN, so no GS1 Digital Link exists to put in a QR code. Empty body.
+ description: 'The passport carries no data carrier to encode: no GTIN, so no GS1 Digital Link exists to put in a QR code. Empty body.'
content:
image/png:
schema:
@@ -3608,7 +4075,7 @@ paths:
type: string
format: binary
'503':
- description: Verification could not be attempted — the operator's DID document was unreachable. Empty body.
+ description: 'Verification could not be attempted: the operator''s DID document was unreachable. Empty body.'
content:
image/png:
schema:
@@ -3619,13 +4086,21 @@ paths:
operationId: resolveByGtin
summary: GS1 Digital Link resolver
description: |
- GS1-conformant resolver (GS1-CRSV1) keyed by GTIN-14 — the carrier this node
- prints for a model-level passport. Behaviour depends
- on the `linkType` query / `Accept` header:
+ GS1 Digital Link resolution keyed by GTIN-14, the carrier this node prints
+ for a model-level passport. It has not been assessed against the GS1
+ Conformant Resolver Standard, and nothing here claims conformance. Behaviour
+ depends on the `linkType` query / `Accept` header:
- default → `307` redirect to the HTML DPP page
- `?linkType=gs1:pip` / `gs1:dpp` (and related) → `307` redirect to the DPP
- `?linkType=linkset` or `Accept: application/linkset+json` → `200`
RFC 9264 linkset
+
+ A GTIN takes a consumer product variant (AI 22), a batch (AI 10) and a
+ serial (AI 21), in that order and each optional, or a third-party
+ extension (AI 235) on its own; each of those shapes is its own path below.
+ Any other path under `/01/` cannot be a GS1 Digital Link, because its
+ qualifiers are out of order, repeated, not ones a GTIN takes, or empty, and
+ answers `400` without a lookup.
tags:
- Public Resolver
security: []
@@ -3651,6 +4126,8 @@ paths:
type: object
'307':
description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
'404':
description: No published DPP for this GTIN, or unknown link type.
'409':
@@ -3664,14 +4141,16 @@ paths:
/01/{gtin}/21/{serial}:
get:
operationId: resolveByGtinSerial
- summary: GS1 Digital Link resolver — GTIN + serial
+ summary: GS1 Digital Link resolver (GTIN + serial)
description: |
The carrier this node prints for an item-level passport, and for one
whose level is not stated. **The serial is the resolution key**: it is the
passport's carrier serial, and it names one passport whatever its level.
An amended passport's successor carries its predecessor's serial, so the
- label keeps resolving, to the current record. Same behaviour as
- `/01/{gtin}` otherwise (`linkType` / `Accept` negotiation).
+ label keeps resolving, to the current record. A serial with no passport of
+ its own resolves to the model-level passport, as a GS1 resolver answers a
+ granular identifier; `404` means nothing is on record at any level. Same
+ behaviour as `/01/{gtin}` otherwise (`linkType` / `Accept` negotiation).
tags:
- Public Resolver
security: []
@@ -3703,8 +4182,10 @@ paths:
type: object
'307':
description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
'404':
- description: No published DPP for this GTIN, or unknown link type.
+ description: No published DPP at any level the label names, or unknown link type.
'409':
$ref: '#/components/responses/PassportSignatureUnverified'
'410':
@@ -3716,11 +4197,242 @@ paths:
/01/{gtin}/10/{batch}:
get:
operationId: resolveByGtinBatch
- summary: GS1 Digital Link resolver — GTIN + batch/lot
+ summary: GS1 Digital Link resolver (GTIN + batch/lot)
description: |
The carrier this node prints for a batch-level passport. **The batch is a
resolution key**: it resolves to the batch-level passport for that lot,
which the GTIN alone cannot name once a product has a passport per batch.
+ A lot with no passport of its own resolves to the model-level passport, as
+ a GS1 resolver answers a granular identifier; `404` means nothing is on
+ record at any level. Same behaviour as `/01/{gtin}` otherwise (`linkType` /
+ `Accept` negotiation).
+ tags:
+ - Public Resolver
+ security: []
+ parameters:
+ - name: gtin
+ in: path
+ required: true
+ schema:
+ type: string
+ example: '09506000134352'
+ - name: batch
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 10, the batch or lot. Selects the batch-level passport.
+ - name: linkType
+ in: query
+ required: false
+ schema:
+ type: string
+ description: e.g. linkset, gs1:pip, gs1:dpp
+ responses:
+ '200':
+ description: RFC 9264 linkset (when a linkset is requested).
+ content:
+ application/linkset+json:
+ schema:
+ type: object
+ '307':
+ description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
+ '404':
+ description: No published DPP at any level the label names, or unknown link type.
+ '409':
+ $ref: '#/components/responses/PassportSignatureUnverified'
+ '410':
+ $ref: '#/components/responses/Gone'
+ '502':
+ $ref: '#/components/responses/ResolverUpstreamFailure'
+ '503':
+ $ref: '#/components/responses/PassportVerificationUnavailable'
+ /01/{gtin}/10/{batch}/21/{serial}:
+ get:
+ operationId: resolveByGtinBatchSerial
+ summary: GS1 Digital Link resolver (GTIN + batch/lot + serial)
+ description: |
+ The shape this node printed for a batched passport before its carrier
+ followed the passport's stated level, and one any conformant label may
+ carry. **The serial is the resolution key**: it names one passport
+ whatever its level, so the batch is consulted only if the serial finds
+ nothing. Then the lot's passport answers, and failing that the model's, as
+ a GS1 resolver answers a granular identifier; `404` means nothing is on
+ record at any level. Same behaviour as `/01/{gtin}` otherwise (`linkType` /
+ `Accept` negotiation).
+ tags:
+ - Public Resolver
+ security: []
+ parameters:
+ - name: gtin
+ in: path
+ required: true
+ schema:
+ type: string
+ example: '09506000134352'
+ - name: batch
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 10. Consulted only if the serial finds nothing.
+ - name: serial
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 21, the carrier serial. Selects the passport.
+ - name: linkType
+ in: query
+ required: false
+ schema:
+ type: string
+ description: e.g. linkset, gs1:pip, gs1:dpp
+ responses:
+ '200':
+ description: RFC 9264 linkset (when a linkset is requested).
+ content:
+ application/linkset+json:
+ schema:
+ type: object
+ '307':
+ description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
+ '404':
+ description: No published DPP at any level the label names, or unknown link type.
+ '409':
+ $ref: '#/components/responses/PassportSignatureUnverified'
+ '410':
+ $ref: '#/components/responses/Gone'
+ '502':
+ $ref: '#/components/responses/ResolverUpstreamFailure'
+ '503':
+ $ref: '#/components/responses/PassportVerificationUnavailable'
+ /01/{gtin}/22/{variant}:
+ get:
+ operationId: resolveByGtinVariant
+ summary: GS1 Digital Link resolver (GTIN + consumer product variant)
+ description: |
+ A label that carries a consumer product variant (AI 22) after its GTIN.
+ This node never prints one, but a label printed elsewhere may. **The
+ variant takes no part in the lookup**: the node holds no record at that
+ level, so the label resolves exactly as `/01/{gtin}` does. Same behaviour
+ as `/01/{gtin}` otherwise (`linkType` / `Accept` negotiation).
+ tags:
+ - Public Resolver
+ security: []
+ parameters:
+ - name: gtin
+ in: path
+ required: true
+ schema:
+ type: string
+ example: '09506000134352'
+ - name: variant
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 22, the consumer product variant. Accepted and not looked up.
+ - name: linkType
+ in: query
+ required: false
+ schema:
+ type: string
+ description: e.g. linkset, gs1:pip, gs1:dpp
+ responses:
+ '200':
+ description: RFC 9264 linkset (when a linkset is requested).
+ content:
+ application/linkset+json:
+ schema:
+ type: object
+ '307':
+ description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
+ '404':
+ description: No published DPP at any level the label names, or unknown link type.
+ '409':
+ $ref: '#/components/responses/PassportSignatureUnverified'
+ '410':
+ $ref: '#/components/responses/Gone'
+ '502':
+ $ref: '#/components/responses/ResolverUpstreamFailure'
+ '503':
+ $ref: '#/components/responses/PassportVerificationUnavailable'
+ /01/{gtin}/22/{variant}/21/{serial}:
+ get:
+ operationId: resolveByGtinVariantSerial
+ summary: GS1 Digital Link resolver (GTIN + consumer product variant + serial)
+ description: |
+ A label that carries a consumer product variant (AI 22) and a serial
+ (AI 21). **The variant takes no part in the lookup**: the node holds no
+ record at that level, so the label resolves exactly as
+ `/01/{gtin}/21/{serial}` does, serial first and then the model if the serial
+ has no passport of its own. Same behaviour as `/01/{gtin}` otherwise
+ (`linkType` / `Accept` negotiation).
+ tags:
+ - Public Resolver
+ security: []
+ parameters:
+ - name: gtin
+ in: path
+ required: true
+ schema:
+ type: string
+ example: '09506000134352'
+ - name: variant
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 22, the consumer product variant. Accepted and not looked up.
+ - name: serial
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 21, the carrier serial. Selects the passport.
+ - name: linkType
+ in: query
+ required: false
+ schema:
+ type: string
+ description: e.g. linkset, gs1:pip, gs1:dpp
+ responses:
+ '200':
+ description: RFC 9264 linkset (when a linkset is requested).
+ content:
+ application/linkset+json:
+ schema:
+ type: object
+ '307':
+ description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
+ '404':
+ description: No published DPP at any level the label names, or unknown link type.
+ '409':
+ $ref: '#/components/responses/PassportSignatureUnverified'
+ '410':
+ $ref: '#/components/responses/Gone'
+ '502':
+ $ref: '#/components/responses/ResolverUpstreamFailure'
+ '503':
+ $ref: '#/components/responses/PassportVerificationUnavailable'
+ /01/{gtin}/22/{variant}/10/{batch}:
+ get:
+ operationId: resolveByGtinVariantBatch
+ summary: GS1 Digital Link resolver (GTIN + consumer product variant + batch/lot)
+ description: |
+ A label that carries a consumer product variant (AI 22) and a batch or lot
+ (AI 10). **The variant takes no part in the lookup**: the node holds no
+ record at that level, so the label resolves exactly as
+ `/01/{gtin}/10/{batch}` does, the lot's passport first and then the model's.
Same behaviour as `/01/{gtin}` otherwise (`linkType` / `Accept`
negotiation).
tags:
@@ -3732,13 +4444,85 @@ paths:
required: true
schema:
type: string
- example: '09506000134352'
+ example: '09506000134352'
+ - name: variant
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 22, the consumer product variant. Accepted and not looked up.
+ - name: batch
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 10, the batch or lot. Selects the batch-level passport.
+ - name: linkType
+ in: query
+ required: false
+ schema:
+ type: string
+ description: e.g. linkset, gs1:pip, gs1:dpp
+ responses:
+ '200':
+ description: RFC 9264 linkset (when a linkset is requested).
+ content:
+ application/linkset+json:
+ schema:
+ type: object
+ '307':
+ description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
+ '404':
+ description: No published DPP at any level the label names, or unknown link type.
+ '409':
+ $ref: '#/components/responses/PassportSignatureUnverified'
+ '410':
+ $ref: '#/components/responses/Gone'
+ '502':
+ $ref: '#/components/responses/ResolverUpstreamFailure'
+ '503':
+ $ref: '#/components/responses/PassportVerificationUnavailable'
+ /01/{gtin}/22/{variant}/10/{batch}/21/{serial}:
+ get:
+ operationId: resolveByGtinVariantBatchSerial
+ summary: GS1 Digital Link resolver (GTIN + consumer product variant + batch/lot + serial)
+ description: |
+ A label that carries every qualifier a GTIN takes: a consumer product
+ variant (AI 22), a batch or lot (AI 10) and a serial (AI 21). **The variant
+ takes no part in the lookup**: the node holds no record at that level, so the
+ label resolves exactly as `/01/{gtin}/10/{batch}/21/{serial}` does, serial
+ first, then the lot's passport, then the model's. Same behaviour as
+ `/01/{gtin}` otherwise (`linkType` / `Accept` negotiation).
+ tags:
+ - Public Resolver
+ security: []
+ parameters:
+ - name: gtin
+ in: path
+ required: true
+ schema:
+ type: string
+ example: '09506000134352'
+ - name: variant
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 22, the consumer product variant. Accepted and not looked up.
- name: batch
in: path
required: true
schema:
type: string
- description: AI 10, the batch or lot. Selects the batch-level passport.
+ description: AI 10. Consulted only if the serial finds nothing.
+ - name: serial
+ in: path
+ required: true
+ schema:
+ type: string
+ description: AI 21, the carrier serial. Selects the passport.
- name: linkType
in: query
required: false
@@ -3754,8 +4538,10 @@ paths:
type: object
'307':
description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
'404':
- description: No published DPP for this GTIN, or unknown link type.
+ description: No published DPP at any level the label names, or unknown link type.
'409':
$ref: '#/components/responses/PassportSignatureUnverified'
'410':
@@ -3764,16 +4550,18 @@ paths:
$ref: '#/components/responses/ResolverUpstreamFailure'
'503':
$ref: '#/components/responses/PassportVerificationUnavailable'
- /01/{gtin}/10/{batch}/21/{serial}:
+ /01/{gtin}/235/{extension}:
get:
- operationId: resolveByGtinBatchSerial
- summary: GS1 Digital Link resolver — GTIN + batch/lot + serial
- description: |
- The shape this node printed for a batched passport before its carrier
- followed the passport's stated level, and one any conformant label may
- carry. **The serial is the resolution key**: it names one passport
- whatever its level, so the batch is not consulted. Same behaviour as
- `/01/{gtin}` otherwise (`linkType` / `Accept` negotiation).
+ operationId: resolveByGtinExtension
+ summary: GS1 Digital Link resolver (GTIN + third-party serialised extension)
+ description: |
+ A label that carries a third-party serialised extension (AI 235) after its
+ GTIN. This node issues none, but a label printed elsewhere may carry one.
+ The extension stands alone: GS1 allows no further qualifier after it, so
+ only this shape is served. **It takes no part in the lookup**: the node
+ holds no record at that level, so the label resolves exactly as
+ `/01/{gtin}` does. Same behaviour as `/01/{gtin}` otherwise (`linkType` /
+ `Accept` negotiation).
tags:
- Public Resolver
security: []
@@ -3784,18 +4572,12 @@ paths:
schema:
type: string
example: '09506000134352'
- - name: batch
- in: path
- required: true
- schema:
- type: string
- description: AI 10. Not consulted once a serial is present.
- - name: serial
+ - name: extension
in: path
required: true
schema:
type: string
- description: AI 21, the carrier serial. Selects the passport.
+ description: AI 235, the third-party serialised extension. Accepted and not looked up.
- name: linkType
in: query
required: false
@@ -3811,8 +4593,10 @@ paths:
type: object
'307':
description: Redirect to the DPP page (`Location` header).
+ '400':
+ description: 'The GTIN in the path is not valid: not digits, the wrong length, or a wrong check digit.'
'404':
- description: No published DPP for this GTIN, or unknown link type.
+ description: No published DPP at any level the label names, or unknown link type.
'409':
$ref: '#/components/responses/PassportSignatureUnverified'
'410':
@@ -3829,7 +4613,7 @@ paths:
Liveness: the vault process is running and serving. On the node (port 8001)
this is mounted at `/vault/health`.
- It checks nothing beyond itself — no database, no object storage, no
+ It checks nothing beyond itself: no database, no object storage, no
upstream. A `200` here means the process is up, not that it can do useful
work; use `/vault/ready` for that. Wiring a restart policy to this endpoint
and expecting it to catch a lost database will never restart anything.
@@ -3875,7 +4659,7 @@ paths:
operationId: vaultInfo
summary: Service info
description: |
- What this build is and what it supports — for a client deciding which
+ What this build is and what it supports, for a client deciding which
features to offer before it has authenticated.
Carries four things: the vault's own `version`, the `dpp-core` version it
@@ -3887,7 +4671,7 @@ paths:
before it can, and the values here are properties of the build rather than
of the operator or their data.
- `coreVersion` is the useful one when two deployments disagree — the vault
+ `coreVersion` is the useful one when two deployments disagree: the vault
version alone does not tell you which regulatory rules were compiled in.
tags:
- Health
@@ -3909,7 +4693,7 @@ paths:
runs as its own deployable (port 8002).
Checks nothing beyond itself. The signing key store is opened at startup, so
- a process that is serving has already loaded it — which is why the readiness
+ a process that is serving has already loaded it, which is why the readiness
probe beside this one has nothing further to verify.
The body carries the service name and version.
@@ -3924,12 +4708,11 @@ paths:
operationId: identityReady
summary: Identity readiness check
description: |
- Readiness: **always `200`**, and that is the honest answer rather than a
- stub.
+ Readiness: **always `200`**, by design.
The identity service has no external dependency to check. Its signing key
store is opened at startup, so a process that is serving at all has already
- loaded everything it needs — there is no state in which it is live but not
+ loaded everything it needs: there is no state in which it is live but not
ready. Reporting anything conditional here would invent a distinction the
service does not have.
@@ -3951,7 +4734,7 @@ paths:
(port 8001) this is mounted at `/integrator/health`.
Checks nothing beyond itself, and in particular says nothing about whether
- an import currently in flight is progressing — an import is a job, and
+ an import currently in flight is progressing: an import is a job, and
`GET /integrator/api/v1/imports/{job_id}` is what reports on one.
The body carries the service name and version.
@@ -3970,13 +4753,13 @@ paths:
the **resolver** service (port 8003), which is a separate deployable from
the node.
- Checks nothing beyond itself — not Redis, not the vault it reads passports
+ Checks nothing beyond itself, not Redis, not the vault it reads passports
from. A `200` means the process answers; it does not mean a scan will
resolve.
The node has its own `/health` on port 8001, and it is deliberately bare:
it returns `{"status":"ok"}` and nothing else. The node's profile, per-port
- trust modes and ruleset version are **not** there — they are on the
+ trust modes and ruleset version are **not** there: they are on the
authenticated `GET /vault/api/v1/node/state`, because an unauthenticated
endpoint that publishes a node's trust posture tells an unauthenticated
reader more than it should. An external uptime probe pointed at either
@@ -3994,10 +4777,9 @@ paths:
description: |
Readiness: **always `200`**, on the **resolver** service (port 8003).
- Like the identity service's readiness probe, this checks nothing, and that
- is the honest answer rather than a stub. The resolver's dependencies — the
- vault it reads passports from, and its Redis cache — are consulted per
- request and degrade per request: a cache miss falls through to the vault,
+ Like the identity service's readiness probe, this checks nothing, by design.
+ The resolver's dependencies (the vault it reads passports from, and its
+ Redis cache) are consulted per request and degrade per request: a cache miss falls through to the vault,
and a vault it cannot reach produces a `502` on that read rather than a
process that should be taken out of rotation.
@@ -4028,7 +4810,7 @@ components:
description: |
The operator's own bootstrap credential, from the `ADMIN_USERNAME` and
`ADMIN_PASSWORD` environment variables. It mints the first API key on a
- fresh node — before any key exists — and is the lockout-recovery path
+ fresh node, before any key exists, and is the lockout-recovery path
afterwards, since it carries no `keyId` and so can revoke any key.
Active in every environment where both variables are set; there is no
@@ -4043,12 +4825,12 @@ components:
Client-certificate (mTLS) authentication for service-to-service calls.
The standalone identity service accepts the internal `/internal/*`
endpoints only from a client presenting `CN=odal-vault`. The fused
- `dpp-node` never exposes these over the network — it signs in-process.
+ `dpp-node` never exposes these over the network; it signs in-process.
schemas:
Problem:
type: object
description: |
- RFC 7807 / RFC 9457 problem details. The shape
+ RFC 9457 problem details. The shape
`dpp-common::http_problem::Problem` produces, served as
`application/problem+json`.
@@ -4085,13 +4867,13 @@ components:
description: |
The individual field failures behind this problem, when there are any.
- An RFC 7807 §3.2 extension member. `detail` carries the same failures
+ An RFC 9457 §3.2 extension member. `detail` carries the same failures
joined with `"; "` and is unaffected, so a client written before this
member existed keeps working; `errors` is what lets a newer one address a
single field. Publishing a battery that is missing its Annex XIII content
produces upwards of thirty entries here.
- Omitted entirely — never `[]` — on problems that are not about fields.
+ Omitted entirely (never `[]`) on problems that are not about fields.
items:
$ref: '#/components/schemas/ProblemFieldError'
ProblemFieldError:
@@ -4100,7 +4882,7 @@ components:
One field's failure inside a `Problem`.
Present only on problems that are about specific members of the request
- document — a validation rejection, most often. `field` is a JSON Pointer into
+ document: a validation rejection, most often. `field` is a JSON Pointer into
that document, so a client can address the offending member directly instead
of parsing it back out of `detail`.
required:
@@ -4144,16 +4926,16 @@ components:
- string
- 'null'
description: |-
- The serial of the physical unit this passport covers, as the manufacturer stamps or records it. Meaningful where `granularity` is `item` — "one passport per physical unit".
- **Not the serial in the resolver URL.** A GS1 Digital Link carrier is `/01/{gtin}/21/{serial}` and AI 21 is a serial number, but the value there is derived from this passport's own UUID to fit GS1's length cap. That value identifies the *record*; this identifies the *product*, and nothing reconciles the two.
- Absent means not stated — and today it is always absent: no route accepts one until an adopted delegated act makes a passport cover a single unit.
+ The serial of the physical unit this passport covers, as the manufacturer stamps or records it. Meaningful where `granularity` is `item`: "one passport per physical unit".
+ **Not the serial in the resolver URL.** A GS1 Digital Link carrier is `/01/{gtin}/21/{serial}` and AI 21 is a serial number, but the value there is `carrierSerial`: the one the operator attributed, or else a default derived from this passport's own id. A printed label resolves by that value, not by this field. This field identifies the *product* as the manufacturer records it; `carrierSerial` identifies what the *label* names.
+ Absent means not stated, and today it is always absent: no route accepts one until an adopted delegated act makes a passport cover a single unit.
example: NW-48V-000123
productName:
type: string
example: EcoCell Pro 48V
productGroup:
type: string
- description: 'EU ESPR product group — the delegated-act bucket selecting the applicable schema and plugin. Deliberately an open string, not a closed enum: adding a product group is a catalog manifest plus a schema, not a release, and a product group this build does not know still round-trips its wire tag verbatim.'
+ description: 'EU ESPR product group: the delegated-act bucket selecting the applicable schema and plugin. Deliberately an open string, not a closed enum: adding a product group is a catalog manifest plus a schema, not a release, and a product group this build does not know still round-trips its wire tag verbatim.'
example: battery
applicableInstruments:
type: array
@@ -4162,12 +4944,12 @@ components:
A set rather than a single value because acts accumulate: ESPR Art. 5(7) lets a group-specific delegated act supplement a horizontal one and the Regulation states no precedence rule, so the governing law is the union of the members' requirements.
- Not derivable from `productGroup`. A horizontal act can reach a product whose product group is not one the catalog models, so an entry may be asserted by the economic operator rather than resolved from the catalog — which `recorded` distinguishes. Read it as who asserted the entry, not as how much to trust it.
+ Not derivable from `productGroup`. A horizontal act can reach a product whose product group is not one the catalog models, so an entry may be asserted by the economic operator rather than resolved from the catalog, which `recorded` distinguishes. Read it as who asserted the entry, not as how much to trust it.
items:
$ref: '#/components/schemas/InstrumentRef'
granularity:
$ref: '#/components/schemas/Granularity'
- description: The level this passport describes. Omitted entirely while no adopted act has fixed one — see `Granularity` for why omitted is not `item`.
+ description: 'The level this passport describes. Omitted entirely while no adopted act has fixed one: see `Granularity` for why omitted is not `item`.'
manufacturer:
$ref: '#/components/schemas/ManufacturerInfo'
materials:
@@ -4175,12 +4957,12 @@ components:
items:
$ref: '#/components/schemas/MaterialEntry'
co2ePerUnit:
- description: 'CO₂e per unit — manufacturer-supplied or engine-calculated. An object, not a bare number: a figure without its lifecycle stage and system boundary is not comparable to another product''s.'
+ description: 'CO₂e per unit: manufacturer-supplied or engine-calculated. An object, not a bare number: a figure without its lifecycle stage and system boundary is not comparable to another product''s.'
anyOf:
- $ref: '#/components/schemas/CarbonFootprint'
- type: 'null'
repairabilityScore:
- description: Non-regulatory repairability heuristic — see the schema's own note.
+ description: Non-regulatory repairability heuristic. See the schema's own note.
anyOf:
- $ref: '#/components/schemas/RepairabilityScore'
- type: 'null'
@@ -4191,11 +4973,11 @@ components:
lintResult:
allOf:
- $ref: '#/components/schemas/LintResult'
- description: Advisory plausibility findings. Absent until a lint pass has run, and recomputable after publish — unlike `complianceResult`.
+ description: Advisory plausibility findings. Absent until a lint pass has run, and recomputable after publish, unlike `complianceResult`.
productGroupData:
description: |-
On an **authenticated full read**, explicitly `null` rather than omitted for a passport whose product group data has not been supplied yet, which is every draft created without it: the field has no `skip_serializing_if`.
- On a **redacted read** — the public routes, the resolver, and an audience-scoped credential read — the key is **absent** instead. A view should not carry a key whose value says "there is nothing here", so the redaction drops it. Read an absent key and a `null` as the same answer; neither is in `required`, and which one arrives depends on the route.
+ On a **redacted read** (the public routes, the resolver, and an audience-scoped credential read) the key is **absent** instead. A view should not carry a key whose value says "there is nothing here", so the redaction drops it. Read an absent key and a `null` as the same answer; neither is in `required`, and which one arrives depends on the route.
anyOf:
- $ref: '#/components/schemas/ProductGroupData'
- type: 'null'
@@ -4217,7 +4999,7 @@ components:
description: Compact JWS (Ed25519) over the **full** canonical payload. Null until published.
publicJwsSignature:
type: string
- description: Compact JWS over the **public (redacted) view**, so anyone can verify the public passport independently — the resolver checks this on the unauthenticated public route. Set at publish; absent for drafts.
+ description: 'Compact JWS over the **public (redacted) view**, so anyone can verify the public passport independently: the resolver checks this on the unauthenticated public route. Set at publish; absent for drafts.'
disclosureSignatures:
type: object
additionalProperties:
@@ -4237,10 +5019,10 @@ components:
placedOnMarketDate:
type: string
format: date
- description: The date the product was placed on the EU market — the regulated triggering event fixing **which law governs it**, distinct from the three lifecycle dates above, none of which selects a rule. Staged EU obligations attach at placing on the market and do not move afterwards. Absence means the date was not declared; it is **not** licence to substitute the current date, and a determination depending on it has no answer.
+ description: 'The date the product was placed on the EU market: the regulated triggering event fixing **which law governs it**, distinct from the three lifecycle dates above, none of which selects a rule. Staged EU obligations attach at placing on the market and do not move afterwards. Absence means the date was not declared; it is **not** licence to substitute the current date, and a determination depending on it has no answer.'
schemaVersion:
type: string
- description: Semantic version of the **product group** schema `productGroupData` was validated against. Scoped to `productGroupData` only — the envelope fields have no equivalent version and never will, because they are shared by every product group's stored documents. The envelope's compatibility rule is additive only, permanently.
+ description: 'Semantic version of the **product group** schema `productGroupData` was validated against. Scoped to `productGroupData` only: the envelope fields have no equivalent version and never will, because they are shared by every product group''s stored documents. The envelope''s compatibility rule is additive only, permanently.'
example: 1.0.0
retentionLocked:
type: boolean
@@ -4259,13 +5041,18 @@ components:
type: array
description: |-
Cross-operator references to the predecessors this passport derives from (second-life successor linkage), each naming the operation that produced this unit from it.
- A list rather than the single `parentPassportRef` it replaces: Regulation (EU) 2023/1542 Art. 77(7) is plural on both sides — "linked to the battery passport or passports of the original battery or batteries" — so one second-life unit may derive from several predecessors.
+ A list rather than the single `parentPassportRef` it replaces: Regulation (EU) 2023/1542 Art. 77(7) is plural on both sides ("linked to the battery passport or passports of the original battery or batteries") so one second-life unit may derive from several predecessors.
items:
$ref: '#/components/schemas/DerivationRef'
+ personalData:
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/PersonalDataStatement'
+ description: 'What the operator states about personal data in the marked fields of `productGroupData`, keyed by dotted field path. Absent when it states nothing. On a **redacted read** the key is absent: a statement is shown only to an audience that sees the field it speaks about, and never to the public.'
componentRefs:
type: array
description: |-
- Cross-operator references to the constituent passports this product is assembled from — its bill of materials, each qualified by how much and in what role. The inverse edge of `derivedFrom`: these point down to the constituents, those point up to the predecessors.
+ Cross-operator references to the constituent passports this product is assembled from: its bill of materials, each qualified by how much and in what role. The inverse edge of `derivedFrom`: these point down to the constituents, those point up to the predecessors.
Distinct from `materials`, which lists substances by weight. These point at other products that have passports of their own.
items:
$ref: '#/components/schemas/ComponentRef'
@@ -4281,11 +5068,11 @@ components:
description: Opaque link to an internal product-template record. Not a legal identifier.
commodityCode:
type: string
- description: Customs tariff classification — HS-6, CN-8 or TARIC-10. Absent where the product group does not call for one; this node will not invent a classification it cannot derive.
+ description: 'Customs tariff classification: HS-6, CN-8 or TARIC-10. Absent where the product group does not call for one; this node will not invent a classification it cannot derive.'
example: '85076000'
operatorIdentifier:
type: string
- description: 'EORI or national economic-operator identifier for the responsible party (Regulation (EU) 2024/1781 Annex III(k); issuance mechanics in Art. 12). **Frozen at publish — this is the operator that published the passport, not necessarily the one responsible for it now.** A transfer of responsibility does not rewrite it and cannot: published content is immutable and covered by the signature over it. For current responsibility, read the transfer chain.'
+ description: 'EORI or national economic-operator identifier for the responsible party (Regulation (EU) 2024/1781 Annex III(k); issuance mechanics in Art. 12). **Frozen at publish: this is the operator that published the passport, not necessarily the one responsible for it now.** A transfer of responsibility does not rewrite it and cannot: published content is immutable and covered by the signature over it. For current responsibility, read the transfer chain.'
example: DE123456789
responsibleOperator:
allOf:
@@ -4322,7 +5109,7 @@ components:
- `active`: published and signed; publicly resolvable via QR
- `suspended`: temporarily hidden (recall, dispute); JWS preserved
- `retired`: post-retention; immutable; retained for regulatory record-keeping.
- Not archiving — see `GET /dpp/{dppId}/versions` for EN 18221 clause 4.2
+ Not archiving: see `GET /dpp/{dppId}/versions` for EN 18221 clause 4.2
- `superseded`: replaced by a newer passport version; terminal
- `deactivated`: end-of-life declared (recycled, destroyed under a
derogation, exported, or lost); terminal. The typed reason is carried by
@@ -4337,7 +5124,7 @@ components:
`retired`, `superseded` and `deactivated` are terminal.
`archived` is refused on input. It was this status's wire value and now names
- only what EN 18221 clause 4.2 means by it — the retention of historical
+ only what EN 18221 clause 4.2 means by it: the retention of historical
versions of a passport that is still live.
Granularity:
type: string
@@ -4350,7 +5137,7 @@ components:
Set by the applicable delegated act (ESPR Art. 9(2)(d)), so it is a property
of the law rather than a choice made here, and unset while no adopted act has
- fixed one — which is every product group today.
+ fixed one, which is every product group today.
Unset is not `item`: the EU registry registers batteries per item, but that is
the registry's operational position, not a level any act has set.
@@ -4376,20 +5163,20 @@ components:
type:
- string
- 'null'
- description: Registered trade name or trade mark, where it differs from `name`. Art. 27(6) names it separately from the legal name — "name, registered trade name or registered trade mark" — because the two routinely differ, and the one a reader holding the product sees is the trading one. Absent means not stated, including the common case where the legal name is the trading name.
+ description: Registered trade name or trade mark, where it differs from `name`. Art. 27(6) names it separately from the legal name ("name, registered trade name or registered trade mark") because the two routinely differ, and the one a reader holding the product sees is the trading one. Absent means not stated, including the common case where the legal name is the trading name.
example: Nordwerk
electronicAddress:
type:
- string
- 'null'
- description: 'Electronic means of contact — an email address or a contact URL. Not `didWebUrl`: a DID document resolves keys, and nothing in it need be a mailbox or a form, so treating it as one would satisfy Art. 27(6) on paper while leaving a reader with no way to reach anybody.'
+ description: 'Electronic means of contact: an email address or a contact URL. Not `didWebUrl`: a DID document resolves keys, and nothing in it need be a mailbox or a form, so treating it as one would satisfy Art. 27(6) on paper while leaving a reader with no way to reach anybody.'
example: compliance@nordwerk.example
country:
type:
- string
- 'null'
pattern: ^[A-Z]{2}$
- description: 'ISO 3166-1 alpha-2 country of the manufacturer, upper case. Structural rather than descriptive: whether an operator is established in the Union separates a manufacturer from an importer or an authorised representative, and that decides who carries the passport obligation. Before this field existed the country was written into `address`, where nothing downstream could tell it apart from a postal address. Absent means not stated — never stateless.'
+ description: 'ISO 3166-1 alpha-2 country of the manufacturer, upper case. Structural rather than descriptive: whether an operator is established in the Union separates a manufacturer from an importer or an authorised representative, and that decides who carries the passport obligation. Before this field existed the country was written into `address`, where nothing downstream could tell it apart from a postal address. Absent means not stated, never stateless.'
example: DE
didWebUrl:
type: string
@@ -4453,7 +5240,7 @@ components:
type: object
description: |
Product group-specific data, **internally tagged** by a `productGroup`
- discriminator — e.g.
+ discriminator: e.g.
`{ "productGroup": "battery", "productIdentifier": { "scheme": "gs1", "gtin": "…" }, "batteryChemistry": "LFP", … }`.
The remaining fields are product group-specific and validated against the
product group's versioned JSON schema. Product groups include `battery`, `textile`,
@@ -4508,7 +5295,7 @@ components:
value:
type: number
minimum: 0
- description: The amount, in `unit`. Refused on create and update when it is negative or not finite — a non-finite number cannot be serialised into the signed publish payload, so an unchecked one fails much later with an error that names serialisation rather than the field that caused it.
+ description: 'The amount, in `unit`. Refused on create and update when it is negative or not finite: a non-finite number cannot be serialised into the signed publish payload, so an unchecked one fails much later with an error that names serialisation rather than the field that caused it.'
example: 2
unit:
type:
@@ -4522,7 +5309,7 @@ components:
- reference
description: |-
One entry in a bill of materials: a cross-operator reference to a constituent passport, qualified by how much of it the assembly contains and in what role.
- Readers must also accept the earlier shape this replaced — a bare `PassportRef` (`uri` and `publicJwsHash` at the top level, with no `reference` key). The two are disjoint, so accepting both requires no guessing. The tolerance is not optional: `componentRefs` is part of the **signed public view** that other operators' nodes fetch, those passports are signed and cannot be rewritten by anyone, and a reader that refuses the older shape reports a correct, unforgeable document as a malformed reference — which verification grades as an integrity violation. Nodes are independent per-operator deployments, so version skew is the steady state rather than a migration window. Writers emit only this shape.
+ Readers must also accept the earlier shape this replaced: a bare `PassportRef` (`uri` and `publicJwsHash` at the top level, with no `reference` key). The two are disjoint, so accepting both requires no guessing. The tolerance is not optional: `componentRefs` is part of the **signed public view** that other operators' nodes fetch, those passports are signed and cannot be rewritten by anyone, and a reader that refuses the older shape reports a correct, unforgeable document as a malformed reference, which verification grades as an integrity violation. Nodes are independent per-operator deployments, so version skew is the steady state rather than a migration window. Writers emit only this shape.
properties:
reference:
allOf:
@@ -4536,7 +5323,7 @@ components:
type:
- string
- 'null'
- description: What part this constituent plays, in whatever terms the product group uses — "cell", "outer shell", "warp yarn". A free string because the vocabulary is the product group's to define.
+ description: 'What part this constituent plays, in whatever terms the product group uses: "cell", "outer shell", "warp yarn". A free string because the vocabulary is the product group''s to define.'
example: cell
SecondLifeOperation:
type: string
@@ -4549,10 +5336,10 @@ components:
- repurposing
- remanufacturing
x-enum-descriptions:
- preparationForReuse: Art. 3(29) — preparing for re-use as defined in Art. 3, point (16), of Directive 2008/98/EC.
- preparationForRepurposing: Art. 3(30) — a waste battery, or parts thereof, prepared so that it can be used for a different purpose than the one it was designed for.
- repurposing: Art. 3(31) — a battery that is not a waste battery, or parts thereof, used for a purpose other than the one it was designed for. Differs from `preparationForRepurposing` by the waste status of the input.
- remanufacturing: Art. 3(32) — disassembly and evaluation of all cells and modules, and re-use of a number of them, to restore capacity to at least 90 % of the original rated capacity, for the same purpose as originally designed.
+ preparationForReuse: 'Art. 3(29): preparing for re-use as defined in Art. 3, point (16), of Directive 2008/98/EC.'
+ preparationForRepurposing: 'Art. 3(30): a waste battery, or parts thereof, prepared so that it can be used for a different purpose than the one it was designed for.'
+ repurposing: 'Art. 3(31): a battery that is not a waste battery, or parts thereof, used for a purpose other than the one it was designed for. Differs from `preparationForRepurposing` by the waste status of the input.'
+ remanufacturing: 'Art. 3(32): disassembly and evaluation of all cells and modules, and re-use of a number of them, to restore capacity to at least 90 % of the original rated capacity, for the same purpose as originally designed.'
DerivationRef:
type: object
required:
@@ -4566,10 +5353,64 @@ components:
description: Where to fetch the predecessor's passport, and the hash pinning its signed public view.
operation:
$ref: '#/components/schemas/SecondLifeOperation'
+ PersonalDataStatement:
+ description: |-
+ What the operator states about the personal data related to one field of
+ `productGroupData` that the product group's schema marks as able to hold it
+ (`x-personal-data`). Either nothing related is held, or it is held outside the
+ passport in an erasable record.
+
+ Every statement asserts that the field's value carries no personal data beyond
+ what the governing act requires the passport to carry. The personal data
+ itself is never in the passport: a published passport is signed, frozen,
+ archived and copied to a back-up provider, so it cannot be erased from, and
+ withdrawn consent (GDPR Art. 7(3)) obliges erasure (Art. 17(1)(b)).
+
+ Where a governing act admits customer personal data only with explicit consent
+ (ESPR Art. 10(1)(e), Reg. (EU) 2025/2509 Art. 20(10), Reg. (EU) 2026/405
+ Art. 22(h)), a basis other than `consent` is refused. The record named by
+ `record` is not served by any route of this node.
+ oneOf:
+ - type: object
+ title: Nothing held
+ required:
+ - held
+ properties:
+ held:
+ type: string
+ enum:
+ - nothing
+ additionalProperties: false
+ - type: object
+ title: Held outside the passport
+ required:
+ - held
+ - lawfulBasis
+ - record
+ properties:
+ held:
+ type: string
+ enum:
+ - outside
+ lawfulBasis:
+ type: string
+ description: The ground of GDPR Art. 6(1) the data is held on.
+ enum:
+ - consent
+ - contract
+ - legalObligation
+ - vitalInterests
+ - publicTask
+ - legitimateInterests
+ record:
+ type: string
+ minLength: 1
+ description: The identifier of the erasable record holding the data. Required, and not blank.
+ additionalProperties: false
LifeStatus:
type: string
description: |-
- Where a unit sits in its product life — original, or the second-life operation that produced it, or waste. Regulation (EU) 2023/1542, Annex XIII point 4(c).
+ Where a unit sits in its product life: original, or the second-life operation that produced it, or waste. Regulation (EU) 2023/1542, Annex XIII point 4(c).
Orthogonal to `status`, which is the passport record's own lifecycle (draft/published/…). A published passport can be `waste`; a draft cannot be `superseded`.
Not derived from `derivedFrom`. Art. 77(7) permits several predecessors with nothing forcing them to share an operation, so a unit built from one repurposed and one remanufactured predecessor has no unambiguous derived status. The claim is stored and then checked: at least one derivation edge must support it.
enum:
@@ -4580,7 +5421,7 @@ components:
- waste
CarbonFootprint:
type: object
- description: A CO₂-equivalent figure with the LCA context needed to read it. A bare number is not comparable across products — the lifecycle stage and system boundary are what make two figures mean the same thing.
+ description: 'A CO₂-equivalent figure with the LCA context needed to read it. A bare number is not comparable across products: the lifecycle stage and system boundary are what make two figures mean the same thing.'
required:
- valueKg
properties:
@@ -4615,7 +5456,7 @@ components:
example: B
RepairabilityScore:
type: object
- description: Repairability as a **non-regulatory heuristic**. Deliberately not an EN 45554 or Regulation (EU) 2023/1669 index — those have prescribed methodologies this does not implement, and presenting a heuristic as either would misstate it.
+ description: 'Repairability as a **non-regulatory heuristic**. Deliberately not an EN 45554 or Regulation (EU) 2023/1669 index: those have prescribed methodologies this does not implement, and presenting a heuristic as either would misstate it.'
required:
- overall
properties:
@@ -4646,7 +5487,7 @@ components:
type: number
ComplianceResult:
type: object
- description: The computed compliance determination. Part of the signed passport payload and immutable after retention lock. Absent until a determination has been computed — for example on a product group with no plugin loaded.
+ description: The computed compliance determination. Part of the signed passport payload and immutable after retention lock. Absent until a determination has been computed, for example on a product group with no plugin loaded.
required:
- co2eScore
- repairabilityIndex
@@ -4671,12 +5512,12 @@ components:
$ref: '#/components/schemas/ComplianceStatus'
violations:
type: array
- description: Binding findings — these block publish when the product group is in force. Empty for passthrough or not-assessed determinations.
+ description: 'Binding findings: these block publish when the product group is in force. Empty for passthrough or not-assessed determinations.'
items:
$ref: '#/components/schemas/ComplianceFinding'
warnings:
type: array
- description: Advisory findings — surfaced but never blocking (e.g. thresholds not yet in force).
+ description: 'Advisory findings: surfaced but never blocking (e.g. thresholds not yet in force).'
items:
$ref: '#/components/schemas/ComplianceFinding'
rulesetVersion:
@@ -4691,7 +5532,7 @@ components:
description: Calculation receipt (input hash, ruleset id and version, factor dataset version and table hash) for notified-body audit. Present only when a calculation actually ran.
ComplianceStatus:
type: string
- description: Overall compliance determination. `PASSTHROUGH_NO_VALIDATION` means no product group plugin was loaded and nothing was assessed — it is not a pass.
+ description: 'Overall compliance determination. `PASSTHROUGH_NO_VALIDATION` means no product group plugin was loaded and nothing was assessed: it is not a pass.'
enum:
- PASSTHROUGH_NO_VALIDATION
- COMPLIANT
@@ -4700,7 +5541,7 @@ components:
- NOT_IMPLEMENTED
ComplianceFinding:
type: object
- description: A single compliance finding. Severity is encoded by which array it lands in on `ComplianceResult` — `violations` bind, `warnings` advise — so there is no separate severity field.
+ description: A single compliance finding. Severity is encoded by which array it lands in on `ComplianceResult` (`violations` bind, `warnings` advise) so there is no separate severity field.
required:
- code
- message
@@ -4717,7 +5558,7 @@ components:
type: string
LintResult:
type: object
- description: Non-binding plausibility findings — arithmetic and physical-plausibility checks, distinct from binding compliance rules. Never gates publish, and may be recomputed at any time after publish via `POST /dpp/{dppId}/lint` (unlike `complianceResult`, which is frozen into the signed payload).
+ description: 'Non-binding plausibility findings: arithmetic and physical-plausibility checks, distinct from binding compliance rules. Never gates publish, and may be recomputed at any time after publish via `POST /dpp/{dppId}/lint` (unlike `complianceResult`, which is frozen into the signed payload).'
required:
- packVersion
- assessedAt
@@ -4753,7 +5594,7 @@ components:
type: string
LintSeverity:
type: string
- description: Severity of a plausibility finding. Neither value blocks publish — lint is advisory by construction, unlike a compliance violation.
+ description: 'Severity of a plausibility finding. Neither value blocks publish: lint is advisory by construction, unlike a compliance violation.'
enum:
- WARNING
- NOTICE
@@ -4789,9 +5630,9 @@ components:
Who asserted that an act applies. Read it as provenance, not as how much to
trust the entry.
- `catalog` — resolved from the instrument catalog.
+ `catalog`: resolved from the instrument catalog.
- `operator` — asserted by the economic operator placing the product on the
+ `operator`: asserted by the economic operator placing the product on the
market. **Not a fallback.** The catalog cannot be exhaustive: horizontal
ecodesign requirements cover sets of products that were never shortlisted as
product groups, so an act may apply to a product while reaching no product
@@ -4800,7 +5641,7 @@ components:
example: catalog
SealedEnvelope:
type: object
- description: An eIDAS electronic seal over the passport's full-payload signature. Check `placeholder` before treating it as evidence — a placeholder envelope is produced when no QTSP is configured and carries no legal validity.
+ description: 'An eIDAS electronic seal over the passport''s full-payload signature. Check `placeholder` before treating it as evidence: a placeholder envelope is produced when no QTSP is configured and carries no legal validity.'
required:
- format
- sealValue
@@ -4820,8 +5661,8 @@ components:
- $ref: '#/components/schemas/SealConformanceLevel'
description: |-
The baseline level this seal was **requested** at.
- A record of what was asked for, not proof of what arrived — the same standing as `signingCertRef`, which names the certificate the seal claims rather than one anybody verified. What the bytes actually carry is read out of the envelope by a validator, and the two agreeing is the cross-check.
- Absent means **not recorded** — an envelope written before this field existed, or a seal restored from a backup or produced elsewhere. It never means the level was low.
+ A record of what was asked for, not proof of what arrived: the same standing as `signingCertRef`, which names the certificate the seal claims rather than one anybody verified. What the bytes actually carry is read out of the envelope by a validator, and the two agreeing is the cross-check.
+ Absent means **not recorded**: an envelope written before this field existed, or a seal restored from a backup or produced elsewhere. It never means the level was low.
sealedAt:
type: string
format: date-time
@@ -4839,18 +5680,18 @@ components:
SealConformanceLevel:
type: string
description: |-
- How much validation material a seal carries with it — the AdES baseline levels, named as the CSC API names them. They are cumulative: each adds to the one before.
- The level decides whether a verifier years from now can still establish that the seal was valid when it was made. A `baseline-b` seal stops verifying when its signing certificate expires, ESPR retention outlives certificate lifetimes comfortably, the seal is bought once, and the document it covers is retention-locked — so the choice cannot be corrected afterwards by re-sealing.
+ How much validation material a seal carries with it: the AdES baseline levels, named as the CSC API names them. They are cumulative: each adds to the one before.
+ The level decides whether a verifier years from now can still establish that the seal was valid when it was made. A `baseline-b` seal stops verifying when its signing certificate expires, ESPR retention outlives certificate lifetimes comfortably, the seal is bought once, and the document it covers is retention-locked, so the choice cannot be corrected afterwards by re-sealing.
enum:
- baseline-b
- baseline-t
- baseline-lt
- baseline-lta
x-enum-descriptions:
- baseline-b: '`AdES-B-B` — the signature alone. No timestamp, no validation material. Verifiable only while the signing certificate is valid and its status is still resolvable. Adequate for a short-lived attestation, not for a passport.'
- baseline-t: '`AdES-B-T` — adds a trusted timestamp, so the signing time is established independently of the signer''s clock.'
- baseline-lt: '`AdES-B-LT` — adds the certificates and revocation data a verifier needs, so the seal remains verifiable after the signing certificate expires. The first level that survives certificate expiry, and therefore the first that suits a retention-locked document.'
- baseline-lta: '`AdES-B-LTA` — adds archival timestamps, extending validity past the cryptographic lifetime of the algorithms themselves.'
+ baseline-b: '`AdES-B-B`: the signature alone. No timestamp, no validation material. Verifiable only while the signing certificate is valid and its status is still resolvable. Adequate for a short-lived attestation, not for a passport.'
+ baseline-t: '`AdES-B-T`: adds a trusted timestamp, so the signing time is established independently of the signer''s clock.'
+ baseline-lt: '`AdES-B-LT`: adds the certificates and revocation data a verifier needs, so the seal remains verifiable after the signing certificate expires. The first level that survives certificate expiry, and therefore the first that suits a retention-locked document.'
+ baseline-lta: '`AdES-B-LTA`: adds archival timestamps, extending validity past the cryptographic lifetime of the algorithms themselves.'
CreatePassportRequest:
type: object
required:
@@ -4869,7 +5710,7 @@ components:
type: string
description: |
EU ESPR product group (the dispatch key), e.g. `battery`, `textile`,
- `electronics`. Optional — derived from `productGroupData` when omitted.
+ `electronics`. Optional: derived from `productGroupData` when omitted.
example: battery
manufacturer:
$ref: '#/components/schemas/ManufacturerInfo'
@@ -4889,7 +5730,7 @@ components:
minimum: 0
maximum: 10
description: |-
- Non-regulatory repairability heuristic, **0–10**. Not EN 45554 or EU 2023/1669 — those have prescribed methodologies this does not implement. Anything outside 0–10 is rejected with `422`.
+ Non-regulatory repairability heuristic, **0–10**. Not EN 45554 or EU 2023/1669: those have prescribed methodologies this does not implement. Anything outside 0–10 is rejected with `422`.
Supplied here as a scalar and stored as a `RepairabilityScore` object, so the value echoed back on `PassportResponse` is `{ "overall": … }` rather than the bare number sent.
example: 7.5
productGroupData:
@@ -4905,7 +5746,7 @@ components:
type: string
format: date
description: |
- The date this product was placed on the EU market — the regulated
+ The date this product was placed on the EU market: the regulated
triggering event that fixes which law governs it.
Optional, and omitting it is not neutral. A compliance determination
@@ -4919,7 +5760,7 @@ components:
type: string
description: |
Product group schema version. Optional, and the only accepted value is the
- product group's **current** version — omitting it is equivalent. Any other
+ product group's **current** version: omitting it is equivalent. Any other
value is rejected with `422`.
It is not the caller's to choose: the stored version selects the
@@ -4938,15 +5779,20 @@ components:
allOf:
- $ref: '#/components/schemas/CreateLifeStatus'
description: |-
- Where this unit sits in its **product** life — Annex XIII point 4(c) of Regulation (EU) 2023/1542.
+ Where this unit sits in its **product** life: Annex XIII point 4(c) of Regulation (EU) 2023/1542.
- Orthogonal to `status`, which is the *publication* lifecycle: a `repurposed` unit's passport is `active` like any other. Omit it for any product group but battery — only Reg. (EU) 2023/1542 defines this vocabulary, and a textile passport asserting `original` would be borrowing a battery term for a question its own instrument does not ask. Sending it for another product group is refused.
+ Orthogonal to `status`, which is the *publication* lifecycle: a `repurposed` unit's passport is `active` like any other. Omit it for any product group but battery: only Reg. (EU) 2023/1542 defines this vocabulary, and a textile passport asserting `original` would be borrowing a battery term for a question its own instrument does not ask. Sending it for another product group is refused.
**This is the only way to set it.** `lifeStatus` is protected from patching, because it is part of a body that gets signed and rewriting it after publication would change what a proof covers.
- 🚨 **`waste` is refused here.** The other four describe how a unit came to be, and Art. 77(7) makes each operation produce a *new* passport — so a repurposed unit is created as `repurposed`. `waste` is the one value that happens to a record which continues, and under that article's second subparagraph it moves responsibility as well, so it belongs to a versioning event on the passport becoming waste rather than to the creation of a new one.
+ **`waste` is refused here.** The other four describe how a unit came to be, and Art. 77(7) makes each operation produce a *new* passport, so a repurposed unit is created as `repurposed`. `waste` is the one value that happens to a record which continues, and under that article's second subparagraph it moves responsibility as well, so it belongs to a versioning event on the passport becoming waste rather than to the creation of a new one.
- Omitting it is lawful everywhere. For a battery it reads as *not stated* rather than *not applicable*, and publish does not refuse it — the lint result says so instead, because a default would put a claim about a unit onto a record that is about to be signed.
+ Omitting it is lawful everywhere. For a battery it reads as *not stated* rather than *not applicable*, and publish does not refuse it: the lint result says so instead, because a default would put a claim about a unit onto a record that is about to be signed.
+ personalData:
+ type: object
+ additionalProperties:
+ $ref: '#/components/schemas/PersonalDataStatement'
+ description: What the operator states about personal data, keyed by the dotted path of each field of `productGroupData` the product group schema marks as able to hold it (for example `usageHistory.negativeEvents`). A marked field with a value is refused with a `422` naming it, on create and on every later write to the draft, unless it has an entry here. A statement about a field that is not marked, or an `outside` statement with a blank record, is refused too. Patchable on a draft, frozen at publish, and covered by the operator's signature. The personal data itself never goes in the passport.
componentRefs:
type: array
items:
@@ -4954,7 +5800,7 @@ components:
description: Cross-operator references to this product's constituent passports (its bill of materials), each optionally qualified by how much and in what role. Local cycles / over-depth are refused at create/update; immutable after publish.
commodityCode:
type: string
- description: Customs tariff classification — HS-6, CN-8 or TARIC-10 (6, 8 or 10 digits, no separators). Registration data the EU registry verifies against the ranges its product group permits.
+ description: 'Customs tariff classification: HS-6, CN-8 or TARIC-10 (6, 8 or 10 digits, no separators). Registration data the EU registry verifies against the ranges its product group permits.'
example: '85076000'
supersedesId:
allOf:
@@ -4965,26 +5811,57 @@ components:
Declared here because `supersedesId` is protected: it is set by the write
that creates the whole record, never by a field patch. Recording the link
- retires nothing — the predecessor is retired by
+ retires nothing: the predecessor is retired by
`POST /dpp/{dppId}/supersede` once this successor is published, and that
route checks the two agree.
Only for a successor created independently. `POST /dpp/{dppId}/amend`
mints its own successor and sets this field itself; it is not settable
through that route and does not need to be.
+ carrierSerial:
+ type: string
+ minLength: 1
+ maxLength: 20
+ description: |
+ The serial the passport's GS1 data carrier prints in AI 21, attributed by
+ the operator. Omitted, the carrier prints a default derived from the
+ passport id. An operator that already serialises its units states that
+ serial here, so the printed label names the passport under the serial the
+ unit already carries. Art. 77(3) of Regulation (EU) 2023/1542 puts the
+ choice of this identifier on the economic operator.
+
+ One to twenty characters of GS1's CSET 82 set, which is how AI 21 is
+ defined: letters, digits and a few punctuation marks, but no space.
+ Refused with `422` otherwise, and refused on a passport that is not
+ identified by a GTIN, because only a GTIN has a GS1 carrier.
+
+ **Unique under its GTIN.** A label that names two passports resolves to
+ neither, so a serial another passport already holds is refused with `409`.
+ The passport named in `supersedesId` is the exception: a successor shares
+ its predecessor's serial, because one label names the whole amendment
+ chain. The label keeps answering with the predecessor until it is
+ superseded, and with the successor from then on.
+
+ Not the manufacturer's `serialNumber`, though an operator may state the
+ same value for both. Nothing copies one into the other.
+
+ **Create-time only.** The carrier is stamped at publish, and an amendment
+ carries it forward. A `PUT` or an amendment naming a different serial is
+ refused with `422`.
+ example: SN-2026-0001
SuspendRequest:
type: object
description: |
Optional body for suspending a published passport.
- The body itself is optional — `POST` with no body suspends without a recorded
+ The body itself is optional: `POST` with no body suspends without a recorded
reason. Where a reason is supplied it is appended to the audit entry, not
stored on the passport, so it is not part of the signed document.
properties:
reason:
type: string
description: Human-readable reason for the suspension, appended to the audit trail.
- example: Product recall — safety investigation pending
+ example: Product recall, safety investigation pending
EolRequest:
type: object
required:
@@ -5072,7 +5949,7 @@ components:
fromOperator:
allOf:
- $ref: '#/components/schemas/ResponsibleOperator'
- description: The current (outgoing) responsible operator — must match the chain head.
+ description: The current (outgoing) responsible operator. Must match the chain head.
toOperator:
allOf:
- $ref: '#/components/schemas/ResponsibleOperator'
@@ -5111,13 +5988,45 @@ components:
$ref: '#/components/schemas/PassportResponse'
total:
type: integer
- description: Total matching the filter across every page — deliberately not the length of `dpps`.
+ description: 'Total matching the filter across every page: deliberately not the length of `dpps`.'
limit:
type: integer
description: The page size actually applied, after clamping.
skip:
type: integer
description: The offset this page starts at.
+ PersonalDataErasureReceipt:
+ type: object
+ description: |-
+ What is left of an erased record of personal data: which record it was, which
+ passport and field it related to, and when it was erased. None of the erased
+ content.
+
+ The tombstone is not free of personal data. A passport identifier can relate to
+ whoever owns the item (GDPR Recital 26), so the receipt is as sensitive as the
+ passport's individual-item data and is kept only as long as the operator has a
+ basis to keep it.
+ required:
+ - record
+ - passportId
+ - field
+ - erasedAt
+ properties:
+ record:
+ type: string
+ description: The erased record's identifier, as the passport's statement names it.
+ passportId:
+ type: string
+ format: uuid
+ description: The passport the record related to.
+ field:
+ type: string
+ description: The marked field the record related to, as a dotted path inside `productGroupData`.
+ example: usageHistory.negativeEvents
+ erasedAt:
+ type: string
+ format: date-time
+ description: When the record's content was erased.
ValidateResponse:
type: object
description: 'The dry-run verdict. Two booleans rather than one, because create and publish deliberately differ: a body can be creatable as a draft and not yet publishable, and collapsing that into a single flag would hide the gap until the caller tried to publish.'
@@ -5127,7 +6036,7 @@ components:
properties:
createValid:
type: boolean
- description: Always `true` on a 200 — a body create would reject gets back the identical 422 create would have returned, not a paraphrase of it.
+ description: 'Always `true` on a 200: a body create would reject gets back the identical 422 create would have returned, not a paraphrase of it.'
example: true
productGroupDataValid:
type: boolean
@@ -5143,7 +6052,7 @@ components:
content gate, reachable only by attempting the lifecycle transition; and
the compliance gate, which needs a `placedOnMarketDate` and a stored
passport. `true` means "this body clears the schema gate", never "publish
- will succeed" — the field was called `publishValid` and was renamed
+ will succeed": the field was called `publishValid` and was renamed
because that name promised the latter.
example: false
detail:
@@ -5151,7 +6060,7 @@ components:
- string
- 'null'
description: Why the product group data would be refused. Null when `productGroupDataValid` is true.
- example: 'cannot publish: no registered JSON Schema for product group ''furniture'' — publish requires a resolvable schema when product group data is present'
+ example: 'cannot publish: no registered JSON Schema for product_group ''furniture'' — publish requires a resolvable schema when product_group data is present'
PassportAuditEntry:
type: object
required:
@@ -5192,7 +6101,7 @@ components:
- string
- 'null'
description: |-
- The `x-request-id` of the HTTP request that produced this entry — the same value returned in that request's response header, so a support conversation can be traced from a client's log to the trail. Null for an entry written outside a request, and for every entry written before this field was populated.
+ The `x-request-id` of the HTTP request that produced this entry: the same value returned in that request's response header, so a support conversation can be traced from a client's log to the trail. Null for an entry written outside a request, and for every entry written before this field was populated.
Deliberately **not** covered by `entryHash`: it describes the transport that carried the change, not the change, and folding it in would invalidate the chain of every entry already stored.
prevHash:
@@ -5325,7 +6234,7 @@ components:
type:
- string
- 'null'
- description: Scheme euOperatorId is expressed in — "vat", "lei", "eori", "duns".
+ description: Scheme `euOperatorId` is expressed in, one of "vat", "lei", "eori", "duns".
registeredTradeName:
type:
- string
@@ -5342,7 +6251,7 @@ components:
type:
- string
- 'null'
- description: Electronic means of contact — an email address or a contact URL.
+ description: 'Electronic means of contact: an email address or a contact URL.'
example: compliance@nordwerk.example
country:
type: string
@@ -5352,7 +6261,7 @@ components:
case.
Checked against the assigned ISO 3166-1 list on
- `POST /dpp/{dppId}/transfer/initiate`, not merely shaped — `de` and `XX`
+ `POST /dpp/{dppId}/transfer/initiate`, not merely shaped: `de` and `XX`
are both refused with `422`. Canonical form is required rather than
normalised because both operators are inside the payload this node signs,
and upper-casing a caller's value before signing would sign something they
@@ -5389,7 +6298,7 @@ components:
- type: object
required:
- otherUnionLaw
- description: '"Similar tasks pursuant to other Union law applicable to the product" — Annex III(k)''s own catch-all.'
+ description: '"Similar tasks pursuant to other Union law applicable to the product": Annex III(k)''s own catch-all.'
properties:
otherUnionLaw:
type: object
@@ -5407,7 +6316,7 @@ components:
- basis
description: |-
Annex III(k)'s elements as the passport carries them: who is answerable for the product, and under which law.
- A snapshot, not a live pointer. A published passport is signed, so the operator recorded in it is the one that version was issued under — a later transfer of responsibility mints a new version rather than rewriting this.
+ A snapshot, not a live pointer. A published passport is signed, so the operator recorded in it is the one that version was issued under: a later transfer of responsibility mints a new version rather than rewriting this.
properties:
operator:
$ref: '#/components/schemas/ResponsibleOperator'
@@ -5415,7 +6324,7 @@ components:
$ref: '#/components/schemas/ResponsibilityBasis'
SealResponse:
type: object
- description: The eIDAS seal, plus what is needed to check it — and an explicit statement of what this node did **not** check.
+ description: The eIDAS seal, plus what is needed to check it, and an explicit statement of what this node did **not** check.
required:
- declaredBy
- format
@@ -5442,12 +6351,12 @@ components:
sealedAt:
type: string
format: date-time
- description: '**This node''s clock when the backend answered — not a trusted timestamp.** Not necessarily when the signature was formed. A seal carries an independently established signing time only from baseline level `T` upward, where a timestamp authority attests it; at `B` there is no such token anywhere in the envelope, so this is an unattested claim by the party that bought the seal. Anything resting on *when* the seal was made must read the timestamp token out of `sealValue`.'
+ description: '**This node''s clock when the backend answered, not a trusted timestamp.** Not necessarily when the signature was formed. A seal carries an independently established signing time only from baseline level `T` upward, where a timestamp authority attests it; at `B` there is no such token anywhere in the envelope, so this is an unattested claim by the party that bought the seal. Anything resting on *when* the seal was made must read the timestamp token out of `sealValue`.'
signingCertRef:
type:
- string
- 'null'
- description: Hex SHA-256 of the certificate the seal names as its signer, **as reported by the seal** — read out of the CAdES, never verified. It answers *which* certificate to ask about, not whether that certificate was qualified or on the EU Trusted List. Null when the seal predates extraction or could not be parsed.
+ description: 'Hex SHA-256 of the certificate the seal names as its signer, **as reported by the seal**: read out of the CAdES, never verified. It answers *which* certificate to ask about, not whether that certificate was qualified or on the EU Trusted List. Null when the seal predates extraction or could not be parsed.'
attestedSealedAt:
type:
- string
@@ -5456,13 +6365,13 @@ components:
description: |-
**When a timestamp authority attests the seal was made.**
- `sealedAt` is the sealing node's own clock and an unattested claim by the party that bought the seal. This is a third party's statement, read out of the time-stamp token inside `sealValue` — the only place in a seal an attested time can be.
+ `sealedAt` is the sealing node's own clock and an unattested claim by the party that bought the seal. This is a third party's statement, read out of the time-stamp token inside `sealValue`: the only place in a seal an attested time can be.
Checked rather than merely read: the token's own signature is verified and its imprint is matched against this seal's signature. The attribute carrying the token is *unsigned*, so a genuine token lifted from another seal would otherwise be accepted and report someone else's time as this one's.
`null` for a `B-B` seal, which carries no token, and for a token that failed either check.
- **Attested is not trusted.** A qualified electronic time stamp is a QTSP's service (Art. 42) and the presumption of accuracy attaches to that (Art. 41(2)); establishing it is a Trusted List question about the `TSA/QTST` service type, which this node cannot yet ask. A self-signed authority's token verifies perfectly and means nothing.
+ **Attested is not trusted.** A qualified electronic time stamp is a QTSP's service (Art. 42) and the presumption of accuracy attaches to that (Art. 41(2)); whether the authority is one is a Trusted List question about the `TSA/QTST` service type, answered by `timestampAuthority`. A self-signed authority's token verifies perfectly and means nothing, so this time is **shown** whatever that says, but counts as a proof of existence (`certificate.judgedAt.attested`) only when `timestampAuthority` is `qualifiedAtStamping`.
conformanceLevel:
oneOf:
- $ref: '#/components/schemas/SealConformanceLevel'
@@ -5475,7 +6384,7 @@ components:
description: |-
The baseline level the seal's **bytes** carry.
- The pair is the point. A provider enabled for a weaker profile than was paid for returns a seal that is correct in every record this node keeps and stops verifying when its signing certificate expires — years later, on a passport that is retention-locked and cannot be re-sealed. Serving both makes that answerable from the seal rather than from a log nobody kept.
+ The pair is the point. A provider enabled for a weaker profile than was paid for returns a seal that is correct in every record this node keeps and stops verifying when its signing certificate expires: years later, on a passport that is retention-locked and cannot be re-sealed. Serving both makes that answerable from the seal rather than from a log nobody kept.
A floor, not a conformance verdict: it reports that the distinguishing material for a level is present, never that the material was validated. `null` when the bytes could not be read.
archival:
@@ -5511,7 +6420,7 @@ components:
description: |-
What **this seal's own certificate** says about who issued it: did a provider issue it, or did the node sign it itself?
- Null means **not read** — a placeholder seal, a format this node does not parse, unreadable bytes, or a deployment with no inspector wired. Never read null as "not self-issued": that is a finding, and it only comes from a certificate that was actually examined.
+ Null means **not read**: a placeholder seal, a format this node does not parse, unreadable bytes, or a deployment with no inspector wired. Never read null as "not self-issued": that is a finding, and it only comes from a certificate that was actually examined.
For what the *currently configured* backend produces, which is a different question, see `trustMode` on `GET /api/v1/seal`.
qualification:
@@ -5521,11 +6430,23 @@ components:
description: |-
What Regulation (EU) No 910/2014 Art. 32(1) says about this seal, read against the EU Trusted Lists this node holds. Art. 40 applies Art. 32 to seals *mutatis mutandis*.
- 🚨 **Read `qualification.issuer.consulted` and `.unchecked` before acting on a `notListed` standing.** That verdict is the only one claiming an absence, and an absence is only as wide as what was looked at. `consulted: 0` means no list was loaded — the answer is about nothing, and it is what a node that loaded no trusted-list cache at boot reports for every provider seal, qualified or not.
+ **Read `qualification.issuer.consulted` and `.unchecked` before acting on a `notListed` standing.** That verdict is the only one claiming an absence, and an absence is only as wide as what was looked at. `consulted: 0` means no list was loaded: the answer is about nothing, and it is what a node that loaded no trusted-list cache at boot reports for every provider seal, qualified or not.
Even at its widest this is **not** "not qualified in law": a provider can be qualified and its Member State's list wrong, which is that state's problem and not something this node can see.
- Null means **not read** — a placeholder seal, a format this node does not parse, unreadable bytes, or a deployment with no inspector wired. Never read null as "not qualified": that is a finding, and it only comes from a certificate that was actually examined.
+ Null means **not read**: a placeholder seal, a format this node does not parse, unreadable bytes, or a deployment with no inspector wired. Never read null as "not qualified": that is a finding, and it only comes from a certificate that was actually examined.
+ timestampAuthority:
+ oneOf:
+ - $ref: '#/components/schemas/TimestampStanding'
+ - type: 'null'
+ description: |-
+ Who stamped `attestedSealedAt`, and what the EU Trusted Lists say of them: Regulation (EU) No 910/2014 Art. 42 and Art. 41(2), via the `TSA/QTST` service type.
+
+ **This decides whether the time is believed.** `certificate.judgedAt.attested` is `true` only when this is `qualifiedAtStamping`. Otherwise the time is still shown and the certificate is judged against this node's own clock and reported as unproven (`outOfBoundsNoPoe`, not `expired`) so a token minted by an authority nobody lists cannot turn an out-of-window certificate into anything but an open question.
+
+ **Read `consulted` and `unchecked` before acting on a `notListed` standing**, for the reason given on `qualification`.
+
+ Null means **not read**. A seal that was read and carries no usable timestamp answers `noAttestedTime`, which is a finding.
verification:
type: string
description: 'Stated, not implied: this node did not cryptographically validate the CAdES. A detached CAdES must be checked by an independent AdES validator against the EU Trusted List.'
@@ -5534,6 +6455,7 @@ components:
description: 'Operator-wide sealing state. Read `sealingConfigured` first: when it is false every count is `0` because this node has no outbox, **not** because nothing is outstanding.'
required:
- unsealedPublished
+ - unsealedTerminal
- pending
- sealed
- exhausted
@@ -5541,7 +6463,16 @@ components:
properties:
unsealedPublished:
type: integer
- description: Published passports carrying no seal at all. `0` is the healthy state.
+ description: |-
+ Live published passports (`active` or `suspended`) carrying no seal at all. `0` is the healthy state.
+
+ Live only. A passport that was published unsealed and has since been retired, superseded or deactivated is counted in `unsealedTerminal`, so this is the number to act on without first working out which of the passports behind it still matter.
+ unsealedTerminal:
+ type: integer
+ description: |-
+ Retired, superseded or deactivated passports that were published and carry no seal. They still serve publicly and the obligation attached at publish, so the repair sweep seals them too: this is what is left of that, and it falls as the sweep works through them.
+
+ Unlike `unsealedPublished`, a non-zero value here is not by itself a call to act: the sweep is already working through it. A count that does not fall is a call to act: the seals the sweep asks for are failing, which `exhausted` counts and the node's log explains.
pending:
type: integer
sealed:
@@ -5560,7 +6491,7 @@ components:
**`null` means no pass has completed**, not that nothing is wrong. The pass walks the estate in bounded batches and starts over, so this is empty until the first one finishes, and absent entirely on a deployment that runs no audit. Reporting a zero here for a check that has not run would be the one answer worse than reporting nothing.
- A node that keeps its audit state restores the last completed report at boot, so a restart no longer empties this. Where it is still `null` after a deployment, the honest reading is that no pass has ever finished against this database — on a large estate, check the audit's cadence before concluding anything about the seals.
+ A node that keeps its audit state restores the last completed report at boot, so a restart no longer empties this. Where it is still `null` after a deployment, no pass has ever finished against this database. On a large estate, check the audit's cadence before concluding anything about the seals.
trustMode:
type:
- string
@@ -5571,7 +6502,7 @@ components:
- live
- null
description: |-
- The tier the **currently configured** sealing backend resolved to. The counts say how much sealing is outstanding; this says whether the sealing that does happen is worth anything — a node can sit at `unsealedPublished: 0` while every one of those seals was signed by a key it generated itself, and no count would show it.
+ The tier the **currently configured** sealing backend resolved to. The counts say how much sealing is outstanding; this says whether the sealing that does happen is worth anything: a node can sit at `unsealedPublished: 0` while every one of those seals was signed by a key it generated itself, and no count would show it.
A different question from the per-passport `origin`, and neither substitutes for the other: this describes the backend running now, that describes the certificate inside one stored seal. A node moved from a local backend to a QTSP last week reports `live` here and `selfIssued: true` on everything sealed before the move, and both are correct.
@@ -5587,7 +6518,7 @@ components:
party invites the reader to collapse the two, whatever anyone intended.
Every audience view strips the seal, so this is the only surface where that
- collapse is reachable — and its readers being authenticated and technical makes
+ collapse is reachable, and its readers being authenticated and technical makes
them more likely to build on the assumption, not less.
required:
- manufacturer
@@ -5603,7 +6534,7 @@ components:
type:
- string
- 'null'
- description: The Annex III(k) unique operator identifier recorded at publish. `null` means none was recorded — never that none applies.
+ description: The Annex III(k) unique operator identifier recorded at publish. `null` means none was recorded, never that none applies.
responsibilityMayHaveTransferred:
type: boolean
description: |
@@ -5611,16 +6542,16 @@ components:
so the party responsible now is not the one named above. An initiated
handover nobody accepted has moved nothing and does not set this.
- The names above are frozen into the sealed bytes and cannot be rewritten —
- a published passport's content is immutable and the seal covers it — so
- this flag is the only honest way to say the answer above is historical
- rather than current.
+ The names above are frozen into the sealed bytes and cannot be rewritten
+ (a published passport's content is immutable and the seal covers it), so
+ this flag is the only way to say the answer above is historical rather
+ than current.
note:
type: string
description: States the sealing/authorship distinction outright rather than leaving it to be inferred from field names, in the same spirit as `verification`.
SealCoverage:
type: string
- description: 'Whether the stored seal covers the passport''s current signature. Answered from this node''s record of what it *asked* to be sealed — weaker than a validator''s verdict, stronger than nothing: it cannot confirm the CAdES, but a passport re-published after sealing is knowable without any AdES tooling.'
+ description: 'Whether the stored seal covers the passport''s current signature. Answered from this node''s record of what it *asked* to be sealed: weaker than a validator''s verdict, stronger than nothing: it cannot confirm the CAdES, but a passport re-published after sealing is knowable without any AdES tooling.'
enum:
- current
- superseded
@@ -5639,12 +6570,12 @@ components:
- rearmed
- queued
description: |-
- `rearmed`: a `sealed` row was re-armed — the one path that buys a second seal for a digest already paid for, justified because the first does not verify.
+ `rearmed`: a `sealed` row was re-armed: the one path that buys a second seal for a digest already paid for, justified because the first does not verify.
`queued`: a row was queued the ordinary way. The passport was re-published since the broken seal was made, so the signature now needing a seal has never been sealed and nothing is being re-bought.
payloadHash:
type: string
- description: Hex SHA-256 the replacement seal will cover — the passport's **current** signature, not whatever the broken seal covered.
+ description: 'Hex SHA-256 the replacement seal will cover: the passport''s **current** signature, not whatever the broken seal covered.'
note:
type: string
description: 'Stated rather than implied, like every other note on this surface: what was queued, what it will cost, and why spending it is right here.'
@@ -5697,10 +6628,10 @@ components:
type:
- object
- 'null'
- description: Always `null` in format v1 — the signed-checkpoint layer is not yet built.
+ description: Always `null` in format v1, because the signed-checkpoint layer is not built yet.
calcReceipts:
type: array
- description: Always empty in format v1 — `dpp-calc` invocation is not yet wired end to end.
+ description: 'Always empty in format v1: `dpp-calc` invocation is not yet wired end to end.'
items:
type: object
componentGraph:
@@ -5713,7 +6644,7 @@ components:
with no modelled sub-assemblies.
Generated at dossier-assembly time by walking the tree and pin-checking
- each node, then bound into `contentHashes` like every other member — so
+ each node, then bound into `contentHashes` like every other member, so
a tampered report fails the dossier's `content_integrity` check rather
than passing as an unverifiable attachment.
@@ -5763,12 +6694,12 @@ components:
type: string
coreVersion:
type: string
- description: The `dpp-core` version this node was built against. Recorded alongside `nodeVersion` because the two move independently — the regulatory logic, schemas and disclosure policy behind a determination live in core, so a dossier naming only the node version cannot be traced back to the code that produced its verdict.
+ description: 'The `dpp-core` version this node was built against. Recorded alongside `nodeVersion` because the two move independently: the regulatory logic, schemas and disclosure policy behind a determination live in core, so a dossier naming only the node version cannot be traced back to the code that produced its verdict.'
example: 0.18.0
SignedLayer:
type: object
description: |
- A JWS alongside the exact JSON payload it was signed over — embedded
+ A JWS alongside the exact JSON payload it was signed over: embedded
directly rather than left for a verifier to reconstruct.
required:
- payload
@@ -5788,7 +6719,7 @@ components:
check it against.
Included because a dossier is what an authority is handed, and the seal is its
- one member carrying an Art. 35(2) presumption — and because it is unreachable
+ one member carrying an Art. 35(2) presumption, and because it is unreachable
otherwise: the seal is stripped from `fullView` and `publicView` alike, since
it covers the full-payload signature rather than any redaction. Bound into
`contentHashes` like every other member.
@@ -5798,7 +6729,7 @@ components:
members and the OpenAPI contract test has nothing to compare them against.
Treat the property list as documentation of intent, not as a guarantee. Giving
the dossier a real type for this member would close that, and is the only thing
- that would — and it is worth doing: this list had fallen five fields behind
+ that would. It is worth doing: this list had fallen five fields behind
what the dossier actually carries before anyone read the two side by side.
properties:
seal:
@@ -5823,7 +6754,7 @@ components:
oneOf:
- $ref: '#/components/schemas/SealOrigin'
- type: 'null'
- description: What the seal's own certificate says about who issued it — the one fact that decides whether anything else in this member carries weight.
+ description: 'What the seal''s own certificate says about who issued it: the one fact that decides whether anything else in this member carries weight.'
evidencedLevel:
type:
- string
@@ -5839,7 +6770,7 @@ components:
$ref: '#/components/schemas/ArchivalFreshness'
EvidenceDossierRecord:
type: object
- description: A stored dossier snapshot — the dossier plus its persistence envelope.
+ description: A stored dossier snapshot, which is the dossier plus its persistence envelope.
required:
- id
- passportId
@@ -5867,7 +6798,7 @@ components:
$ref: '#/components/schemas/EvidenceDossier'
EvidenceDossierSummary:
type: object
- description: Listing projection of a stored dossier — everything but the document.
+ description: Listing projection of a stored dossier, with everything but the document.
required:
- id
- passportId
@@ -5922,7 +6853,7 @@ components:
description: Present when status is `fail` or `absent`.
PassportRegistryView:
type: object
- description: 'EU-registry state for one passport. `configured: false` means this deployment has no registry queues at all — reported instead of a row of zeros, which would read as "everything is registered".'
+ description: 'EU-registry state for one passport. `configured: false` means this deployment has no registry queues at all: reported instead of a row of zeros, which would read as "everything is registered".'
required:
- passportId
- configured
@@ -5974,21 +6905,115 @@ components:
- submitted
- registered
- rejected
+ - abandoned
- deactivated
registryId:
type: string
description: The registry's own record id, once it has issued one.
message:
type: string
- description: The last thing the registry (or the drain) said about it.
+ description: 'The last thing the registry (or the drain) said about it. On a `submitted` row that is waiting for a person it is the reason: the candidate correlation identifiers of an ambiguous lookup, that the handle was not found, or a submission state this node has no name for. A person settles such a row with `POST /vault/api/v1/dpp/{dppId}/registry/handle`.'
attempts:
type: integer
stalled:
type: boolean
- description: True once `attempts` reaches the drain threshold — the row is not going to succeed without someone looking at it.
+ description: 'True once `attempts` reaches the drain threshold: the row is not going to succeed without someone looking at it.'
statusIntent:
type: string
description: 'A status change owed to the registry, independent of the queue state. Nothing drains these: the registry publishes no status-push API, so they are held durably and reported rather than accumulating out of sight.'
+ AbandonRegistrationRequest:
+ type: object
+ description: Why a registration the registry never accepted is being given up on.
+ required:
+ - reason
+ additionalProperties: false
+ properties:
+ reason:
+ type: string
+ minLength: 1
+ maxLength: 500
+ description: 'Why the registration is being abandoned, for example that the product was withdrawn before it was registered. Required: the write ends an obligation the node was tracking, and the audit trail is the only account of why. Not empty, at most 500 characters, and without control characters.'
+ AbandonRegistrationResponse:
+ type: object
+ description: The result of giving up on a registration the registry never accepted.
+ required:
+ - passportId
+ - alreadyAbandoned
+ - note
+ properties:
+ passportId:
+ type: string
+ alreadyAbandoned:
+ type: boolean
+ description: '`true` when the registration was already abandoned, in which case nothing was read from the registry and nothing was written. `false` when this request abandoned it.'
+ note:
+ type: string
+ description: 'Stated rather than implied: the registration is abandoned, the passport stays published and is counted as abandoned, and publishing it again queues it afresh.'
+ RecordRegistryHandleRequest:
+ type: object
+ description: The correlation identifier of a passport's registry submission, as the registry's own interface lists it.
+ required:
+ - correlationId
+ additionalProperties: false
+ properties:
+ correlationId:
+ type: string
+ minLength: 1
+ maxLength: 200
+ pattern: ^\S+$
+ description: The registry's identifier for the submission. Not empty, at most 200 characters, and without whitespace or control characters. It is checked against the registry before it is recorded.
+ RecordRegistryHandleResponse:
+ type: object
+ description: The result of recording a registry submission's correlation identifier by hand.
+ required:
+ - passportId
+ - correlationId
+ - recorded
+ - note
+ properties:
+ passportId:
+ type: string
+ correlationId:
+ type: string
+ description: The correlation identifier the registration now holds.
+ recorded:
+ type: boolean
+ description: '`true` when this request recorded the handle. `false` when the registration already held it, in which case nothing was checked or written.'
+ registry:
+ $ref: '#/components/schemas/SubmissionReport'
+ note:
+ type: string
+ description: 'Stated rather than implied: the handle is recorded and nothing else. The node''s drain applies the registry''s ruling on its next pass.'
+ SubmissionReport:
+ type: object
+ description: What the registry reported about a submission, read by its correlation identifier.
+ required:
+ - outcome
+ properties:
+ outcome:
+ type: string
+ enum:
+ - processing
+ - registered
+ - refused
+ - unrecognised
+ description: |-
+ `processing`: the registry has not finished checking the submission.
+
+ `registered`: the submission succeeded and the passport is registered; `registrationId` is the identifier the registry generated for it.
+
+ `refused`: the submission was refused, as a whole, so a passport can be refused for another passport's fault; `reason` is what the registry said.
+
+ `unrecognised`: the registry reported a state this node has no name for; `state` is that state exactly as reported. Not a verdict.
+ registrationId:
+ type: string
+ description: The identifier the registry generated for the passport. Present only on `registered`.
+ reason:
+ type: string
+ description: The registry's description of the refusal. Present only on `refused`.
+ state:
+ type: string
+ description: The state exactly as the registry reported it. Present only on `unrecognised`.
RegistrationCounts:
type: object
required:
@@ -5996,6 +7021,7 @@ components:
- submitted
- registered
- rejected
+ - abandoned
- deactivated
- statusIntents
- stalled
@@ -6009,6 +7035,9 @@ components:
type: integer
rejected:
type: integer
+ abandoned:
+ type: integer
+ description: 'Rows an operator gave up on after the registry was shown to hold nothing for them: published passports that will not be registered. Counted so they are not read as still owed.'
deactivated:
type: integer
statusIntents:
@@ -6019,7 +7048,7 @@ components:
description: Rows that have retried past the point of self-recovery.
unregisteredPublished:
type: integer
- description: 'Published passports with **no** outbox row at all — they owe a registration nobody is tracking (published before the outbox existed, or lost to an older write path). Reported, not repaired: the queued payload is what a drain replays and there is none to rebuild, so fabricating a row would create an entry that can never drain.'
+ description: 'Published passports with **no** outbox row at all: they owe a registration nobody is tracking (published before the outbox existed, or lost to an older write path). Reported, not repaired: the queued payload is what a drain replays and there is none to rebuild, so fabricating a row would create an entry that can never drain.'
TransferNotificationView:
type: object
description: One transfer-of-responsibility notification owed to the registry.
@@ -6070,7 +7099,7 @@ components:
properties:
current:
type: boolean
- description: False both when never verified and when lapsed — the registry refuses either way, though they are different situations to act on.
+ description: 'False both when never verified and when lapsed: the registry refuses either way, though they are different situations to act on.'
verifiedAt:
type: string
format: date-time
@@ -6084,7 +7113,7 @@ components:
description: Negative once lapsed. Absent when never verified.
CurrentOperatorView:
type: object
- description: The operator responsible for a passport **today**, derived from its transfer chain. Reported separately from the passport's own `operatorIdentifier`, which is the operator that *published* it — frozen at publish and covered by the signature, so a transfer does not rewrite it. For a passport that has changed hands the two differ, and that difference is a fact about the product.
+ description: 'The operator responsible for a passport **today**, derived from its transfer chain. Reported separately from the passport''s own `operatorIdentifier`, which is the operator that *published* it: frozen at publish and covered by the signature, so a transfer does not rewrite it. For a passport that has changed hands the two differ, and that difference is a fact about the product.'
required:
- did
- name
@@ -6102,7 +7131,7 @@ components:
description: Completed handovers this passport has been through.
PassportScanStats:
type: object
- description: Per-passport scan aggregates over a trailing window. `totalScans` and `qrRenders` sit side by side and are never combined — a QR render is label production, not a resolution. Nothing about the scanner (IP, agent, session) is collected or returned; the counters carry no such fields.
+ description: 'Per-passport scan aggregates over a trailing window. `totalScans` and `qrRenders` sit side by side and are never combined: a QR render is label production, not a resolution. Nothing about the scanner (IP, agent, session) is collected or returned; the counters carry no such fields.'
required:
- windowDays
- totalScans
@@ -6133,7 +7162,7 @@ components:
Whether scan telemetry is actually reaching this node.
`false` alongside `totalScans: 0` means the number is **unmeasured**, not
- zero — and that is the shipped default, since `SCAN_INGEST_URL` is unset
+ zero, and that is the shipped default, since `SCAN_INGEST_URL` is unset
unless an operator configures it.
The node cannot answer this from its own configuration: `SCAN_INGEST_URL`
@@ -6143,14 +7172,14 @@ components:
It goes false again when a resolver stops reporting: the resolver declares
its own flush cadence in every batch, and telemetry is called stale after
- three of those intervals — enough to absorb the dropped heartbeats the
+ three of those intervals: enough to absorb the dropped heartbeats the
sender never retries, since holding an empty batch would starve its
counter. A resolver too old to declare a cadence leaves no window to be
outside of, and this then reports only that one ever flushed; `lastIngestAt`
is on the wire either way, so a caller who knows their own deployment can
judge for themselves.
- Resets on restart — this is liveness, not history — so a freshly booted
+ Resets on restart (this is liveness, not history) so a freshly booted
node reports `false` until the next flush, at most one interval.
lastIngestAt:
type: string
@@ -6180,7 +7209,7 @@ components:
Whether scan telemetry is actually reaching this node.
`false` alongside `totalScans: 0` means the number is **unmeasured**, not
- zero — and that is the shipped default, since `SCAN_INGEST_URL` is unset
+ zero, and that is the shipped default, since `SCAN_INGEST_URL` is unset
unless an operator configures it.
The node cannot answer this from its own configuration: `SCAN_INGEST_URL`
@@ -6190,14 +7219,14 @@ components:
It goes false again when a resolver stops reporting: the resolver declares
its own flush cadence in every batch, and telemetry is called stale after
- three of those intervals — enough to absorb the dropped heartbeats the
+ three of those intervals: enough to absorb the dropped heartbeats the
sender never retries, since holding an empty batch would starve its
counter. A resolver too old to declare a cadence leaves no window to be
outside of, and this then reports only that one ever flushed; `lastIngestAt`
is on the wire either way, so a caller who knows their own deployment can
judge for themselves.
- Resets on restart — this is liveness, not history — so a freshly booted
+ Resets on restart (this is liveness, not history) so a freshly booted
node reports `false` until the next flush, at most one interval.
lastIngestAt:
type: string
@@ -6238,7 +7267,7 @@ components:
Declared rather than assumed. The node reports `ingesting` on
`GET /stats` by asking whether the last flush is recent, and "recent" is
- only meaningful relative to how often the sender promised to call —
+ only meaningful relative to how often the sender promised to call:
`SCAN_FLUSH_INTERVAL_SECS` belongs to the resolver, a separate deployable
whose environment the node cannot read.
@@ -6377,10 +7406,10 @@ components:
- string
- 'null'
format: date-time
- description: When this operator's identity was last verified against the EU registry. Null when no verification has succeeded — never treat absence as verified.
+ description: When this operator's identity was last verified against the EU registry. Null when no verification has succeeded; never treat absence as verified.
UpdateOperatorConfig:
type: object
- description: Merge-patch update — only supply fields being changed.
+ description: Merge-patch update. Supply only the fields being changed.
properties:
legalName:
type: string
@@ -6417,7 +7446,7 @@ components:
- string
- 'null'
format: date-time
- description: When this operator's identity was last verified against the EU registry. Null when no verification has succeeded — never treat absence as verified.
+ description: When this operator's identity was last verified against the EU registry. Null when no verification has succeeded; never treat absence as verified.
Facility:
type: object
required:
@@ -6473,7 +7502,7 @@ components:
example: gln
identifierValue:
type: string
- description: Validated by scheme — a "gln" must pass the GS1 mod-10 check digit.
+ description: Validated by scheme, so a "gln" must pass the GS1 mod-10 check digit.
example: '4012345000009'
country:
type: string
@@ -6483,7 +7512,7 @@ components:
**Upper case, and an assigned code.** Unlike the other country fields on
this API, this one is checked against the ISO 3166-1 list rather than
- merely shaped — `de` and `XX` are both refused. The pattern is what makes
+ merely shaped: `de` and `XX` are both refused. The pattern is what makes
the published contract as strict as the handler: a length bound alone
admits `1?`, which satisfies the contract and is then refused with `422`,
and a contract looser than the implementation is the kind a generated
@@ -6539,7 +7568,7 @@ components:
example: lei
value:
type: string
- description: Validated by scheme — LEI uses ISO 7064 MOD 97-10; DUNS is 9 digits; EORI/VAT require a 2-letter country prefix. Unknown schemes are accepted without structural verification.
+ description: 'Validated by scheme: LEI uses ISO 7064 MOD 97-10; DUNS is 9 digits; EORI/VAT require a 2-letter country prefix. Unknown schemes are accepted without structural verification.'
example: 5493001KJTIIGC8Y1R12
label:
type:
@@ -6667,7 +7696,7 @@ components:
issuer, named in `CREDENTIAL_ISSUERS_AUTHORITY`.
A product-group-specific role that none of the named ones fit uses the object
- form — the variant is externally tagged, so it is an object where the rest are
+ form: the variant is externally tagged, so it is an object where the rest are
strings. It carries a legitimate interest like the others.
oneOf:
- type: string
@@ -6696,7 +7725,7 @@ components:
The node signs with its own key, so the credential says "this operator
attests that this party holds this role". That is a claim an operator is
uniquely placed to make about its own authorised network, and one it has no
- standing to make about authority status — see `role`.
+ standing to make about authority status: see `role`.
required:
- holderDid
- holderName
@@ -6734,6 +7763,29 @@ components:
product group this operator publishes.
example:
- battery
+ productCategories:
+ type: array
+ items:
+ type: string
+ description: |
+ Product categories the credential covers within `productGroups`. Omit or
+ leave empty to cover every category.
+
+ The list is flat: it narrows every named group, and a read is admitted
+ only where the passport states one of the listed values. A value is
+ compared exactly with the category the passport's data states, such as a
+ battery's `batteryType`. The values a group allows are that property's
+ `enum` in the group's current schema
+ (`GET /integrator/api/v1/schemas/{productGroup}`), and some groups state
+ no category at all. A refusal's `detail` lists what each named group's
+ passports can state.
+
+ A list that cannot work as written is refused with `422` rather than
+ signed: one given without `productGroups`, one holding a value no named
+ group's passports can state, or one that leaves a named group with no
+ passport the credential could read.
+ example:
+ - ev
validForDays:
type: integer
minimum: 1
@@ -6742,9 +7794,9 @@ components:
description: |
Lifetime in days.
- Nothing can withdraw a credential once issued — this node fetches W3C
+ Nothing can withdraw a credential once issued (this node fetches W3C
status lists but publishes none, so a credential it mints carries no
- `credentialStatus` — which makes the expiry the only control there is.
+ `credentialStatus`) which makes the expiry the only control there is.
That is why the ceiling is 90 rather than open-ended, and why the default
is shorter still. Re-issuing is cheap.
example: 30
@@ -6760,7 +7812,7 @@ components:
credentialJws:
type: string
description: |
- Compact VC-JWT — the value the holder sends as the `X-DPP-Credential`
+ Compact VC-JWT: the value the holder sends as the `X-DPP-Credential`
header. This is the credential; `credential` below is the same claims in
readable form, not a second artefact.
credential:
@@ -6777,7 +7829,7 @@ components:
A disclosure is many of these, not one row. Art. 24(1) asks for the figures
"differentiated per type or category of products", and separately per reason
- and destination — which a single aggregate cannot express.
+ and destination, which a single aggregate cannot express.
The operator is **not** part of the request. The report is about this node's
own operator, taken from its operator config; there is no second operator on a
@@ -6840,7 +7892,7 @@ components:
Either case is accepted and the stored value is upper-cased. The pattern
is what makes the description enforceable: a length bound alone admits
`1?`, which satisfies the published contract and is then refused by the
- handler — a contract looser than the implementation is the kind a
+ handler: a contract looser than the implementation is the kind a
generated client trusts.
example: DE
UnsoldGoodsEntry:
@@ -6868,7 +7920,7 @@ components:
- 'null'
format: int64
description: |
- Null only for a row written before the count had a column — the write path
+ Null only for a row written before the count had a column: the write path
requires it, so anything recorded through this API carries one.
volumeKg:
type: number
@@ -6891,7 +7943,7 @@ components:
- string
- 'null'
description: |
- The operator the disclosure is about — this node's own legal name at the
+ The operator the disclosure is about: this node's own legal name at the
time the line was recorded. Report content, not a tenant key.
createdAt:
type: string
@@ -6900,12 +7952,12 @@ components:
type: string
description: |
The operator's own categorisation of the discarded goods, for Art. 24(1)(a)'s
- "differentiated per type or category of products" — which prescribes no
+ "differentiated per type or category of products", which prescribes no
vocabulary.
This is **not** Annex VII ban scope. Annex VII gives two *code-valued*
- headings — apparel and clothing accessories (`4203`, `61`, `62`, `6504`,
- `6505`) and footwear (`6401`–`6405`) — matched by CN **prefix**, with clothing
+ headings, matched by CN **prefix**: apparel and clothing accessories (`4203`,
+ `61`, `62`, `6504`, `6505`), and footwear (`6401`–`6405`), with clothing
accessories inside the first heading rather than beside it. Reading this list
as those headings gets both their count and their shape wrong.
enum:
@@ -6952,11 +8004,11 @@ components:
type: string
description: |
The full plain-text API key. Shown ONCE at creation time.
- Store securely — it cannot be retrieved again.
+ Store securely: it cannot be retrieved again.
example: odal_sk_abc123def456ghi789jkl012mno345pqr678
WebhookSubscription:
type: object
- description: A receiver subscription, redacted. The signing secret is never carried here — it is returned exactly once from the create call and otherwise stays server-side.
+ description: 'A receiver subscription, redacted. The signing secret is never carried here: it is returned exactly once from the create call and otherwise stays server-side.'
required:
- id
- url
@@ -6971,10 +8023,10 @@ components:
url:
type: string
format: uri
- description: Receiver URL — validated `https`, non-private host at creation.
+ description: Receiver URL, validated at creation as `https` with a non-private host.
events:
type: array
- description: Subject filter — event type strings, or a single `*` for all events.
+ description: Subject filter, as event type strings, or a single `*` for all events.
items:
type: string
active:
@@ -7008,7 +8060,7 @@ components:
description:
type: string
CreatedWebhookResponse:
- description: The created subscription's fields, inlined, plus the signing secret. The secret is shown **once** — it is not recoverable from any later read.
+ description: 'The created subscription''s fields, inlined, plus the signing secret. The secret is shown **once**: it is not recoverable from any later read.'
allOf:
- $ref: '#/components/schemas/WebhookSubscription'
- type: object
@@ -7059,14 +8111,14 @@ components:
- sandbox
- live
description: |
- Each resolved trust port and the tier it operates at — `ghost` is a
+ Each resolved trust port and the tier it operates at: `ghost` is a
placeholder with no real authority behind it, `sandbox` a real but
non-production service, `live` a production one.
- This is the ghost-honesty signal: no surface may present a placeholder as
- real. It is reported here rather than on the unauthenticated `/health`
- because which ports are degraded, and how, is a targeting signal — the
- same reasoning that keeps `/metrics` off the public router.
+ A production profile refuses to start while a required port is a
+ placeholder. The modes are reported here rather than on the unauthenticated
+ `/health` because which ports are degraded, and how, is useful to an
+ attacker; the same reasoning keeps `/metrics` off the public router.
Absent on a standalone vault, which resolves no trust ports.
example:
@@ -7088,7 +8140,7 @@ components:
- production
WhoamiResponse:
type: object
- description: What the presented credential is. Reports only what the caller already sent — it reveals nothing about any other key, and the key's secret is never stored in a recoverable form.
+ description: 'What the presented credential is. Reports only what the caller already sent: it reveals nothing about any other key, and the key''s secret is never stored in a recoverable form.'
required:
- userId
- scope
@@ -7101,7 +8153,7 @@ components:
keyId:
type: string
format: uuid
- description: The key's row id — never the token. Absent for local-admin Basic auth, which has no key row.
+ description: The key's row id, never the token. Absent for local-admin Basic auth, which has no key row.
VaultInfo:
type: object
required:
@@ -7123,7 +8175,7 @@ components:
type: array
items:
type: string
- description: Auth schemes the vault accepts. Currently a fixed list, not derived from live config — `local` is listed even when `ADMIN_USERNAME`/`ADMIN_PASSWORD` are unset.
+ description: 'Auth schemes the vault accepts. Currently a fixed list, not derived from live config: `local` is listed even when `ADMIN_USERNAME`/`ADMIN_PASSWORD` are unset.'
example:
- api_key
- local
@@ -7137,25 +8189,33 @@ components:
type: object
description: |
A W3C DID Core `did:web` document. Lists the operator's Ed25519
- verification methods; rotated keys are retained (so historical
- signatures still verify) and revoked keys are omitted.
+ verification methods as `JsonWebKey`s (W3C Controlled Identifiers v1.0);
+ rotated keys are retained (so historical signatures still verify) and revoked
+ keys are omitted.
+
+ Each method is named by its key's own RFC 7638 thumbprint, in the URI form of
+ RFC 9278, so a name never moves to another key when the keys are rotated. A
+ token's `kid` is the absolute URL of the method that signed it. The first
+ entry of `authentication` is the current key.
example:
'@context':
- https://www.w3.org/ns/did/v1
- - https://w3id.org/security/suites/ed25519-2020/v1
+ - https://www.w3.org/ns/cid/v1
id: did:web:id.odal-node.io
verificationMethod:
- - id: did:web:id.odal-node.io#key-1
- type: JsonWebKey2020
+ - id: did:web:id.odal-node.io#urn:ietf:params:oauth:jwk-thumbprint:sha-256:
+ type: JsonWebKey
controller: did:web:id.odal-node.io
publicKeyJwk:
kty: OKP
crv: Ed25519
x:
+ kid: urn:ietf:params:oauth:jwk-thumbprint:sha-256:
+ alg: EdDSA
authentication:
- - did:web:id.odal-node.io#key-1
+ - did:web:id.odal-node.io#urn:ietf:params:oauth:jwk-thumbprint:sha-256:
assertionMethod:
- - did:web:id.odal-node.io#key-1
+ - did:web:id.odal-node.io#urn:ietf:params:oauth:jwk-thumbprint:sha-256:
InternalSignRequest:
type: object
required:
@@ -7228,7 +8288,7 @@ components:
type: string
new_key_id:
type: string
- example: did:web:id.odal-node.io#key-1
+ example: did:web:id.odal-node.io#urn:ietf:params:oauth:jwk-thumbprint:sha-256:
fingerprint:
type: string
description: SHA-256 fingerprint (hex) of the new public key.
@@ -7251,7 +8311,7 @@ components:
jobId:
type: string
format: uuid
- description: The job this response's report was persisted under — retrievable later via the job-status endpoint.
+ description: 'The job this response''s report was persisted under: retrievable later via the job-status endpoint.'
totalRows:
type: integer
description: Rows read from the uploaded file, excluding the header.
@@ -7271,7 +8331,7 @@ components:
$ref: '#/components/schemas/ImportErrorEntry'
updated:
type: array
- description: Rows that matched an existing passport and updated it. Counted in `successCount`, which is deliberately not `created.length + updated.length` — see that field.
+ description: 'Rows that matched an existing passport and updated it. Counted in `successCount`, which is deliberately not `created.length + updated.length`: see that field.'
items:
$ref: '#/components/schemas/ImportUpdatedEntry'
ImportAsyncResponse:
@@ -7360,7 +8420,7 @@ components:
type:
- object
- 'null'
- description: The row-addressed findings report — populated for every job, dry-run or apply, independent of `result`.
+ description: 'The row-addressed findings report: populated for every job, dry-run or apply, independent of `result`.'
JobProgress:
type: object
description: How far through its rows an import job has got.
@@ -7406,7 +8466,7 @@ components:
Human-readable name from the product group catalog.
`null` where an act reaches this key but no product group descriptor
- exists for it — a real case, and the one this endpoint is most needed for:
+ exists for it: a real case, and the one this endpoint is most needed for:
no schema, plugin or template names such a group, so nothing else in the
API can be asked about it. A `null` title is not an error and says nothing
about the obligation, which is reported in full beside it.
@@ -7427,7 +8487,7 @@ components:
- type: 'null'
description: |
The level a passport is issued at for this product group, where a
- delegated act fixes one. `null` where none does — which is every product
+ delegated act fixes one. `null` where none does, which is every product
group today.
Nullable here rather than omitted, unlike the same field on a passport:
@@ -7445,7 +8505,7 @@ components:
along the act itself is and whether it binds *this* group.
**These statuses qualify `passport.required`.** That field folds across
- every act here, so it reports that an act imposes a passport — not that
+ every act here, so it reports that an act imposes a passport, not that
any act binds this group today. Where every entry is `provisional` or
`watch`, a `required: true` is a reading of instruments that have not yet
bound anything, and must not be presented as a determination.
@@ -7465,14 +8525,14 @@ components:
Whether a passport is required for a product group, and from when.
The obligation is split from its date so `required` can be answered where
- nothing fixes a date — which is most of the catalog.
+ nothing fixes a date, which is most of the catalog.
properties:
required:
type: boolean
description: |
Whether an instrument recorded against this product group imposes a
- passport obligation. Says nothing about whether one can be produced today
- — see `determinable` on the enclosing object.
+ passport obligation. Says nothing about whether one can be produced today:
+ see `determinable` on the enclosing object.
**Read with `instruments[].bindingStatus`.** This is a fold across every
reaching act, so `true` means an act imposes a passport, not that any act
@@ -7495,7 +8555,7 @@ components:
One object rather than two loose fields so a date cannot be served without its
basis. Most of the catalog is undated, and of the dates that exist some trace
- to an adopted text and some are a reading — a date presented bare turns a
+ to an adopted text and some are a reading: a date presented bare turns a
qualified reading into an unqualified claim.
properties:
date:
@@ -7535,7 +8595,7 @@ components:
The figure is the maximum across every act reaching the product group, because
retention periods are floors and a record kept long enough for the longest
satisfies them all. The basis is `sourced` only when every contributing figure
- is sourced — one assumption anywhere makes the compound figure an assumption,
+ is sourced: one assumption anywhere makes the compound figure an assumption,
whichever act supplied the maximum.
properties:
years:
@@ -7569,7 +8629,7 @@ components:
Distinct from the entries recorded on a passport, which carry no status: a
passport freezes its applicable set at issuance and re-deriving status later
would misstate what governed the product when it was placed on the market.
- Here nothing is frozen — the question is what the catalog holds now — so the
+ Here nothing is frozen (the question is what the catalog holds now) so the
statuses are what let a caller tell an adopted duty from a reading.
properties:
instrument:
@@ -7584,7 +8644,7 @@ components:
description: Whether that act's obligations bind this product group. Independent of `instrumentStatus` in both directions.
recorded:
$ref: '#/components/schemas/RecordedBasis'
- description: Always `catalog` here — this reports what the embedded catalog holds, and an operator assertion is recorded on a passport, not against the catalog. Shared with the passport's own instrument entries so the two stay one shape.
+ description: 'Always `catalog` here: this reports what the embedded catalog holds, and an operator assertion is recorded on a passport, not against the catalog. Shared with the passport''s own instrument entries so the two stay one shape.'
required:
- instrument
- recorded
@@ -7597,23 +8657,23 @@ components:
- proposed
- anticipated
description: |
- How far through the legislative process an act is — whether the **act
+ How far through the legislative process an act is: whether the **act
exists**, not whether it binds anything.
- `adopted` — adopted and published in the Official Journal, citable by CELEX.
+ `adopted`: adopted and published in the Official Journal, citable by CELEX.
- `proposed` — formally proposed but not adopted. Its text can be read and cited
+ `proposed`: formally proposed but not adopted. Its text can be read and cited
as a *proposal*, never as law.
- `anticipated` — announced in a working plan or otherwise expected, with no
+ `anticipated`: announced in a working plan or otherwise expected, with no
text to read. Such an act has no CELEX, and nothing derived from it may be
presented as sourced.
Distinct from `RegulatoryStatus`, and the distinction is easy to lose: an
adopted act binds nothing until its own dates arrive, and routinely binds one
product group while another waits. The practical case is that ESPR has been
- `adopted` since 2024 while every product group under it is still `provisional`
- — both statements are true and neither implies the other.
+ `adopted` since 2024 while every product group under it is still `provisional`;
+ both statements are true and neither implies the other.
example: adopted
RegulatoryStatus:
type: string
@@ -7622,29 +8682,29 @@ components:
- provisional
- watch
description: |
- Whether an act's obligations bind **a given product group** — a different
+ Whether an act's obligations bind **a given product group**: a different
question from whether the act exists, which is `InstrumentStatus`.
- `in_force` — the act creates binding obligations for this product group that
+ `in_force`: the act creates binding obligations for this product group that
can be determined now. A future applicability date is *not* this status.
- `provisional` — the act exists or is anticipated, but nothing is bindingly
+ `provisional`: the act exists or is anticipated, but nothing is bindingly
determinable for this product group yet. Any obligation reported alongside
this status is a reading, not a determination.
- `watch` — tracked, but this act imposes nothing on this product group. A
+ `watch`: tracked, but this act imposes nothing on this product group. A
watching brief rather than a duty, and never determinable.
**Read this before acting on `passport.required`.** The obligation is a fold
across every act reaching the product group, so `required: true` says an act
- imposes a passport — not that the act binds this group today. Where every
+ imposes a passport, not that the act binds this group today. Where every
reaching act is `provisional` or `watch`, the requirement is a reading of
instruments that have not yet bound anything.
example: provisional
CreateLifeStatus:
type: string
description: |-
- The subset of `LifeStatus` a passport may be **created** in — Regulation (EU) 2023/1542, Annex XIII point 4(c), less `waste`.
+ The subset of `LifeStatus` a passport may be **created** in: Regulation (EU) 2023/1542, Annex XIII point 4(c), less `waste`.
A separate schema rather than a note on the full one, because a generated client must not be able to offer a value `POST /dpp` always refuses: `waste` is a transition of an existing record and is rejected here with `422`. The field's own description says why; the full vocabulary a passport can be *read* in is `LifeStatus`.
enum:
@@ -7659,7 +8719,7 @@ components:
✅ EN 18221:2026 clause 4.2 (archiving), one of the six standards cited by Commission Implementing Decision (EU) 2026/1736.
- 🚨 **Not the `retired` lifecycle status**, which is a terminal state reached after the ESPR retention period and says the record has stopped changing. This is the standard's sense of the word — historical versions of a passport that is still live — and the two are unrelated.
+ **Not the `retired` lifecycle status**, which is a terminal state reached after the ESPR retention period and says the record has stopped changing. This is the standard's sense of the word (historical versions of a passport that is still live) and the two are unrelated.
required:
- id
- passportId
@@ -7684,7 +8744,7 @@ components:
type: string
format: date-time
description: |-
- When this version stopped being current — the instant the change that replaced it was applied.
+ When this version stopped being current: the instant the change that replaced it was applied.
One timestamp rather than a validity range: the previous version's `supersededAt` is this one's start, and two fields that must agree are two fields that can disagree.
PublishBlocker:
@@ -7748,33 +8808,33 @@ components:
to put in front of an operator, and only some of them describe something
they can change.
- `required` — Art. 77(1) reaches this record.
+ `required`: Art. 77(1) reaches this record.
- `notCovered` — the article does not name this category. Portable and SLI
+ `notCovered`: the article does not name this category. Portable and SLI
batteries owe no passport, ever.
- `belowThreshold` — an industrial battery at or below 2 kWh. The category
+ `belowThreshold`: an industrial battery at or below 2 kWh. The category
*is* in scope; this unit is under the threshold, which is a different thing
to be told than that industrial batteries are outside the article.
- `capacityUnknown` — an industrial battery that declares no
+ `capacityUnknown`: an industrial battery that declares no
`ratedCapacityKwh`, so the threshold cannot be applied. **Not an
exemption**: the obligation turns on a number this record does not carry,
and the node treats it as in scope. Declaring a capacity of 2 kWh or less
is what moves it to `belowThreshold`.
- `notYetBinding` — in scope by type and capacity, but placed on the market
+ `notYetBinding`: in scope by type and capacity, but placed on the market
before 18 February 2027. A record stating no `placedOnMarketDate` at all is
treated as inside the period instead, because an unstated date is not
evidence of an earlier one.
- `notApplicable` — not a battery, so this article has nothing to say. Other
+ `notApplicable`: not a battery, so this article has nothing to say. Other
instruments may still require a passport.
example: required
note:
type: string
description: |
- Present when the answer needs justifying — an industrial battery that
+ Present when the answer needs justifying: an industrial battery that
declares no `ratedCapacityKwh`, or a record the article does not reach and
the content gate therefore does not apply to.
PublishReadiness:
@@ -7786,14 +8846,16 @@ components:
Deliberately not the whole of publish. The registry-identity requirement is
operator state rather than passport state, and the binding-compliance gate
- needs a determination this route does not run — so `ready: true` means "these
+ needs a determination this route does not run, so `ready: true` means "these
gates pass", not "publish will certainly succeed".
The mandatory-content half is the reason this exists. It is the gate that most
- often refuses a battery — 45 data points for an electric-vehicle one, 44 for
- an LMT battery, 37 for an industrial one — and it could not previously be
- previewed anywhere: it is reachable only from a stored passport, and the only
- dry-run the API offered takes an unsaved request body.
+ often refuses a battery (41 data points for an electric-vehicle one, 40 for
+ an LMT battery, 33 for an industrial one, and one more for each placed from
+ 18 August 2027, when the due diligence report falls due unless Art. 47 exempts
+ the battery) and it could not previously be previewed anywhere: it is
+ reachable only from a stored passport, and the only dry-run the API offered
+ takes an unsaved request body.
required:
- ready
- blockers
@@ -7814,11 +8876,11 @@ components:
description: |-
Whether a seal's archival protection is still live.
- `evidencedLevel` reports `baseline-lta` from the **presence** of the archival material, and is right to — the material is there. This reports whether it still means anything.
+ `evidencedLevel` reports `baseline-lta` from the **presence** of the archival material, and is right to: the material is there. This reports whether it still means anything.
- An archival timestamp is what keeps a `B-LTA` seal verifiable after its signing certificate expires, which is the whole point for a retention-locked passport that outlives every certificate involved. **It expires too**: its own timestamping authority's certificate has a validity period, and ETSI's long-term profiles expect re-timestamping before that. Without this field a seal whose archival protection lapsed years ago reads exactly as it did the day it was bought.
+ An archival timestamp is what keeps a `B-LTA` seal verifiable after its signing certificate expires, which is the whole point for a retention-locked passport that outlives every certificate involved. **It expires too**: its own timestamping authority's certificate has a validity period, and ETSI's long-term profiles expect re-timestamping before that. Without this field a seal whose archival protection lapsed years ago reads exactly as it did the day it was bought. A node with a timestamp source configured renews a due seal itself, and this field is what shows the result: `current` with a later date.
- **A signal, not a verdict.** A seal nearing its renewal date still verifies, and that window is the only chance to renew without an outage. No threshold is applied — how much notice is enough is a policy question for the reader.
+ **A signal, not a verdict.** A seal nearing its renewal date still verifies, and that window is the only chance to renew without an outage. No threshold is applied: how much notice is enough is a policy question for the reader.
required:
- state
properties:
@@ -7830,25 +8892,25 @@ components:
- lapsed
- unknown
description: |-
- `notArchived`: no archival timestamp — a seal below `B-LTA`. Nothing to renew, which is a different thing from a renewal that has lapsed: such a seal was never promised long-term protection.
+ `notArchived`: no archival timestamp: a seal below `B-LTA`. Nothing to renew, which is a different thing from a renewal that has lapsed: such a seal was never promised long-term protection.
`current`: the archival timestamp's authority certificate is still valid.
`lapsed`: it has expired. The seal may still verify today; what is gone is the thing meant to keep it verifying once its signing certificate goes.
- `unknown`: an archival timestamp is present and could not be read. **Not `current`** — a token that cannot be checked is not a fresh one, and reporting it as current is how a staleness signal goes quiet at the moment it matters.
+ `unknown`: an archival timestamp is present and could not be read. **Not `current`**: a token that cannot be checked is not a fresh one, and reporting it as current is how a staleness signal goes quiet at the moment it matters.
expires:
type: string
format: date-time
- description: 'When the archival timestamp''s authority certificate expires — the date by which re-timestamping must have happened, read from before or after it depending on `state`. One value, so one name: `current` and `lapsed` are the same date seen from either side. Absent for `notArchived` and `unknown`.'
+ description: 'When the archival timestamp''s authority certificate expires: the date by which re-timestamping must have happened, read from before or after it depending on `state`. One value, so one name: `current` and `lapsed` are the same date seen from either side. Absent for `notArchived` and `unknown`.'
SealBinding:
type: object
description: |-
Whether the seal's **own bytes** say it covers this passport's current signature.
- A detached CAdES states what it covers in exactly one place — the `messageDigest` signed attribute, RFC 5652 §11.2 — and that attribute sits *inside* the signature. This reports what it says, after checking the signature over it. That ordering is the whole point: the attribute is plain DER and trivial to rewrite, but rewriting it breaks the signature, so a seal cannot be retargeted at another passport by editing what it claims to cover.
+ A detached CAdES states what it covers in exactly one place (the `messageDigest` signed attribute, RFC 5652 §11.2) and that attribute sits *inside* the signature. This reports what it says, after checking the signature over it. That ordering is the whole point: the attribute is plain DER and trivial to rewrite, but rewriting it breaks the signature, so a seal cannot be retargeted at another passport by editing what it claims to cover.
- Read it beside `coverage`, which answers the same question from this node's own outbox records. Those records survive a seal that will not parse and need no cryptography; this needs both and is evidence. **Where the two disagree, the disagreement is the finding** — the records and the bytes are describing different things, which neither source could have revealed alone.
+ Read it beside `coverage`, which answers the same question from this node's own outbox records. Those records survive a seal that will not parse and need no cryptography; this needs both and is evidence. **Where the two disagree, the disagreement is the finding**: the records and the bytes are describing different things, which neither source could have revealed alone.
required:
- result
properties:
@@ -7860,13 +8922,13 @@ components:
- notIntact
- unknown
description: |-
- `coversThisSignature`: the seal names this exact signature and its attributes verify under the certificate it carries. The strongest statement this node can make without an external validator — whatever is true of the seal's *trust*, it is demonstrably a seal over this passport and not over anything else.
+ `coversThisSignature`: the seal names this exact signature and its attributes verify under the certificate it carries. The strongest statement this node can make without an external validator: whatever is true of the seal's *trust*, it is demonstrably a seal over this passport and not over anything else.
`coversAnotherDigest`: the seal is intact and names a different digest. Ordinary after a re-publish, since the passport re-signed. It is also what a seal stored against the wrong passport looks like, and the two are indistinguishable from the bytes alone; what separates them is whether an outbox row says this digest was ever requested for this passport.
`notIntact`: the signature over the seal's attributes does not verify, so nothing the seal says about what it covers can be relied on.
- `unknown`: the bytes could not be read, or carry no digest at all — a placeholder, an unparsed format, or a signature with no signed attributes. **Never** to be read as a mismatch.
+ `unknown`: the bytes could not be read, or carry no digest at all: a placeholder, an unparsed format, or a signature with no signed attributes. **Never** to be read as a mismatch.
covered:
type: string
description: |-
@@ -7876,11 +8938,11 @@ components:
SealValidationStatus:
type: object
description: |-
- `binding` restated in the vocabulary of ETSI EN 319 102-1 clause 5.1.3 — the procedures standard CIR (EU) 2025/1945 points at for validating a qualified electronic seal.
+ `binding` restated in the vocabulary of ETSI EN 319 102-1 clause 5.1.3: the procedures standard CIR (EU) 2025/1945 points at for validating a qualified electronic seal.
A translation, not a second opinion: it is derived from `binding` and adds no checking of its own. It is here because these findings travel to readers whose validation tooling speaks this vocabulary, and because the translation makes explicit something our own field names let a reader assume.
- **`totalPassed` is not among the values, and cannot be.** That indication requires, among other conditions, that the constraints applicable to the signer's certificate have been positively validated — a certificate path built and validated to a trust anchor, under a policy.
+ **`totalPassed` is not among the values, and cannot be.** That indication requires, among other conditions, that the constraints applicable to the signer's certificate have been positively validated: a certificate path built and validated to a trust anchor, under a policy.
This node checks the certificate's validity window and whatever revocation material the seal carries (see `certificate`), and it checks one issuer signature against a Trusted List entry. It builds no path and applies no policy constraints. So a seal that demonstrably covers this signature reports `indeterminate`: nothing has failed, and not everything has been checked. Reading `coversThisSignature` as a validation pass is the misreading this object exists to prevent.
required:
@@ -7892,9 +8954,9 @@ components:
- totalFailed
- indeterminate
description: |-
- `totalFailed`: the signature is demonstrably not valid. The standard makes this **stable** — the same inputs always yield the same answer, and additional validation data cannot lift it to a pass; only additional proofs of existence can change a result at all. That stability is what makes a broken seal safe to spend a replacement on.
+ `totalFailed`: the signature is demonstrably not valid. The standard makes this **stable**: the same inputs always yield the same answer, and additional validation data cannot lift it to a pass; only additional proofs of existence can change a result at all. That stability is what makes a broken seal safe to spend a replacement on.
- `indeterminate`: the available information is insufficient to decide. Not a weaker `totalFailed` — under CIR (EU) 2025/1945 it is its own technical outcome, "neither an EU qualified electronic signature, nor an EU qualified electronic seal", to be reported as such rather than collapsed into either neighbour.
+ `indeterminate`: the available information is insufficient to decide. Not a weaker `totalFailed`: under CIR (EU) 2025/1945 it is its own technical outcome, "neither an EU qualified electronic signature, nor an EU qualified electronic seal", to be reported as such rather than collapsed into either neighbour.
subIndication:
type:
- string
@@ -7906,17 +8968,17 @@ components:
description: |-
The table 6 value qualifying the indication, where one applies.
- `sigCryptoFailure`: the signature value could not be verified with the public key in the signing certificate — a seal this node reports as `notIntact`.
+ `sigCryptoFailure`: the signature value could not be verified with the public key in the signing certificate: a seal this node reports as `notIntact`.
`hashFailure`: a hash of signed data does not match. Reported for a seal that is intact over a *different* digest, because validating **this passport's current signature** against it fails on the hash. The seal remains a sound attestation of the signature it does cover, which is why the node counts it apart and refuses to repair it.
- `null` is the standard's own custom-diagnostic case: no table 6 value fits, so `binding` carries the diagnostic instead of stretching one that nearly does. The two `null` cases are different diagnostics — "the certificate was never checked" and "these bytes could not be read" — and `binding` keeps them apart.
+ `null` is the standard's own custom-diagnostic case: no table 6 value fits, so `binding` carries the diagnostic instead of stretching one that nearly does. The two `null` cases are different diagnostics ("the certificate was never checked" and "these bytes could not be read") and `binding` keeps them apart.
ValidityWindow:
type: object
description: |-
A certificate's validity window, and where the sealing moment falls in it.
- The window travels with the verdict so a reader can check the arithmetic rather than take it on trust — and because the two dates are what an auditor compares against a Trusted List entry when asking the other half of Art. 32(1)(b).
+ The window travels with the verdict so a reader can check the arithmetic rather than take it on trust, and because the two dates are what an auditor compares against a Trusted List entry when asking the other half of Art. 32(1)(b).
required:
- notBefore
- notAfter
@@ -7936,7 +8998,7 @@ components:
- inside
- expired
- notYetValid
- description: Where the judged moment falls in the window. `expired` and `notYetValid` are findings only when that moment is attested — see `judgedAt`.
+ description: 'Where the judged moment falls in the window. `expired` and `notYetValid` are findings only when that moment is attested: see `judgedAt`.'
JudgedTime:
type: object
description: |-
@@ -7954,9 +9016,9 @@ components:
attested:
type: boolean
description: |-
- True when the moment came from a timestamp token inside the seal, whose signature and imprint were both checked. False means it is the node's own clock — the validation time, not the signing time.
+ True when the moment came from a timestamp token inside the seal, whose signature and imprint were both checked. False means it is the node's own clock: the validation time, not the signing time.
- This separates a failure from an open question. ETSI EN 319 102-1 treats a time nothing proves as no time at all, which is why a verdict resting on an unattested moment is reported with a `NO_POE` sub-indication rather than as `totalFailed`. Without it, every seal whose certificate has since expired — eventually all of them — would read as invalid.
+ This separates a failure from an open question. ETSI EN 319 102-1 treats a time nothing proves as no time at all, which is why a verdict resting on an unattested moment is reported with a `NO_POE` sub-indication rather than as `totalFailed`. Without it, every seal whose certificate has since expired (eventually all of them) would read as invalid.
RevocationStanding:
type: object
description: |-
@@ -7974,17 +9036,17 @@ components:
- notAvailable
- unusable
description: |-
- `notRevoked` — a CRL from this certificate's issuer, whose own signature verifies under a certificate the seal carries, does not list it.
+ `notRevoked`: a CRL from this certificate's issuer, whose own signature verifies under a certificate the seal carries, does not list it.
- `revoked` — that CRL lists it, and `at` says when. Whether this condemns the seal depends on `judgedAt`: a certificate revoked *after* a seal was made does not unmake it.
+ `revoked`: that CRL lists it, and `at` says when. Whether this condemns the seal depends on `judgedAt`: a certificate revoked *after* a seal was made does not unmake it.
- `notAvailable` — the seal carries no revocation material for this certificate. Ordinary below `B-LT` and **not a defect**.
+ `notAvailable`: the seal carries no revocation material for this certificate. Ordinary below `B-LT` and **not a defect**.
- `unusable` — material was present and could not be relied on: an unparseable list, or one whose signature does not verify. Distinct from `notAvailable` because something claiming to be authoritative failed, which is worth looking at. A CRL wearing the issuer's name but signed by another key lands here and never on `notRevoked` — an unsigned list could otherwise *clear* a revoked certificate.
+ `unusable`: material was present and could not be relied on: an unparseable list, or one whose signature does not verify. Distinct from `notAvailable` because something claiming to be authoritative failed, which is worth looking at. A CRL wearing the issuer's name but signed by another key lands here and never on `notRevoked`: an unsigned list could otherwise *clear* a revoked certificate.
asOf:
type: string
format: date-time
- description: With `notRevoked`, the CRL's `thisUpdate` — the moment its statement is about. A list issued before the seal was made cannot rule out a later revocation, and this is here so a reader can see which question was actually answered.
+ description: 'With `notRevoked`, the CRL''s `thisUpdate`: the moment its statement is about. A list issued before the seal was made cannot rule out a later revocation, and this is here so a reader can see which question was actually answered.'
at:
type: string
format: date-time
@@ -7997,7 +9059,7 @@ components:
description: |-
**Was the seal's signing certificate valid when the seal was made?**
- The second limb of Regulation (EU) No 910/2014 Art. 32(1)(b), reached for seals by Art. 40. The first limb — whether a qualified trust service provider issued it — is a Trusted List question, and is answered in `qualification.issuer` on the same response rather than here. Read the two together: a certificate can be well within its window and issued by nobody any list names.
+ The second limb of Regulation (EU) No 910/2014 Art. 32(1)(b), reached for seals by Art. 40. The first limb (whether a qualified trust service provider issued it) is a Trusted List question, and is answered in `qualification.issuer` on the same response rather than here. Read the two together: a certificate can be well within its window and issued by nobody any list names.
Two findings and the moment they were judged against, because the moment is what decides them: a certificate outside its window is a failure when a timestamp proves the seal was made outside it, and merely unproven otherwise. Certificates expire, sealed passports outlive them by years, and an expired certificate today says nothing about a seal made while it was good.
required:
@@ -8018,17 +9080,17 @@ components:
- noQualifiedDevice
- notAQualifiedCertificate
description: |-
- What the certificate declares about the device holding its private key — a declaration, never a verification.
+ What the certificate declares about the device holding its private key: a declaration, never a verification.
`declaresQualifiedDevice`: the certificate carries the Annex III(j) indication that Regulation (EU) No 910/2014 Art. 32(1)(f), reached for seals through Art. 40, requires.
- `noQualifiedDevice`: it carries qualified-certificate statements but not that one. Lawful, and enough for Art. 40a — validation of an *advanced* seal based on a qualified certificate, which omits the device leg — but not for the Art. 32/40 pair.
+ `noQualifiedDevice`: it carries qualified-certificate statements but not that one. Lawful, and enough for Art. 40a (validation of an *advanced* seal based on a qualified certificate, which omits the device leg) but not for the Art. 32/40 pair.
`notAQualifiedCertificate`: it carries no qualified-certificate statements at all, so it is not presenting itself as a qualified certificate in the first place. A self-signed development certificate lands here.
SealOrigin:
type: object
description: |-
- What a stored seal's own certificate says about who issued it — read out of the seal's bytes, never from this node's configuration. The two are different facts: configuration records what the operator intended, and a seal restored from a backup or made before a backend change was not produced by whatever is configured now.
+ What a stored seal's own certificate says about who issued it: read out of the seal's bytes, never from this node's configuration. The two are different facts: configuration records what the operator intended, and a seal restored from a backup or made before a backend change was not produced by whatever is configured now.
**Not a qualification verdict.** Establishing that a seal is qualified needs the issuer matched against an EU Trusted List *and* the issuer's signature over this certificate verified; neither is done to produce this. What it does answer completely, and without a network, is whether anybody issued the certificate at all.
required:
@@ -8045,7 +9107,7 @@ components:
description: The certificate's issuer distinguished name, RFC 4514.
selfIssued:
type: boolean
- description: 'Whether issuer and subject are the same name — the structural test for "nobody issued this to us", and a property of the certificate that no environment variable can change. True means the seal attests that a key this node holds signed a digest and **nothing else**: it carries no legal weight, and no Trusted List would give it any.'
+ description: 'Whether issuer and subject are the same name: the structural test for "nobody issued this to us", and a property of the certificate that no environment variable can change. True means the seal attests that a key this node holds signed a digest and **nothing else**: it carries no legal weight, and no Trusted List would give it any.'
creationDevice:
$ref: '#/components/schemas/CreationDevice'
TrustServiceStatus:
@@ -8063,19 +9125,19 @@ components:
type: string
description: The trusted-list status URI, verbatim.
description: |-
- The status a trusted list records for a service — ETSI TS 119 612 Annex D.5.
+ The status a trusted list records for a service: ETSI TS 119 612 Annex D.5.
- 🚨 **Three shapes, not two.** `granted` and `withdrawn` are the pair that answers whether a service holds qualified status. Every other status a list can carry — `undersupervision`, `recognisedatnationallevel`, and whatever a Member State publishes next — arrives as an **object**, `{"other": ""}`.
+ **Three shapes, not two.** `granted` and `withdrawn` are the pair that answers whether a service holds qualified status. Every other status a list can carry (`undersupervision`, `recognisedatnationallevel`, and whatever a Member State publishes next) arrives as an **object**, `{"other": ""}`.
They are kept apart deliberately. Folding them into the same string vocabulary as `granted` would invite the reading that `undersupervision` is a lesser kind of qualified, or `recognisedatnationallevel` a weaker `granted`. Neither is true: they answer a different question, asked of a different kind of service.
A client that assumes a string here breaks on the first list entry it meets that is neither granted nor withdrawn. `granted` is the only value that means qualified.
- `null` where it appears on a verdict means the list's history does not reach back to the moment asked about — the list is *silent* about it rather than negative, which is a different finding from a recorded non-granted status.
+ `null` where it appears on a verdict means the list's history does not reach back to the moment asked about: the list is *silent* about it rather than negative, which is a different finding from a recorded non-granted status.
IssuerStanding:
type: object
description: |-
- What the EU Trusted Lists say about the certificate's issuer — Regulation (EU) No 910/2014 Art. 32(1)(a)–(b), reached for seals by Art. 40.
+ What the EU Trusted Lists say about the certificate's issuer: Regulation (EU) No 910/2014 Art. 32(1)(a)–(b), reached for seals by Art. 40.
**"At sealing" throughout, never "now."** A provider granted qualified status in 2029 was not qualified in 2027, and a present-tense check would certify a seal that never was; a provider withdrawn last week did not retroactively unmake the seals it issued. Art. 32(1)(b) asks about the time of signing, and trusted lists carry the history to answer it.
@@ -8094,15 +9156,15 @@ components:
- notQualifiedAtSealing
- qualifiedAtSealing
description: |-
- `selfIssued`: the certificate is its own issuer — nobody issued it to this node. What the local development backend produces. A seal here carries **no legal weight whatsoever**; it attests that a key this node holds signed a digest.
+ `selfIssued`: the certificate is its own issuer: nobody issued it to this node. What the local development backend produces. A seal here carries **no legal weight whatsoever**; it attests that a key this node holds signed a digest.
- `notListed`: some provider issued it, and no list consulted names that issuer as a qualified CA. 🚨 The only verdict claiming an **absence** — read `consulted` and `unchecked` before acting on it.
+ `notListed`: some provider issued it, and no list consulted names that issuer as a qualified CA. The only verdict claiming an **absence**: read `consulted` and `unchecked` before acting on it.
`chainIncomplete`: the seal did not carry enough certificates to reach a root, and no list names any issuer it does refer to. **Weaker than `notListed` deliberately**: the walk ran out of links, so a listed CA may sit above the gap and reporting an unlisted provider would be an accusation drawn from a certificate nobody shipped.
- `signatureNotFromListedCa`: a listed CA carries this name and **did not sign this certificate**. The forgery finding. Every listed certificate under that name was tried — a CA mid-rotation publishes several — and none verifies the signature over this certificate's `tbsCertificate`.
+ `signatureNotFromListedCa`: a listed CA carries this name and **did not sign this certificate**. The forgery finding. Every listed certificate under that name was tried (a CA mid-rotation publishes several) and none verifies the signature over this certificate's `tbsCertificate`.
- `pathUnverifiable`: a listed CA carries this name and the signature could not be checked — usually a key algorithm this build does not verify. **Not an accusation, and never to be read as one.**
+ `pathUnverifiable`: a listed CA carries this name and the signature could not be checked: usually a key algorithm this build does not verify. **Not an accusation, and never to be read as one.**
`notQualifiedAtSealing`: a listed CA issued it, and its status at the sealing moment was not granted.
@@ -8112,16 +9174,16 @@ components:
description: The issuer distinguished name the certificate carries.
subject:
type: string
- description: '`selfIssued` only — the subject name, which is also the issuer name.'
+ description: '`selfIssued` only: the subject name, which is also the issuer name.'
consulted:
type: integer
description: |-
`notListed` only. How many territories' verified lists were searched.
- 🚨 `0` means **nothing was looked at**: the answer is about nothing, and it is what a node with no trusted lists loaded reports for every provider seal, qualified or not.
+ `0` means **nothing was looked at**: the answer is about nothing, and it is what a node with no trusted lists loaded reports for every provider seal, qualified or not.
unchecked:
type: integer
- description: '`notListed` only. How many territories the EU list of trusted lists names could not be verified, and so were not searched. Above zero, a provider listed *there* is indistinguishable from one listed nowhere — see the `unchecked` array on `SealQualification`, which names them.'
+ description: '`notListed` only. How many territories the EU list of trusted lists names could not be verified, and so were not searched. Above zero, a provider listed *there* is indistinguishable from one listed nowhere: see the `unchecked` array on `SealQualification`, which names them.'
missingIssuer:
type: string
description: |-
@@ -8142,35 +9204,35 @@ components:
allOf:
- $ref: '#/components/schemas/TrustServiceStatus'
description: |-
- `notQualifiedAtSealing` only — the status in force at the sealing time.
+ `notQualifiedAtSealing` only: the status in force at the sealing time.
Null means the list's history does not reach back that far, which is a **different finding** from a recorded non-granted status: the list is silent about that moment rather than negative about it.
- 🚨 **Three shapes, not two.** `granted` and `withdrawn` are the two the supervisory body's vocabulary distinguishes for a qualified service; every other status a trusted list can carry — `undersupervision`, `recognisedatnationallevel` and the rest — arrives as an **object**, `{"other": ""}`. Core keeps them readable without making them comparable to `granted`, because they answer a different question asked of a different kind of service, and folding them in would invite the reading that one of them is a lesser kind of qualified.
+ **Three shapes, not two.** `granted` and `withdrawn` are the two the supervisory body's vocabulary distinguishes for a qualified service; every other status a trusted list can carry (`undersupervision`, `recognisedatnationallevel` and the rest) arrives as an **object**, `{"other": ""}`. Core keeps them readable without making them comparable to `granted`, because they answer a different question asked of a different kind of service, and folding them in would invite the reading that one of them is a lesser kind of qualified.
A client that assumes a string here will break on the first list entry it meets that is neither granted nor withdrawn.
reason:
type: string
description: |-
- `pathUnverifiable` only — why the issuer's signature over this certificate could not be checked. Usually a key algorithm this build does not verify; a CA certificate that will not parse is the other.
+ `pathUnverifiable` only: why the issuer's signature over this certificate could not be checked. Usually a key algorithm this build does not verify; a CA certificate that will not parse is the other.
- 🚨 Read it as a limit of the reader, never as a finding about the seal. Reporting this as `signatureNotFromListedCa` would call a possibly-genuine seal a forgery on the strength of a check that never ran.
+ Read it as a limit of the reader, never as a finding about the seal. Reporting this as `signatureNotFromListedCa` would call a possibly-genuine seal a forgery on the strength of a check that never ran.
remoteQscdManagement:
type: boolean
- description: '`qualifiedAtSealing` only. Whether the listed service declares the additional-information qualifier for a QSCD managed on the signer''s behalf — Art. 39a''s second grant.'
+ description: '`qualifiedAtSealing` only. Whether the listed service declares the additional-information qualifier for a QSCD managed on the signer''s behalf: Art. 39a''s second grant.'
UncheckedTerritory:
type: object
description: |-
A territory the EU list of trusted lists names and this node could not consult.
- Carried rather than dropped because the two states a caller must tell apart — *this issuer is on no list* and *the list it would be on could not be read* — are otherwise identical at the point of the verdict.
+ Carried rather than dropped because the two states a caller must tell apart (*this issuer is on no list* and *the list it would be on could not be read*) are otherwise identical at the point of the verdict.
required:
- territory
- reason
properties:
territory:
type: string
- description: The `SchemeTerritory` the list of trusted lists names — the two-letter country code.
+ description: 'The `SchemeTerritory` the list of trusted lists names: the two-letter country code.'
reason:
type: string
description: |-
@@ -8182,17 +9244,17 @@ components:
description: |-
What Regulation (EU) No 910/2014 Art. 32(1) says about a seal, read off the seal and the EU Trusted Lists this node holds. Art. 40 applies Art. 32 to seals *mutatis mutandis*.
- Two legs, and they are independent — a seal can hold either without the other, which is why they are two fields rather than one ladder:
+ Two legs, and they are independent: a seal can hold either without the other, which is why they are two fields rather than one ladder:
- * **Art. 32(1)(a)–(b)** — the certificate was a qualified certificate issued by
+ * **Art. 32(1)(a)–(b)**: the certificate was a qualified certificate issued by
a qualified trust service provider. A Trusted List question (Art. 22),
answered by `issuer`.
- * **Art. 32(1)(f)** — the seal was created by a qualified electronic seal
+ * **Art. 32(1)(f)**: the seal was created by a qualified electronic seal
creation device, which Annex III(j) requires the certificate to declare in
machine-processable form. Answered by `creationDevice`.
- 🚨 **This is not a qualified validation result.** Under Art. 33, reached for seals by Art. 40, a *qualified* validation service is itself a provider service whose result carries that provider's seal. Nothing here is signed and nothing here is qualified — this is a reading of published lists, and conditions (c), (d) and (h) of Art. 32(1) are not checked at all.
+ **This is not a qualified validation result.** Under Art. 33, reached for seals by Art. 40, a *qualified* validation service is itself a provider service whose result carries that provider's seal. Nothing here is signed and nothing here is qualified: this is a reading of published lists, and conditions (c), (d) and (h) of Art. 32(1) are not checked at all.
required:
- issuer
- creationDevice
@@ -8209,13 +9271,101 @@ components:
description: |-
The territories the EU list of trusted lists names and this node could not consult, with the reason for each.
- 🚨 **Read this before acting on a `notListed` issuer.** The two states a caller must tell apart — *this issuer is on no list* and *the list it would be on could not be read* — are otherwise identical at the point of the verdict. Empty means every territory the list of lists names was read.
+ **Read this before acting on a `notListed` issuer.** The two states a caller must tell apart (*this issuer is on no list* and *the list it would be on could not be read*) are otherwise identical at the point of the verdict. Empty means every territory the list of lists names was read.
+ TimestampStanding:
+ type: object
+ description: |-
+ What the EU Trusted Lists say about the authority that stamped the seal's time: Regulation (EU) No 910/2014 Art. 42 and Art. 41(2), via the `TSA/QTST` service type.
+
+ **This is what decides whether `attestedSealedAt` is believed.** A token's own signature holding says it is genuine; it says nothing about who signed it, and the signer is whoever the seal's holder chose. So the moment a seal's certificate is judged against (`certificate.judgedAt`) is treated as attested **only** when this is `qualifiedAtStamping`. In every other case the time is still reported, and the certificate is judged against this node's own clock and reported as unproven rather than as a failure.
+
+ **"At stamping" throughout, never "now."** The list carries the history, and a service withdrawn last week did not retroactively unmake the stamps it made while granted.
+
+ Matched two ways, unlike a seal's issuer. A `TSA/QTST` entry's service identity is usually the timestamping unit's own certificate and sometimes the CA above it, so a token whose signing certificate *is* the listed one needs no path, and one issued by a listed CA needs the path verified link by link.
+
+ Discriminated by `standing`. The shape of the rest depends on which one it is.
+ required:
+ - standing
+ properties:
+ standing:
+ type: string
+ enum:
+ - noAttestedTime
+ - selfIssued
+ - notListed
+ - chainIncomplete
+ - signatureNotFromListedAuthority
+ - pathUnverifiable
+ - notQualifiedAtStamping
+ - qualifiedAtStamping
+ description: |-
+ `noAttestedTime`: the seal carries no timestamp that survived its own checks: a `B-B` seal has none, and so does one whose token failed its signature, its imprint or its authority's validity window. A finding, not a failure to read.
+
+ `selfIssued`: the authority's certificate is its own issuer and no list names it. Decided from the certificate alone, so a node with no network still knows. What the local development backend produces; the time is the signer's own word.
+
+ `notListed`: some provider issued the authority's certificate, and no list consulted names that authority or its CA under `TSA/QTST`. The only standing claiming an **absence**: read `consulted` and `unchecked` before acting on it.
+
+ `chainIncomplete`: the token did not carry enough certificates to reach a root, and no list names any issuer it does refer to. **Weaker than `notListed` deliberately**: a listed CA may sit above the gap.
+
+ `signatureNotFromListedAuthority`: a listed `TSA/QTST` CA carries the name the authority's certificate claims, and **did not sign it**. The forgery finding.
+
+ `pathUnverifiable`: a listed CA carries the claimed name and the signature could not be checked: usually a key algorithm this build does not verify. **Not an accusation, and never to be read as one.**
+
+ `notQualifiedAtStamping`: the authority is a listed `TSA/QTST` service that was not granted when it stamped.
+
+ `qualifiedAtStamping`: the authority is a listed `TSA/QTST` service, granted when it stamped. The only standing that makes the attested time count as a proof of existence.
+ subject:
+ type: string
+ description: '`selfIssued` only: the authority''s subject name, which is also its issuer name.'
+ authority:
+ type: string
+ description: The authority's subject distinguished name.
+ claimedIssuer:
+ type: string
+ description: '`signatureNotFromListedAuthority` and `pathUnverifiable` only: the issuer name the authority''s certificate claims.'
+ consulted:
+ type: integer
+ description: |-
+ `notListed` only. How many territories' verified lists were searched.
+
+ `0` means **nothing was looked at**: the answer is about nothing, and it is what a node with no trusted lists loaded reports for every provider's timestamps, qualified or not.
+ unchecked:
+ type: integer
+ description: '`notListed` only. How many territories the EU list of trusted lists names could not be verified, and so were not searched. Above zero, an authority listed *there* is indistinguishable from one listed nowhere.'
+ missingIssuer:
+ type: string
+ description: '`chainIncomplete` only. The name the walk needed next and the token did not carry.'
+ provider:
+ type:
+ - string
+ - 'null'
+ description: The listed provider, where one was matched.
+ territory:
+ type:
+ - string
+ - 'null'
+ description: The list carrying that service.
+ status:
+ allOf:
+ - $ref: '#/components/schemas/TrustServiceStatus'
+ description: |-
+ `notQualifiedAtStamping` only: the status in force when the authority stamped.
+
+ Null means the list's history does not reach back that far, which is a **different finding** from a recorded non-granted status: the list is silent about that moment rather than negative about it.
+
+ **Three shapes, not two**: see `IssuerStanding.status`. A client that assumes a string here will break on the first list entry that is neither granted nor withdrawn.
+ reason:
+ type: string
+ description: |-
+ `pathUnverifiable` only: why the signature could not be checked.
+
+ Read it as a limit of the reader, never as a finding about the seal.
SealAuditReport:
type: object
description: |-
What the last completed pass over **every stored seal** found.
- The counts beside this describe outbox rows and passports carrying *no* seal. This describes seals that exist and do not stand up — a condition neither can see, because both ask the database whether the seal member is absent, and a worthless seal is present.
+ The counts beside this describe outbox rows and passports carrying *no* seal. This describes seals that exist and do not stand up: a condition neither can see, because both ask the database whether the seal member is absent, and a worthless seal is present.
Whether a stored seal stands up is cryptographic rather than relational: open the CAdES, verify the signature, read the digest it covers. So it is found by a background pass that walks the estate in bounded batches and starts over, not by a query.
required:
@@ -8237,7 +9387,7 @@ components:
completedAt:
type: string
format: date-time
- description: When the pass finished. The age of this is the age of every number below it — a pass takes as long as the estate divided by the audit's throughput, so on a large deployment these are hours old by construction. Fine for a condition that does not appear suddenly, and stated rather than implied.
+ description: 'When the pass finished. The age of this is the age of every number below it: a pass takes as long as the estate divided by the audit''s throughput, so on a large deployment these are hours old by construction. Fine for a condition that does not appear suddenly, and stated rather than implied.'
checked:
type: integer
description: Seals opened.
@@ -8250,19 +9400,19 @@ components:
superseded:
type: integer
description: |-
- Seals over a different digest. Ordinarily a passport re-published after sealing, which is **not** a defect — the seal remains a valid attestation of the signature it covers, and `GET /api/v1/dpp/{dppId}/seal` reports it per passport as `coverage`.
+ Seals over a different digest. Ordinarily a passport re-published after sealing, which is **not** a defect: the seal remains a valid attestation of the signature it covers, and `GET /api/v1/dpp/{dppId}/seal` reports it per passport as `coverage`.
`totalFailed` / `hashFailure` when the question asked is about the passport's *current* signature, which is the question this walk asks.
broken:
type: integer
description: |-
- Seals whose own signature does not verify. **The finding.** Those passports are published and, in substance, unsealed — and invisible to `unsealedPublished`, which asks only whether a seal is present.
+ Seals whose own signature does not verify. **The finding.** Those passports are published and, in substance, unsealed, and invisible to `unsealedPublished`, which asks only whether a seal is present.
- `totalFailed` / `sigCryptoFailure`, and EN 319 102-1 makes that verdict stable: no additional validation data can lift it. That is what makes a replacement seal worth buying for these and for nothing else here — `POST /api/v1/dpp/{dppId}/seal/repair`.
+ `totalFailed` / `sigCryptoFailure`, and EN 319 102-1 makes that verdict stable: no additional validation data can lift it. That is what makes a replacement seal worth buying for these and for nothing else here: `POST /api/v1/dpp/{dppId}/seal/repair`.
certificateFailed:
type: integer
description: |-
- Seals whose signature is sound and whose **certificate** was not, at the moment they were made — revoked before sealing, or outside its validity window, with an attested time to prove the order. `totalFailed` with a certificate sub-indication.
+ Seals whose signature is sound and whose **certificate** was not, at the moment they were made: revoked before sealing, or outside its validity window, with an attested time to prove the order. `totalFailed` with a certificate sub-indication.
Counted apart from `broken` because the two need opposite responses. A broken seal is worth replacing; a seal made under a revoked certificate would only be replaced by another from the same certificate, so `POST /api/v1/dpp/{dppId}/seal/repair` refuses it and says why.
@@ -8270,13 +9420,13 @@ components:
unreadable:
type: integer
description: |-
- Seals this node could not read — a placeholder, or a format it does not parse. **Not a finding.** Treating "cannot check" as "broken" would make every seal from a backend emitting an unparsed format look like corruption.
+ Seals this node could not read: a placeholder, or a format it does not parse. **Not a finding.** Treating "cannot check" as "broken" would make every seal from a backend emitting an unparsed format look like corruption.
`indeterminate` with a custom diagnostic: a limit of the reader, not a defect in the seal.
archivalLapsed:
type: integer
description: |-
- `B-LTA` seals whose archival protection has already gone — the archive timestamp's own authority certificate has expired.
+ `B-LTA` seals whose archival protection has already gone: the archive timestamp's own authority certificate has expired.
**Not a defect in the seal**, which still verifies. It is the protection `B-LTA` exists to provide, having run out while nothing renewed it. A seal here is past the window in which renewing was routine.
archivalDue:
@@ -8284,11 +9434,13 @@ components:
description: |-
`B-LTA` seals whose archival protection expires soon.
- A reporting threshold rather than a purchase trigger: nothing on this node buys a renewal. The window between "due" and "gone" is the only one in which renewing is routine rather than an incident, which is why it is reported separately from `archivalLapsed`.
+ The window between "due" and "gone" is the only one in which renewing is routine rather than an incident, which is why it is reported separately from `archivalLapsed`.
+
+ On a node with a timestamp source configured, the pass that finds a seal due **renews** it, and a seal renewed there is not counted: what remains here is what still needs attention. On a node with none, this is simply what is due, and nothing is bought.
archivalUnverifiable:
type: integer
description: |-
- `B-LTA` seals carrying an archive timestamp this node cannot use — either it does not parse, or it is not a timestamp of *this* seal.
+ `B-LTA` seals carrying an archive timestamp this node cannot use: either it does not parse, or it is not a timestamp of *this* seal.
**Not a renewal candidate.** Renewing carries existing protection forward, and here there is none: the seal claims a level it does not have. Read this beside `broken` rather than beside `archivalDue`.
brokenPassports:
@@ -8296,7 +9448,7 @@ components:
items:
type: string
format: uuid
- description: The passports carrying a broken seal, so an operator can act rather than search a log. Capped — see `truncated`. A node with thousands of broken seals has one problem, not thousands; `broken` states its size, and a list long enough to prove that is a list nobody reads.
+ description: 'The passports carrying a broken seal, so an operator can act rather than search a log. Capped: see `truncated`. A node with thousands of broken seals has one problem, not thousands; `broken` states its size, and a list long enough to prove that is a list nobody reads.'
renewalPassports:
type: array
items:
@@ -8305,7 +9457,7 @@ components:
description: |-
The passports whose archival protection has lapsed or is due, capped the same way `brokenPassports` is.
- Lapsed and due share one list because they share one action — renew — and `archivalLapsed` and `archivalDue` already say how many are in each state.
+ Lapsed and due share one list because they share one action (renew) and `archivalLapsed` and `archivalDue` already say how many are in each state.
truncated:
type: boolean
description: True when `brokenPassports` was cut short. Stated rather than left to be inferred from the length matching the cap, which is an inference that is right until the cap changes.
@@ -8314,13 +9466,13 @@ components:
description: |-
True when `renewalPassports` was cut short.
- 🚨 A separate flag from `truncated`, not a shared one. Two capped lists fill independently: a pass can name every renewal candidate while cutting the broken list short, or the reverse. One flag covering both would report a complete list as truncated, or — worse — a truncated one as complete.
+ A separate flag from `truncated`, not a shared one. Two capped lists fill independently: a pass can name every renewal candidate while cutting the broken list short, or the reverse. One flag covering both would report a complete list as truncated, or (worse) a truncated one as complete.
AmendRequest:
type: object
description: |
Body for amending a published passport.
- A published passport's content is immutable — its signatures commit to its
+ A published passport's content is immutable: its signatures commit to its
bytes and the retention guard refuses the write. An amendment therefore
publishes a **new** passport carrying `supersedesId` back to the one being
corrected, and moves that one to the terminal `superseded` state. The
@@ -8333,13 +9485,20 @@ components:
description: |
The correction, in the same shape the draft-update body takes: only the
patchable content fields (`productName`, `co2ePerUnit`,
- `repairabilityScore`, `productGroupData`, `componentRefs`) take effect.
+ `repairabilityScore`, `productGroupData`, `componentRefs`, `personalData`) take
+ effect.
Other keys are ignored rather than refused, so a client that sends a full
create-shaped body still works and still cannot make a create-time field
- take effect. Fields fixed at issuance — the product group, the schema
- version, the manufacturer, the lineage edges — are not amendable; a
+ take effect. Fields fixed at issuance (the product group, the schema
+ version, the manufacturer, the lineage edges) are not amendable; a
passport whose product group is wrong is not the same product.
+
+ `carrierSerial` is fixed at issuance too, and is the one such key that is
+ refused rather than ignored when it differs from the serial the passport
+ prints, with `422` naming `/carrierSerial`. It is what the label carries,
+ and the successor keeps the predecessor's so that the label stays the
+ same. The same value is accepted.
additionalProperties: true
example:
productName: Model X Battery Pack (rev B)
@@ -8352,7 +9511,7 @@ components:
type: string
description: |
Why the passport is being corrected. Recorded on the superseded record's
- audit entry alongside the successor's id — the two together are what
+ audit entry alongside the successor's id: the two together are what
answers "why did this change" for a reader who arrives at the old record.
example: Recycled-content share restated after supplier re-declaration
SupersedeRequest:
@@ -8365,8 +9524,8 @@ components:
content and its own publish gates, so it goes through the normal create and
publish routes and is only then named here.
- For the other direction — correcting a published passport, where the successor
- is derived from the record it replaces — use `POST /dpp/{dppId}/amend`, which
+ For the other direction (correcting a published passport, where the successor
+ is derived from the record it replaces) use `POST /dpp/{dppId}/amend`, which
mints the successor itself and cannot name one that already exists.
required:
- supersededBy
@@ -8383,7 +9542,7 @@ components:
type: string
description: |
Why the passport is being retired. Stored on the predecessor's audit entry
- alongside the successor's id — the same entry `amend` writes, so a reader
+ alongside the successor's id: the same entry `amend` writes, so a reader
arriving at a retired record finds what replaced it and why, whichever
route retired it.
example: Reissued on schema 2.6.0 after the product group's lens changed
@@ -8400,7 +9559,7 @@ components:
example: 2026-Q3.2
changed:
type: boolean
- description: Whether this call actually replaced the ruleset. `false` means the channel re-offered the bundle already in force — the ordinary answer on a quiet channel, and a success rather than an error.
+ description: 'Whether this call actually replaced the ruleset. `false` means the channel re-offered the bundle already in force: the ordinary answer on a quiet channel, and a success rather than an error.'
example: true
parameters:
IdempotencyKey:
@@ -8416,7 +9575,7 @@ components:
execution without comparing anything.
Only the routes that document this parameter accept it. Sending it to any
- other route is a `400` rather than being ignored — a route that is idempotent
+ other route is a `400` rather than being ignored: a route that is idempotent
by shape records nothing, and silently accepting the header would suggest a
protection that is not there.
@@ -8456,7 +9615,7 @@ components:
detail: Missing or invalid Authorization header.
Forbidden:
description: |
- The credential is authenticated but lacks the required scope — e.g. a
+ The credential is authenticated but lacks the required scope, e.g. a
`write`/`read` key attempting an admin-only action.
Every scope refusal in the service answers this one sentence, naming the scope
@@ -8471,31 +9630,6 @@ components:
title: Forbidden
status: 403
detail: This operation requires an admin-scoped credential.
- IdempotentRequestInFlight:
- description: |
- An earlier attempt carrying this `Idempotency-Key` is still running.
-
- Returned instead of letting a duplicate execute alongside it. Retry shortly
- with the same key and the same body; `Retry-After` carries the suggested
- delay.
-
- A claim left behind by a process that died mid-request is reclaimed
- automatically after 60 seconds, so this can never wedge a key permanently.
- headers:
- Retry-After:
- description: Seconds to wait before retrying.
- schema:
- type: integer
- minimum: 1
- content:
- application/problem+json:
- schema:
- $ref: '#/components/schemas/Problem'
- example:
- type: https://problems.odal-node.io/idempotent-request-in-flight
- title: Idempotent Request In Flight
- status: 409
- detail: An earlier attempt with this `Idempotency-Key` is still running. Retry shortly; do not change the body.
ValidationError:
description: One or more fields failed validation.
content:
@@ -8520,7 +9654,7 @@ components:
detail: DPP not found.
BadRequest:
description: |
- A path parameter is malformed — most often a `{dppId}` or `{id}` that is not a
+ A path parameter is malformed, most often a `{dppId}` or `{id}` that is not a
UUID. The request never reaches the resource, so this is distinct from `404`,
which means the identifier was well-formed and nothing matched it.
content:
@@ -8534,7 +9668,7 @@ components:
detail: not-a-uuid is not a valid DPP id.
Conflict:
description: |
- State conflict — e.g. attempting to publish an already-published DPP
+ State conflict, e.g. attempting to publish an already-published DPP
or updating a retired DPP.
content:
application/problem+json:
@@ -8545,9 +9679,34 @@ components:
title: Conflict
status: 409
detail: DPP is already published.
+ IdempotentRequestInFlight:
+ description: |
+ An earlier attempt carrying this `Idempotency-Key` is still running.
+
+ Returned instead of letting a duplicate execute alongside it. Retry shortly
+ with the same key and the same body; `Retry-After` carries the suggested
+ delay.
+
+ A claim left behind by a process that died mid-request is reclaimed
+ automatically after 60 seconds, so this can never wedge a key permanently.
+ headers:
+ Retry-After:
+ description: Seconds to wait before retrying.
+ schema:
+ type: integer
+ minimum: 1
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ example:
+ type: https://problems.odal-node.io/idempotent-request-in-flight
+ title: Idempotent Request In Flight
+ status: 409
+ detail: An earlier attempt with this `Idempotency-Key` is still running. Retry shortly; do not change the body.
Gone:
description: |
- The passport exists but has been withdrawn from public view — it is suspended.
+ The passport exists but has been withdrawn from public view: it is suspended.
Distinct from `404`: the node is confirming the identifier is real and
declining to serve it, rather than denying knowledge of it.
content:
@@ -8559,13 +9718,38 @@ components:
title: Gone
status: 410
detail: This passport is suspended and is not publicly available.
+ ImportBusy:
+ description: |
+ The node is already running as many imports as it allows.
+
+ Returned after the caller is authenticated and before the handler reads the
+ upload, so nothing was parsed or written. The limit is `IMPORT_MAX_CONCURRENT`
+ (default 2). An import over the synchronous threshold keeps its place until its
+ background job finishes, so the `202` does not free it. Retry after the delay in
+ `Retry-After`. The `429` is not recorded under an `Idempotency-Key`, so a retry
+ with the same key runs.
+ headers:
+ Retry-After:
+ description: Seconds to wait before retrying.
+ schema:
+ type: integer
+ minimum: 1
+ content:
+ application/problem+json:
+ schema:
+ $ref: '#/components/schemas/Problem'
+ example:
+ type: https://problems.odal-node.io/too-many-requests
+ title: Too Many Requests
+ status: 429
+ detail: This node is already running as many imports as it allows. Retry once one has finished.
NotAcceptable:
description: |
No representation matches the request's `Accept` header. The response
body names the media types this resource can produce.
- A passport carrying no GTIN — an unsold-goods report, or an untyped
- product group — also gets this for `application/aas+json`: it identifies no
+ A passport carrying no GTIN (an unsold-goods report, or an untyped
+ product group) also gets this for `application/aas+json`: it identifies no
trade item, so it has no AAS asset identity and therefore no AAS
representation.
content:
@@ -8603,8 +9787,8 @@ components:
description: |
The resolver could not read the passport from the vault it fronts.
- The resolver holds no passport data of its own — it fetches from the vault's
- public tier on every request — so an unreachable vault, or one answering
+ The resolver holds no passport data of its own (it fetches from the vault's
+ public tier on every request) so an unreachable vault, or one answering
anything other than a success, a `404`/`400` or a `410`, is reported as an
upstream failure rather than as an answer about the passport.
@@ -8626,7 +9810,7 @@ components:
Verification needs the operator's DID document, and this is the answer when
that document cannot be fetched, cannot be parsed, or carries no key matching
- the signature's `kid`. The passport itself may be perfectly valid — nothing
+ the signature's `kid`. The passport itself may be perfectly valid: nothing
has been established about it either way, which is why this is a temporary
failure and not a judgement.
@@ -8643,7 +9827,7 @@ components:
detail: The passport could not be verified right now; try again later.
ServiceUnavailable:
description: |
- A dependency the node needs is not reachable — the readiness probe pings the
+ A dependency the node needs is not reachable: the readiness probe pings the
primary datastore, and reports this when that ping fails. The node is running;
it is not ready to serve.
content:
diff --git a/site/dpp-docs/src/components/PassportDate.astro b/site/dpp-docs/src/components/PassportDate.astro
new file mode 100644
index 0000000..cacd788
--- /dev/null
+++ b/site/dpp-docs/src/components/PassportDate.astro
@@ -0,0 +1,14 @@
+---
+// PassportDate.astro — the date an act's passport becomes mandatory, from the
+// vendored dpp-core instrument records. See src/lib/acts.ts.
+import { passportDate } from '../lib/acts';
+
+interface Props {
+ act: string;
+ short?: boolean;
+}
+
+const { act, short = false } = Astro.props;
+---
+
+{passportDate(act, short ? 'short' : 'long')}
diff --git a/site/dpp-docs/src/content/docs/core-concepts.mdx b/site/dpp-docs/src/content/docs/core-concepts.mdx
index 6e87672..aae4567 100644
--- a/site/dpp-docs/src/content/docs/core-concepts.mdx
+++ b/site/dpp-docs/src/content/docs/core-concepts.mdx
@@ -1,36 +1,53 @@
---
title: Core Concepts
-description: The three ideas behind Odal Node's design, namely the proof-bound architecture, the split between open core and engine, and the single extension point for new regulation.
+description: The three rules behind Odal Node's design. Data is signed where it is produced, regulation and operation live in separate parts, and new regulation plugs into one extension point.
---
import { Aside } from "@astrojs/starlight/components";
-Odal Node's design rests on three ideas. Each section below links to a fuller page.
+Odal Node's design follows three rules. Each section links to a fuller page.
-## Proof-bound: the data stays yours
+## Signed at the source, verified anywhere
-The operator's product data never reaches Odal. The manufacturer validates a passport on their own node and signs it with their own key, and the node stores it there. What the node serves is the signed passport: the product data the operator chose to publish, with every field bound to a proof and filtered by the reader's access rights.
+The operator's product data never reaches Odal. The manufacturer validates each passport
+on its own node, signs it with its own Ed25519 key, and stores it there. The node serves
+the signed passport: the product data the operator chose to publish, with each field
+bound to a signature and filtered by the reader's access rights.
-This is how the software works, so it does not depend on trusting us. Verifying a passport needs only the signed passport and the manufacturer's public identity. Odal does not need to be online, or to exist.
+Verifying a passport needs only the signed passport and the manufacturer's public
+`did:web` document. Odal does not need to be online, or to exist.
-[What Odal Node can and cannot see](/getting-started/what-odal-can-and-cannot-see) covers the data boundary in full.
+[What Odal can and cannot see](/getting-started/what-odal-can-and-cannot-see) covers the
+data boundary in full.
-## Open core: regulation in one part, operation in the other
+## Regulation in one part, operation in the other
-Odal Node has two parts under two licences. The **core** is the regulatory library, open source under Apache-2.0: the rules a compliant passport must satisfy. The **engine** is the service that runs those rules in production, source-available under BSL-1.1 with a grant that allows self-hosting.
+Odal Node has two parts under two licences. The **core** is the regulatory library, open
+source under Apache-2.0: the rules a compliant passport must satisfy. The **engine** is
+the service that runs those rules in production, source-available under BSL-1.1 with a
+grant that allows self-hosting.
-One rule decides where a change belongs. If it changes because an EU regulation changed, it goes in the core. If it changes because of how the system is deployed or operated, it goes in the engine. The engine depends on the core; the core does not know the engine exists.
+One rule decides where a change belongs. If it changes because an EU regulation changed,
+it goes in the core. If it changes because of how the system is deployed or operated, it
+goes in the engine. The engine depends on the core; the core does not depend on the
+engine.
[Licensing](/getting-started/licensing) covers what each licence allows.
## One extension point for new regulation
-Regulation arrives one product group at a time, and it keeps changing. The core therefore has a single extension point: each product group's compliance logic plugs in there, and new product groups and revised rules are added without changing anything around them. See [Product groups & plugins](/core/sectors).
+Regulation arrives one product group at a time, and it keeps changing. The core has a
+single extension point for it: each product group's compliance logic plugs in there, so
+new product groups and revised rules are added without changing anything around them.
+See [Product groups & plugins](/core/sectors).
-
- Some public values are placeholders. For passports from February 2027,
+ Some public values are placeholders. For passports from {passportDateOf("battery-reg-2023-1542", "month")},
the Commission's guidance says to leave the carbon footprint and the
shares of recycled cobalt, lithium, nickel and lead empty until the rules
for calculating and showing them apply. The software still asks for
diff --git a/site/dpp-landing/src/pages/faq.astro b/site/dpp-landing/src/pages/faq.astro
index 9cbb8ad..f34b811 100644
--- a/site/dpp-landing/src/pages/faq.astro
+++ b/site/dpp-landing/src/pages/faq.astro
@@ -10,10 +10,14 @@ import Base from "../layouts/Base.astro";
import Section from "../components/Section.astro";
import ExternalArrow from "../components/ExternalArrow.astro";
import faq from "../data/faq.json";
+import { withPassportDates } from "../lib/regulations";
type Item = { q: string; a: string[]; link?: { href: string; label: string } };
type Group = { title: string; items: Item[] };
-const groups = faq.groups as Group[];
+const groups = (faq.groups as Group[]).map((g) => ({
+ ...g,
+ items: g.items.map((it) => ({ ...it, a: it.a.map(withPassportDates) })),
+}));
const title = "FAQ: Digital Product Passports and Odal Node | Odal Node";
const description =
diff --git a/site/dpp-landing/src/pages/glossary.astro b/site/dpp-landing/src/pages/glossary.astro
index 79fa7a2..ece7070 100644
--- a/site/dpp-landing/src/pages/glossary.astro
+++ b/site/dpp-landing/src/pages/glossary.astro
@@ -6,9 +6,10 @@ import Base from "../layouts/Base.astro";
import Section from "../components/Section.astro";
import ExternalArrow from "../components/ExternalArrow.astro";
import glossary from "../data/glossary.json";
+import { withPassportDates } from "../lib/regulations";
type Term = { term: string; definition: string; link?: { href: string; label: string } };
-const terms = glossary.terms as Term[];
+const terms = (glossary.terms as Term[]).map((t) => ({ ...t, definition: withPassportDates(t.definition) }));
const title = "Glossary: Digital Product Passport terms | Odal Node";
const description =
diff --git a/site/dpp-landing/src/pages/index.astro b/site/dpp-landing/src/pages/index.astro
index 9834e7e..46a758e 100644
--- a/site/dpp-landing/src/pages/index.astro
+++ b/site/dpp-landing/src/pages/index.astro
@@ -41,7 +41,7 @@ const softwareAppLd = {
applicationCategory: "BusinessApplication",
operatingSystem: "Linux, Docker",
description:
- "Self-hosted infrastructure for EU Digital Product Passports (DPP) under the Ecodesign for Sustainable Products Regulation (ESPR). Validates product data against each product group's rules, signs with your keys, and publishes verifiable passports via GS1 Digital Link.",
+ "Self-hosted infrastructure for EU Digital Product Passports (DPP) under the Ecodesign for Sustainable Products Regulation (ESPR). Validates product data against each product group's rules, signs with your keys, and publishes verifiable passports that open from the digital link on the product.",
url: "https://odal-node.io",
offers: {
"@type": "Offer",
diff --git a/site/dpp-landing/src/pages/lifecycle.astro b/site/dpp-landing/src/pages/lifecycle.astro
index 3b0146c..4024fec 100644
--- a/site/dpp-landing/src/pages/lifecycle.astro
+++ b/site/dpp-landing/src/pages/lifecycle.astro
@@ -9,6 +9,7 @@
import Base from "../layouts/Base.astro";
import Section from "../components/Section.astro";
import stations from "../data/stations.json";
+import { passportDateOf } from "../lib/regulations";
const title = "Lifecycle: one passport, eight stations | Odal Node";
const description =
@@ -81,7 +82,7 @@ const afterSale = stations.stations.filter((s) => s.n >= 6);
All eight stations exist in the software today. Nobody is running
it in production: no customers, no pilots, no live deployments.
- The battery passport obligation begins on 18 February 2027, and we would
+ The battery passport obligation begins on {passportDateOf("battery-reg-2023-1542")}, and we would
rather be correct when it arrives than early and wrong.
diff --git a/site/dpp-landing/src/pages/repairers-and-recyclers.astro b/site/dpp-landing/src/pages/repairers-and-recyclers.astro
index dde9f2b..3461167 100644
--- a/site/dpp-landing/src/pages/repairers-and-recyclers.astro
+++ b/site/dpp-landing/src/pages/repairers-and-recyclers.astro
@@ -13,6 +13,7 @@ import Base from "../layouts/Base.astro";
import Section from "../components/Section.astro";
import Button from "../components/Button.astro";
import access from "../data/access.json";
+import { passportDateOf } from "../lib/regulations";
const title = "For repairers and recyclers: reading a Digital Product Passport | Odal Node";
const description =
@@ -36,7 +37,7 @@ const mailto = `mailto:contact@odal-node.io?subject=${encodeURIComponent("Readin
This page covers the battery passport, the first one the law requires,
- from 18 February 2027. For other product groups, no act sets these
+ from {passportDateOf("battery-reg-2023-1542")}. For other product groups, no act sets these
access rights yet.
diff --git a/site/dpp-landing/src/pages/roadmap.astro b/site/dpp-landing/src/pages/roadmap.astro
index 45b4c84..d5809c2 100644
--- a/site/dpp-landing/src/pages/roadmap.astro
+++ b/site/dpp-landing/src/pages/roadmap.astro
@@ -10,6 +10,7 @@
import Base from "../layouts/Base.astro";
import Section from "../components/Section.astro";
import OurRoadmap from "../components/Roadmap.astro";
+import { passportDateOf } from "../lib/regulations";
const title = "Roadmap: what is built, waiting and next | Odal Node";
const description =
@@ -24,7 +25,7 @@ const description =
Nobody is running this in production. No customers, no
pilots, no live deployments, and nothing below should be read as evidence
- of any. The battery passport obligation begins on 18 February 2027, and we
+ of any. The battery passport obligation begins on {passportDateOf("battery-reg-2023-1542")}, and we
would rather be correct when it arrives than early and wrong.
diff --git a/site/dpp-landing/src/pages/timeline.astro b/site/dpp-landing/src/pages/timeline.astro
index 1a2195e..3aa29f8 100644
--- a/site/dpp-landing/src/pages/timeline.astro
+++ b/site/dpp-landing/src/pages/timeline.astro
@@ -8,7 +8,7 @@ import Base from "../layouts/Base.astro";
import Section from "../components/Section.astro";
import BasisMark from "../components/BasisMark.astro";
import { years, undated, planSource } from "../lib/timeline";
-import { basisLabel, formatDate } from "../lib/regulations";
+import { basisLabel, formatDate, passportDateOf } from "../lib/regulations";
const title = "Timeline: when Digital Product Passports arrive | Odal Node";
const description =
@@ -26,7 +26,7 @@ const marked = years.some(({ year, entries }) => year === thisYear && entries.so
- Batteries come first, in February 2027. Detergents, toys and vehicles
+ Batteries come first, in {passportDateOf("battery-reg-2023-1542", "month")}. Detergents, toys and vehicles
follow on dates their own laws set, and the Commission plans acts for more
product groups, each of which will set its own passport date.
Publish. The signed passport's public part becomes
- readable through its QR code and GS1 Digital Link; other parts are
+ readable through the digital link in its QR code; other parts are
shown only to readers with a credential.