This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/docs by this push:
     new 54f071f452 feat(docs): TODO-71 — local stage/prod deploy scripts + 
Algolia → @easyops-cn/docusaurus-search-local swap + README/release-notes 
updates
54f071f452 is described below

commit 54f071f452c87ea71a4a06e576718d6b6b9be712
Author: James Bognar <[email protected]>
AuthorDate: Tue May 26 14:43:04 2026 -0400

    feat(docs): TODO-71 — local stage/prod deploy scripts + Algolia → 
@easyops-cn/docusaurus-search-local swap + README/release-notes updates
    
    Co-authored-by: Cursor <[email protected]>
---
 README.md                     |   62 +-
 docusaurus.config.ts          |   47 +-
 package-lock.json             | 1542 ++++++++++++++++++++++++++++++++++++++---
 package.json                  |    1 +
 pages/release-notes/9.5.0.md  |    8 +
 scripts/build-docs.py         |  146 ++--
 scripts/release-docs-stage.py |   41 +-
 scripts/release-docs.py       |   39 +-
 8 files changed, 1714 insertions(+), 172 deletions(-)

diff --git a/README.md b/README.md
index 07557b5654..879199d02b 100644
--- a/README.md
+++ b/README.md
@@ -313,7 +313,67 @@ Juneau is packed with features that may not be obvious at 
first. Users are encou
    * juneau-rest-client - Apache HttpClient 4.5+.
 * Built on top of Servlet and Apache HttpClient APIs that allow you to use the 
newest HTTP/2 features such as request/response multiplexing and server push.
 
-## Building
+## Building the docs site
+
+The documentation site is a [Docusaurus 3](https://docusaurus.io/) project. 
Builds and deploys are driven by local Python scripts under `scripts/` — there 
is no longer a `push`-triggered GitHub Action; publishes happen when a human 
runs the script.
+
+**Prerequisites:**
+* Node.js 18+ and npm
+* Java 17 (`~/jdk/openjdk_17.0.14.0.101_17.57.18_aarch64/bin/java` on this 
workstation)
+* Apache Maven (for the Java tree's `site` build)
+* A sibling `master` checkout of the Juneau Java repository at `../master/` 
(`scripts/build-docs.py` runs Maven `site` there to harvest the javadocs)
+
+**Dev server (hot reload, no deploy):**
+
+```bash
+python3 scripts/start-docusaurus.py        # serves http://localhost:3000
+```
+
+The script kills any process on port 3000, clears the Docusaurus cache, runs 
`npm install` if needed, and starts `npm start`. Edit `pages/` and the page 
reloads automatically.
+
+**Full local build (Maven site + Docusaurus + link checks):**
+
+```bash
+python3 scripts/build-docs.py                       # full pipeline
+python3 scripts/build-docs.py --dry-run             # print everything it 
would do, run nothing
+python3 scripts/build-docs.py --verbose             # full per-stage banners
+python3 scripts/build-docs.py --skip-maven          # Docusaurus only (no Java 
work)
+python3 scripts/build-docs.py --skip-npm            # Maven site only
+python3 scripts/build-docs.py --staging             # set SITE_URL to 
juneau.staged.apache.org
+```
+
+Output lands in `build/`. On a successful full build the script prints a 
publish reminder.
+
+**Local production preview** (no deploy, just `docusaurus serve` over the prod 
build):
+
+```bash
+npm run build && npm run serve
+```
+
+**Deploy to staging** (`https://juneau.staged.apache.org`):
+
+```bash
+git config --get user.email           # must be [email protected]
+python3 scripts/release-docs-stage.py
+# (use --no-push to rehearse without pushing)
+```
+
+The script verifies the git identity, runs the staged build, clones (or 
updates) a sibling `../asf-staging/` checkout, copies the build output in, 
commits, and force-pushes `asf-staging` to origin. Open 
`http://juneau.staged.apache.org` to verify before promoting.
+
+**Promote staging to production** (`https://juneau.apache.org`):
+
+```bash
+git config --get user.email           # must be [email protected]
+python3 scripts/release-docs.py
+# (use --no-push to rehearse)
+```
+
+This promotes whatever is currently on `origin/asf-staging` to `asf-site`. 
Only run after eyeballing the staged site.
+
+**AI-driven flows:** the Cursor / Claude `@juneau-docs-workflow` skill 
provides natural-phrase routing for all of the above ("start docs locally", 
"deploy docs to stage", "deploy docs to prod", "add to release notes", etc.).
+
+## Building the Java tree
+
 Building requires:
 * [Apache Maven](https://maven.apache.org/)
 * Java 17 is required to build and run.
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 1e2a092516..34d639ed5a 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -44,36 +44,6 @@ const giscusConfig: GiscusThemeConfig = {
 const baseThemeConfig: Preset.ThemeConfig = {
   // Replace with your project's social card
   image: 'img/docusaurus-social-card.jpg',
-  algolia: {
-    // The application ID provided by Algolia
-    appId: 'DVIGEYTUK7',
-
-    // Public API key: it is safe to commit it
-    apiKey: 'db9fd10aa92e0ad212e08340e37293c0',
-
-    indexName: 'juneau_docsJuneau Website',
-
-    // Optional: see doc section below
-    contextualSearch: true,
-
-    // Optional: Specify domains where the navigation should occur through 
window.location instead on history.push. Useful when our Algolia config crawls 
multiple documentation sites and we want to navigate with window.location.href 
to them.
-    // externalUrlRegex: 'external\\.com|domain\\.com',
-
-    // Optional: Replace parts of the item URLs from Algolia. Useful when 
using the same search index for multiple deployments using a different baseUrl. 
You can use regexp or string in the `from` param. For example: localhost:3000 
vs myCompany.com/docs
-    // replaceSearchResultPathname: {
-    //   from: '/docs/', // or as RegExp: /\/docs\//
-    //   to: '/',
-    // },
-
-    // Optional: Algolia search parameters
-    searchParameters: {},
-
-    // Optional: path for search page that enabled by default (`false` to 
disable it)
-    searchPagePath: 'search',
-
-    // Optional: whether the insights feature is enabled or not on Docsearch 
(`false` by default)
-    insights: false,
-  },
   navbar: {
     title: 'Apache Juneau',
     logo: {
@@ -246,6 +216,23 @@ const config: Config = {
     ],
   ],
 
+  // Client-side local search — built into the deployed bundle at site-build 
time.
+  // Replaces the previous Algolia DocSearch integration: no external service,
+  // no API key, search index is always in sync with the source.
+  themes: [
+    [
+      '@easyops-cn/docusaurus-search-local',
+      {
+        hashed: true,
+        language: ['en'],
+        indexDocs: true,
+        indexBlog: true,
+        indexPages: true,
+        docsRouteBasePath: '/docs',
+      },
+    ],
+  ],
+
   themeConfig,
 };
 
diff --git a/package-lock.json b/package-lock.json
index f75059075a..e3b30b4b43 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,6 +23,7 @@
         "@docusaurus/module-type-aliases": "3.8.1",
         "@docusaurus/tsconfig": "3.8.1",
         "@docusaurus/types": "3.8.1",
+        "@easyops-cn/docusaurus-search-local": "^0.54.1",
         "string-replace-loader": "^3.2.0",
         "typescript": "~5.6.2",
         "unist-util-visit": "^5.0.0"
@@ -4023,6 +4024,162 @@
         "node": ">=18.0"
       }
     },
+    "node_modules/@easyops-cn/autocomplete.js": {
+      "version": "0.38.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz";,
+      "integrity": 
"sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "immediate": "^3.2.3"
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local": {
+      "version": "0.54.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.54.1.tgz";,
+      "integrity": 
"sha512-CexWCS1ktR7ZtvKWvbBhY7+NBRzQPVCAReBed6k5U9M2hdAARI3cK+NBUCegbd4F8VV54Re1HpIb2+GZwl8zEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/plugin-content-docs": "^2 || ^3",
+        "@docusaurus/theme-translations": "^2 || ^3",
+        "@docusaurus/utils": "^2 || ^3",
+        "@docusaurus/utils-common": "^2 || ^3",
+        "@docusaurus/utils-validation": "^2 || ^3",
+        "@easyops-cn/autocomplete.js": "^0.38.1",
+        "@node-rs/jieba": "^1.6.0",
+        "cheerio": "^1.0.0",
+        "clsx": "^2.1.1",
+        "comlink": "^4.4.2",
+        "debug": "^4.2.0",
+        "fs-extra": "^10.0.0",
+        "klaw-sync": "^6.0.0",
+        "lunr": "^2.3.9",
+        "lunr-languages": "^1.4.0",
+        "mark.js": "^8.11.1",
+        "tslib": "^2.4.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "open-ask-ai": "^0.7.3"
+      },
+      "peerDependencies": {
+        "@docusaurus/theme-common": "^2 || ^3",
+        "react": "^16.14.0 || ^17 || ^18 || ^19",
+        "react-dom": "^16.14.0 || 17 || ^18 || ^19"
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": {
+      "version": "1.2.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/cheerio/-/cheerio-1.2.0.tgz";,
+      "integrity": 
"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cheerio-select": "^2.1.0",
+        "dom-serializer": "^2.0.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.2.2",
+        "encoding-sniffer": "^0.2.1",
+        "htmlparser2": "^10.1.0",
+        "parse5": "^7.3.0",
+        "parse5-htmlparser2-tree-adapter": "^7.1.0",
+        "parse5-parser-stream": "^7.1.2",
+        "undici": "^7.19.0",
+        "whatwg-mimetype": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=20.18.1"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/cheerio?sponsor=1";
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": {
+      "version": "7.0.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/entities/-/entities-7.0.1.tgz";,
+      "integrity": 
"sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1";
+      }
+    },
+    "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": {
+      "version": "10.1.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/fs-extra/-/fs-extra-10.1.0.tgz";,
+      "integrity": 
"sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    
"node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": {
+      "version": "10.1.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/htmlparser2/-/htmlparser2-10.1.0.tgz";,
+      "integrity": 
"sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+      "dev": true,
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1";,
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55";
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.2.2",
+        "entities": "^7.0.1"
+      }
+    },
+    "node_modules/@emnapi/core": {
+      "version": "1.10.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@emnapi/core/-/core-1.10.0.tgz";,
+      "integrity": 
"sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/wasi-threads": "1.2.1",
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/runtime": {
+      "version": "1.10.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@emnapi/runtime/-/runtime-1.10.0.tgz";,
+      "integrity": 
"sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/wasi-threads": {
+      "version": "1.2.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz";,
+      "integrity": 
"sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@giscus/react": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/@giscus/react/-/react-3.1.0.tgz";,
@@ -4152,144 +4309,900 @@
       "integrity": 
"sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==",
       "license": "BSD-3-Clause",
       "dependencies": {
-        "@lit-labs/ssr-dom-shim": "^1.4.0"
+        "@lit-labs/ssr-dom-shim": "^1.4.0"
+      }
+    },
+    "node_modules/@mdx-js/mdx": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz";,
+      "integrity": 
"sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "@types/estree-jsx": "^1.0.0",
+        "@types/hast": "^3.0.0",
+        "@types/mdx": "^2.0.0",
+        "acorn": "^8.0.0",
+        "collapse-white-space": "^2.0.0",
+        "devlop": "^1.0.0",
+        "estree-util-is-identifier-name": "^3.0.0",
+        "estree-util-scope": "^1.0.0",
+        "estree-walker": "^3.0.0",
+        "hast-util-to-jsx-runtime": "^2.0.0",
+        "markdown-extensions": "^2.0.0",
+        "recma-build-jsx": "^1.0.0",
+        "recma-jsx": "^1.0.0",
+        "recma-stringify": "^1.0.0",
+        "rehype-recma": "^1.0.0",
+        "remark-mdx": "^3.0.0",
+        "remark-parse": "^11.0.0",
+        "remark-rehype": "^11.0.0",
+        "source-map": "^0.7.0",
+        "unified": "^11.0.0",
+        "unist-util-position-from-estree": "^2.0.0",
+        "unist-util-stringify-position": "^4.0.0",
+        "unist-util-visit": "^5.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      }
+    },
+    "node_modules/@mdx-js/react": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz";,
+      "integrity": 
"sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdx": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      },
+      "peerDependencies": {
+        "@types/react": ">=16",
+        "react": ">=16"
+      }
+    },
+    "node_modules/@napi-rs/wasm-runtime": {
+      "version": "0.2.12",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz";,
+      "integrity": 
"sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^1.4.3",
+        "@emnapi/runtime": "^1.4.3",
+        "@tybys/wasm-util": "^0.10.0"
+      }
+    },
+    "node_modules/@node-rs/jieba": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba/-/jieba-1.10.4.tgz";,
+      "integrity": 
"sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/Brooooooklyn";
+      },
+      "optionalDependencies": {
+        "@node-rs/jieba-android-arm-eabi": "1.10.4",
+        "@node-rs/jieba-android-arm64": "1.10.4",
+        "@node-rs/jieba-darwin-arm64": "1.10.4",
+        "@node-rs/jieba-darwin-x64": "1.10.4",
+        "@node-rs/jieba-freebsd-x64": "1.10.4",
+        "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4",
+        "@node-rs/jieba-linux-arm64-gnu": "1.10.4",
+        "@node-rs/jieba-linux-arm64-musl": "1.10.4",
+        "@node-rs/jieba-linux-x64-gnu": "1.10.4",
+        "@node-rs/jieba-linux-x64-musl": "1.10.4",
+        "@node-rs/jieba-wasm32-wasi": "1.10.4",
+        "@node-rs/jieba-win32-arm64-msvc": "1.10.4",
+        "@node-rs/jieba-win32-ia32-msvc": "1.10.4",
+        "@node-rs/jieba-win32-x64-msvc": "1.10.4"
+      }
+    },
+    "node_modules/@node-rs/jieba-android-arm-eabi": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz";,
+      "integrity": 
"sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-android-arm64": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz";,
+      "integrity": 
"sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-darwin-arm64": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz";,
+      "integrity": 
"sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-darwin-x64": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz";,
+      "integrity": 
"sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-freebsd-x64": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz";,
+      "integrity": 
"sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-arm-gnueabihf": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz";,
+      "integrity": 
"sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-arm64-gnu": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz";,
+      "integrity": 
"sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-arm64-musl": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz";,
+      "integrity": 
"sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-x64-gnu": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz";,
+      "integrity": 
"sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-linux-x64-musl": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz";,
+      "integrity": 
"sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-wasm32-wasi": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz";,
+      "integrity": 
"sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==",
+      "cpu": [
+        "wasm32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@napi-rs/wasm-runtime": "^0.2.3"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@node-rs/jieba-win32-arm64-msvc": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz";,
+      "integrity": 
"sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-win32-ia32-msvc": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz";,
+      "integrity": 
"sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@node-rs/jieba-win32-x64-msvc": {
+      "version": "1.10.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz";,
+      "integrity": 
"sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz";,
+      "integrity": 
"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz";,
+      "integrity": 
"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz";,
+      "integrity": 
"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@pnpm/config.env-replace": {
+      "version": "1.1.0",
+      "resolved": 
"https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz";,
+      "integrity": 
"sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.22.0"
+      }
+    },
+    "node_modules/@pnpm/network.ca-file": {
+      "version": "1.0.2",
+      "resolved": 
"https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz";,
+      "integrity": 
"sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "4.2.10"
+      },
+      "engines": {
+        "node": ">=12.22.0"
+      }
+    },
+    "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
+      "version": "4.2.10",
+      "resolved": 
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz";,
+      "integrity": 
"sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+      "license": "ISC"
+    },
+    "node_modules/@pnpm/npm-conf": {
+      "version": "2.3.1",
+      "resolved": 
"https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz";,
+      "integrity": 
"sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
+      "license": "MIT",
+      "dependencies": {
+        "@pnpm/config.env-replace": "^1.1.0",
+        "@pnpm/network.ca-file": "^1.0.1",
+        "config-chain": "^1.1.11"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@polka/url": {
+      "version": "1.0.0-next.29",
+      "resolved": 
"https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz";,
+      "integrity": 
"sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+      "license": "MIT"
+    },
+    "node_modules/@radix-ui/number": {
+      "version": "1.1.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/number/-/number-1.1.1.tgz";,
+      "integrity": 
"sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/@radix-ui/primitive": {
+      "version": "1.1.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/primitive/-/primitive-1.1.3.tgz";,
+      "integrity": 
"sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/@radix-ui/react-compose-refs": {
+      "version": "1.1.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz";,
+      "integrity": 
"sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-context": {
+      "version": "1.1.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-context/-/react-context-1.1.2.tgz";,
+      "integrity": 
"sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-dialog": {
+      "version": "1.1.15",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz";,
+      "integrity": 
"sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.3",
+        "@radix-ui/react-compose-refs": "1.1.2",
+        "@radix-ui/react-context": "1.1.2",
+        "@radix-ui/react-dismissable-layer": "1.1.11",
+        "@radix-ui/react-focus-guards": "1.1.3",
+        "@radix-ui/react-focus-scope": "1.1.7",
+        "@radix-ui/react-id": "1.1.1",
+        "@radix-ui/react-portal": "1.1.9",
+        "@radix-ui/react-presence": "1.1.5",
+        "@radix-ui/react-primitive": "2.1.3",
+        "@radix-ui/react-slot": "1.2.3",
+        "@radix-ui/react-use-controllable-state": "1.2.2",
+        "aria-hidden": "^1.2.4",
+        "react-remove-scroll": "^2.6.3"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
+      "version": "1.2.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-slot/-/react-slot-1.2.3.tgz";,
+      "integrity": 
"sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/react-compose-refs": "1.1.2"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-direction": {
+      "version": "1.1.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-direction/-/react-direction-1.1.1.tgz";,
+      "integrity": 
"sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-dismissable-layer": {
+      "version": "1.1.11",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz";,
+      "integrity": 
"sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/primitive": "1.1.3",
+        "@radix-ui/react-compose-refs": "1.1.2",
+        "@radix-ui/react-primitive": "2.1.3",
+        "@radix-ui/react-use-callback-ref": "1.1.1",
+        "@radix-ui/react-use-escape-keydown": "1.1.1"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-focus-guards": {
+      "version": "1.1.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz";,
+      "integrity": 
"sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-focus-scope": {
+      "version": "1.1.7",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz";,
+      "integrity": 
"sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/react-compose-refs": "1.1.2",
+        "@radix-ui/react-primitive": "2.1.3",
+        "@radix-ui/react-use-callback-ref": "1.1.1"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-id": {
+      "version": "1.1.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-id/-/react-id-1.1.1.tgz";,
+      "integrity": 
"sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/react-use-layout-effect": "1.1.1"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@radix-ui/react-portal": {
+      "version": "1.1.9",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-portal/-/react-portal-1.1.9.tgz";,
+      "integrity": 
"sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/react-primitive": "2.1.3",
+        "@radix-ui/react-use-layout-effect": "1.1.1"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@mdx-js/mdx": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz";,
-      "integrity": 
"sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+    "node_modules/@radix-ui/react-presence": {
+      "version": "1.1.5",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-presence/-/react-presence-1.1.5.tgz";,
+      "integrity": 
"sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
       "dependencies": {
-        "@types/estree": "^1.0.0",
-        "@types/estree-jsx": "^1.0.0",
-        "@types/hast": "^3.0.0",
-        "@types/mdx": "^2.0.0",
-        "acorn": "^8.0.0",
-        "collapse-white-space": "^2.0.0",
-        "devlop": "^1.0.0",
-        "estree-util-is-identifier-name": "^3.0.0",
-        "estree-util-scope": "^1.0.0",
-        "estree-walker": "^3.0.0",
-        "hast-util-to-jsx-runtime": "^2.0.0",
-        "markdown-extensions": "^2.0.0",
-        "recma-build-jsx": "^1.0.0",
-        "recma-jsx": "^1.0.0",
-        "recma-stringify": "^1.0.0",
-        "rehype-recma": "^1.0.0",
-        "remark-mdx": "^3.0.0",
-        "remark-parse": "^11.0.0",
-        "remark-rehype": "^11.0.0",
-        "source-map": "^0.7.0",
-        "unified": "^11.0.0",
-        "unist-util-position-from-estree": "^2.0.0",
-        "unist-util-stringify-position": "^4.0.0",
-        "unist-util-visit": "^5.0.0",
-        "vfile": "^6.0.0"
+        "@radix-ui/react-compose-refs": "1.1.2",
+        "@radix-ui/react-use-layout-effect": "1.1.1"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified";
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@mdx-js/react": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz";,
-      "integrity": 
"sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+    "node_modules/@radix-ui/react-primitive": {
+      "version": "2.1.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz";,
+      "integrity": 
"sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
       "dependencies": {
-        "@types/mdx": "^2.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/unified";
+        "@radix-ui/react-slot": "1.2.3"
       },
       "peerDependencies": {
-        "@types/react": ">=16",
-        "react": ">=16"
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz";,
-      "integrity": 
"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+    
"node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+      "version": "1.2.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-slot/-/react-slot-1.2.3.tgz";,
+      "integrity": 
"sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
       "dependencies": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
+        "@radix-ui/react-compose-refs": "1.1.2"
       },
-      "engines": {
-        "node": ">= 8"
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz";,
-      "integrity": 
"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+    "node_modules/@radix-ui/react-scroll-area": {
+      "version": "1.2.10",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz";,
+      "integrity": 
"sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
+      "dev": true,
       "license": "MIT",
-      "engines": {
-        "node": ">= 8"
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/number": "1.1.1",
+        "@radix-ui/primitive": "1.1.3",
+        "@radix-ui/react-compose-refs": "1.1.2",
+        "@radix-ui/react-context": "1.1.2",
+        "@radix-ui/react-direction": "1.1.1",
+        "@radix-ui/react-presence": "1.1.5",
+        "@radix-ui/react-primitive": "2.1.3",
+        "@radix-ui/react-use-callback-ref": "1.1.1",
+        "@radix-ui/react-use-layout-effect": "1.1.1"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-dom": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+        "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "@types/react-dom": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": 
"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz";,
-      "integrity": 
"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+    "node_modules/@radix-ui/react-slot": {
+      "version": "1.2.4",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-slot/-/react-slot-1.2.4.tgz";,
+      "integrity": 
"sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
       "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
+        "@radix-ui/react-compose-refs": "1.1.2"
       },
-      "engines": {
-        "node": ">= 8"
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@pnpm/config.env-replace": {
-      "version": "1.1.0",
-      "resolved": 
"https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz";,
-      "integrity": 
"sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+    "node_modules/@radix-ui/react-use-callback-ref": {
+      "version": "1.1.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz";,
+      "integrity": 
"sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+      "dev": true,
       "license": "MIT",
-      "engines": {
-        "node": ">=12.22.0"
+      "optional": true,
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@pnpm/network.ca-file": {
-      "version": "1.0.2",
-      "resolved": 
"https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz";,
-      "integrity": 
"sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+    "node_modules/@radix-ui/react-use-controllable-state": {
+      "version": "1.2.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz";,
+      "integrity": 
"sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
       "dependencies": {
-        "graceful-fs": "4.2.10"
+        "@radix-ui/react-use-effect-event": "0.0.2",
+        "@radix-ui/react-use-layout-effect": "1.1.1"
       },
-      "engines": {
-        "node": ">=12.22.0"
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
-      "version": "4.2.10",
-      "resolved": 
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz";,
-      "integrity": 
"sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-      "license": "ISC"
+    "node_modules/@radix-ui/react-use-effect-event": {
+      "version": "0.0.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz";,
+      "integrity": 
"sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/react-use-layout-effect": "1.1.1"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
     },
-    "node_modules/@pnpm/npm-conf": {
-      "version": "2.3.1",
-      "resolved": 
"https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz";,
-      "integrity": 
"sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
+    "node_modules/@radix-ui/react-use-escape-keydown": {
+      "version": "1.1.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz";,
+      "integrity": 
"sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+      "dev": true,
       "license": "MIT",
+      "optional": true,
       "dependencies": {
-        "@pnpm/config.env-replace": "^1.1.0",
-        "@pnpm/network.ca-file": "^1.0.1",
-        "config-chain": "^1.1.11"
+        "@radix-ui/react-use-callback-ref": "1.1.1"
       },
-      "engines": {
-        "node": ">=12"
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@polka/url": {
-      "version": "1.0.0-next.29",
-      "resolved": 
"https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz";,
-      "integrity": 
"sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
-      "license": "MIT"
+    "node_modules/@radix-ui/react-use-layout-effect": {
+      "version": "1.1.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz";,
+      "integrity": 
"sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
     },
     "node_modules/@sideway/address": {
       "version": "4.1.5",
@@ -4619,6 +5532,17 @@
         "node": ">=10.13.0"
       }
     },
+    "node_modules/@tybys/wasm-util": {
+      "version": "0.10.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@tybys/wasm-util/-/wasm-util-0.10.2.tgz";,
+      "integrity": 
"sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@types/body-parser": {
       "version": "1.19.6",
       "resolved": 
"https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz";,
@@ -5500,6 +6424,20 @@
       "integrity": 
"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
       "license": "Python-2.0"
     },
+    "node_modules/aria-hidden": {
+      "version": "1.2.6",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/aria-hidden/-/aria-hidden-1.2.6.tgz";,
+      "integrity": 
"sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/array-flatten": {
       "version": "1.1.1",
       "resolved": 
"https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz";,
@@ -6299,6 +7237,13 @@
         "node": ">=10"
       }
     },
+    "node_modules/comlink": {
+      "version": "4.4.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/comlink/-/comlink-4.4.2.tgz";,
+      "integrity": 
"sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
     "node_modules/comma-separated-tokens": {
       "version": "2.0.3",
       "resolved": 
"https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz";,
@@ -7302,6 +8247,14 @@
       "integrity": 
"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
       "license": "MIT"
     },
+    "node_modules/detect-node-es": {
+      "version": "1.1.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/detect-node-es/-/detect-node-es-1.1.0.tgz";,
+      "integrity": 
"sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true
+    },
     "node_modules/detect-port": {
       "version": "1.6.1",
       "resolved": 
"https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz";,
@@ -7529,7 +8482,34 @@
       "integrity": 
"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
       "license": "MIT",
       "engines": {
-        "node": ">= 0.8"
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/encoding-sniffer": {
+      "version": "0.2.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz";,
+      "integrity": 
"sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "whatwg-encoding": "^3.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/encoding-sniffer?sponsor=1";
+      }
+    },
+    "node_modules/encoding-sniffer/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz";,
+      "integrity": 
"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
     "node_modules/enhanced-resolve": {
@@ -8452,6 +9432,17 @@
         "url": "https://github.com/sponsors/ljharb";
       }
     },
+    "node_modules/get-nonce": {
+      "version": "1.0.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/get-nonce/-/get-nonce-1.0.1.tgz";,
+      "integrity": 
"sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/get-own-enumerable-property-symbols": {
       "version": "3.0.2",
       "resolved": 
"https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz";,
@@ -8762,6 +9753,21 @@
         "url": "https://opencollective.com/unified";
       }
     },
+    "node_modules/hast-util-is-element": {
+      "version": "3.0.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz";,
+      "integrity": 
"sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/hast": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      }
+    },
     "node_modules/hast-util-parse-selector": {
       "version": "4.0.0",
       "resolved": 
"https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz";,
@@ -8884,6 +9890,24 @@
         "url": "https://github.com/sponsors/wooorm";
       }
     },
+    "node_modules/hast-util-to-text": {
+      "version": "4.0.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz";,
+      "integrity": 
"sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@types/unist": "^3.0.0",
+        "hast-util-is-element": "^3.0.0",
+        "unist-util-find-after": "^5.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      }
+    },
     "node_modules/hast-util-whitespace": {
       "version": "3.0.0",
       "resolved": 
"https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz";,
@@ -8923,6 +9947,17 @@
         "he": "bin/he"
       }
     },
+    "node_modules/highlight.js": {
+      "version": "11.11.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/highlight.js/-/highlight.js-11.11.1.tgz";,
+      "integrity": 
"sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "optional": true,
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
     "node_modules/history": {
       "version": "4.10.1",
       "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz";,
@@ -9070,6 +10105,18 @@
         "url": "https://github.com/sponsors/sindresorhus";
       }
     },
+    "node_modules/html-url-attributes": {
+      "version": "3.0.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/html-url-attributes/-/html-url-attributes-3.0.1.tgz";,
+      "integrity": 
"sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      }
+    },
     "node_modules/html-void-elements": {
       "version": "3.0.0",
       "resolved": 
"https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz";,
@@ -9338,6 +10385,13 @@
         "node": ">=16.x"
       }
     },
+    "node_modules/immediate": {
+      "version": "3.3.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/immediate/-/immediate-3.3.0.tgz";,
+      "integrity": 
"sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/import-fresh": {
       "version": "3.3.1",
       "resolved": 
"https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz";,
@@ -9959,6 +11013,16 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/klaw-sync": {
+      "version": "6.0.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/klaw-sync/-/klaw-sync-6.0.0.tgz";,
+      "integrity": 
"sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.1.11"
+      }
+    },
     "node_modules/kleur": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz";,
@@ -10169,6 +11233,23 @@
         "url": "https://github.com/sponsors/sindresorhus";
       }
     },
+    "node_modules/lowlight": {
+      "version": "3.3.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lowlight/-/lowlight-3.3.0.tgz";,
+      "integrity": 
"sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "devlop": "^1.0.0",
+        "highlight.js": "~11.11.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm";
+      }
+    },
     "node_modules/lru-cache": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz";,
@@ -10178,6 +11259,38 @@
         "yallist": "^3.0.2"
       }
     },
+    "node_modules/lucide-react": {
+      "version": "0.563.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lucide-react/-/lucide-react-0.563.0.tgz";,
+      "integrity": 
"sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==",
+      "dev": true,
+      "license": "ISC",
+      "optional": true,
+      "peerDependencies": {
+        "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
+    "node_modules/lunr": {
+      "version": "2.3.9",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lunr/-/lunr-2.3.9.tgz";,
+      "integrity": 
"sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lunr-languages": {
+      "version": "1.20.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lunr-languages/-/lunr-languages-1.20.0.tgz";,
+      "integrity": 
"sha512-3LVgE7ekWXt04NBci/hjm+NXJxXZeRXuyClL0kA0HONyBOjxhP3ZQkuWIM4Ok3pbeptUW/rj3XcJcJuJVPwPYA==",
+      "dev": true,
+      "license": "MPL-1.1"
+    },
+    "node_modules/mark.js": {
+      "version": "8.11.1",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/mark.js/-/mark.js-8.11.1.tgz";,
+      "integrity": 
"sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/markdown-extensions": {
       "version": "2.0.0",
       "resolved": 
"https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz";,
@@ -12940,6 +14053,28 @@
         "url": "https://github.com/sponsors/sindresorhus";
       }
     },
+    "node_modules/open-ask-ai": {
+      "version": "0.7.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/open-ask-ai/-/open-ask-ai-0.7.3.tgz";,
+      "integrity": 
"sha512-UxV0HGds4TEUTKQ4B2Ip2uI0sE4UnKhE8Rj1rjfheOXKKWflpgAMsB+jBbiT648zzUfkuS6MHrMrrF5Ee8RiIA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@radix-ui/react-dialog": "^1.1.3",
+        "@radix-ui/react-scroll-area": "^1.2.2",
+        "@radix-ui/react-slot": "^1.1.1",
+        "lowlight": "^3.3.0",
+        "lucide-react": "^0.563.0",
+        "react-markdown": "^10.1.0",
+        "rehype-highlight": "^7.0.2",
+        "remark-gfm": "^4.0.1"
+      },
+      "peerDependencies": {
+        "react": "^18.0.0 || ^19.0.0",
+        "react-dom": "^18.0.0 || ^19.0.0"
+      }
+    },
     "node_modules/opener": {
       "version": "1.5.2",
       "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz";,
@@ -13167,6 +14302,19 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1";
       }
     },
+    "node_modules/parse5-parser-stream": {
+      "version": "7.1.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz";,
+      "integrity": 
"sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1";
+      }
+    },
     "node_modules/parse5/node_modules/entities": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz";,
@@ -15100,6 +16248,86 @@
         "webpack": ">=4.41.1 || 5.x"
       }
     },
+    "node_modules/react-markdown": {
+      "version": "10.1.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-markdown/-/react-markdown-10.1.0.tgz";,
+      "integrity": 
"sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "@types/mdast": "^4.0.0",
+        "devlop": "^1.0.0",
+        "hast-util-to-jsx-runtime": "^2.0.0",
+        "html-url-attributes": "^3.0.0",
+        "mdast-util-to-hast": "^13.0.0",
+        "remark-parse": "^11.0.0",
+        "remark-rehype": "^11.0.0",
+        "unified": "^11.0.0",
+        "unist-util-visit": "^5.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      },
+      "peerDependencies": {
+        "@types/react": ">=18",
+        "react": ">=18"
+      }
+    },
+    "node_modules/react-remove-scroll": {
+      "version": "2.7.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz";,
+      "integrity": 
"sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "react-remove-scroll-bar": "^2.3.7",
+        "react-style-singleton": "^2.2.3",
+        "tslib": "^2.1.0",
+        "use-callback-ref": "^1.3.3",
+        "use-sidecar": "^1.1.3"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-remove-scroll-bar": {
+      "version": "2.3.8",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz";,
+      "integrity": 
"sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "react-style-singleton": "^2.2.2",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/react-router": {
       "version": "5.3.4",
       "resolved": 
"https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz";,
@@ -15151,6 +16379,30 @@
         "react": ">=15"
       }
     },
+    "node_modules/react-style-singleton": {
+      "version": "2.2.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-style-singleton/-/react-style-singleton-2.2.3.tgz";,
+      "integrity": 
"sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "get-nonce": "^1.0.0",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/readable-stream": {
       "version": "3.6.2",
       "resolved": 
"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz";,
@@ -15324,6 +16576,25 @@
         "regjsparser": "bin/parser"
       }
     },
+    "node_modules/rehype-highlight": {
+      "version": "7.0.2",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/rehype-highlight/-/rehype-highlight-7.0.2.tgz";,
+      "integrity": 
"sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/hast": "^3.0.0",
+        "hast-util-to-text": "^4.0.0",
+        "lowlight": "^3.0.0",
+        "unist-util-visit": "^5.0.0",
+        "vfile": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      }
+    },
     "node_modules/rehype-raw": {
       "version": "7.0.0",
       "resolved": 
"https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz";,
@@ -16996,6 +18267,16 @@
       "integrity": 
"sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
       "license": "MIT"
     },
+    "node_modules/undici": {
+      "version": "7.26.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/undici/-/undici-7.26.0.tgz";,
+      "integrity": 
"sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.18.1"
+      }
+    },
     "node_modules/undici-types": {
       "version": "7.16.0",
       "resolved": 
"https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz";,
@@ -17085,6 +18366,22 @@
         "url": "https://github.com/sponsors/sindresorhus";
       }
     },
+    "node_modules/unist-util-find-after": {
+      "version": "5.0.0",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz";,
+      "integrity": 
"sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@types/unist": "^3.0.0",
+        "unist-util-is": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified";
+      }
+    },
     "node_modules/unist-util-is": {
       "version": "6.0.1",
       "resolved": 
"https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz";,
@@ -17394,6 +18691,53 @@
         "url": "https://opencollective.com/webpack";
       }
     },
+    "node_modules/use-callback-ref": {
+      "version": "1.3.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/use-callback-ref/-/use-callback-ref-1.3.3.tgz";,
+      "integrity": 
"sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-sidecar": {
+      "version": "1.1.3",
+      "resolved": 
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/use-sidecar/-/use-sidecar-1.1.3.tgz";,
+      "integrity": 
"sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "detect-node-es": "^1.1.0",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": 
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";,
diff --git a/package.json b/package.json
index d5672ee6af..91461fb960 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
     "@docusaurus/module-type-aliases": "3.8.1",
     "@docusaurus/tsconfig": "3.8.1",
     "@docusaurus/types": "3.8.1",
+    "@easyops-cn/docusaurus-search-local": "^0.54.1",
     "string-replace-loader": "^3.2.0",
     "typescript": "~5.6.2",
     "unist-util-visit": "^5.0.0"
diff --git a/pages/release-notes/9.5.0.md b/pages/release-notes/9.5.0.md
index 4be1010299..49bb196ae6 100644
--- a/pages/release-notes/9.5.0.md
+++ b/pages/release-notes/9.5.0.md
@@ -4137,3 +4137,11 @@ Added a paired terminal/chat workflow for triaging 
SonarCloud findings on a sour
 - **Legacy TSV-export workflow** under `scripts/README_SONARQUBE.md` is 
preserved for batch categorization but is no longer the primary path.
 
 See `.cursor/commands/sonarqube.md` and the `5.2. SonarQube Script` section in 
`AGENTS.md` for the full reference.
+
+#### Doc-site local build/publish flow + Docusaurus search swap (TODO-71)
+
+Two paired changes that retire the push-triggered GitHub Action for the docs 
site in favor of explicit local scripts, and replace the Algolia DocSearch 
integration with a self-contained client-side search index.
+
+- **Local build/publish flow.** Doc-site builds are now run locally via 
`juneau-docs/scripts/build-docs.py`; the push-triggered 
`juneau/.github/workflows/deploy-docs.yml.disabled` workflow has been removed. 
Publishing is split across `release-docs-stage.py` (build + push to the 
`asf-staging` branch, surfaced at `https://juneau.staged.apache.org`) and 
`release-docs.py` (promote `asf-staging` → `asf-site`, surfaced at 
`https://juneau.apache.org`). Both release scripts now refuse to run unl [...]
+
+- **Search swap — Algolia → `@easyops-cn/docusaurus-search-local`.** The 
previous Algolia DocSearch integration crawled the deployed site (and therefore 
lagged behind `master`); the replacement plugin builds the search index at 
site-build time so it is always in sync with what was just deployed. No 
external service dependency and no API-key management. Configuration lives in 
`juneau-docs/docusaurus.config.ts` as a top-level `themes: 
[['@easyops-cn/docusaurus-search-local', { hashed: true [...]
diff --git a/scripts/build-docs.py b/scripts/build-docs.py
index d934786c5b..ccfc5b2d6a 100755
--- a/scripts/build-docs.py
+++ b/scripts/build-docs.py
@@ -30,11 +30,15 @@ Steps performed:
 
 Usage:
     python3 scripts/build-docs.py [--skip-npm] [--skip-maven] [--skip-copy]
+                                  [--staging] [--dry-run] [--verbose]
     
 Options:
     --skip-npm      Skip npm install and Docusaurus build
     --skip-maven    Skip Maven compilation and site generation
     --skip-copy     Skip copying Maven site to static directory
+    --staging       Build for staging (sets SITE_URL to 
juneau.staged.apache.org)
+    --dry-run       Print the commands that would run; perform no work
+    --verbose       Print full per-stage banner output (default: one line per 
stage)
 """
 
 import argparse
@@ -47,28 +51,34 @@ from datetime import datetime
 from pathlib import Path
 
 
-def find_master_branch_sibling(script_dir):
+def find_master_branch_sibling(script_dir, allow_missing=False):
     """
     Find the master branch sibling folder.
-    
+
     The docs branch and master branch should be sibling folders:
     - /git/apache/juneau/docs/
     - /git/apache/juneau/master/
-    
+
     Args:
         script_dir: Path to the scripts directory (should be in docs/scripts)
-        
+        allow_missing: If True (e.g. during --dry-run), return the expected 
path
+            even when it doesn't exist instead of aborting.
+
     Returns:
         Path to the master branch folder
-        
+
     Raises:
-        SystemExit: If the master branch sibling folder doesn't exist
+        SystemExit: If the master branch sibling folder doesn't exist and
+            allow_missing is False.
     """
     # Get the parent of the docs folder (should be /git/apache/juneau/)
     docs_dir = script_dir.parent  # docs/
     parent_dir = docs_dir.parent  # /git/apache/juneau/
     master_dir = parent_dir / 'master'
-    
+
+    if allow_missing:
+        return master_dir
+
     if not master_dir.exists():
         print(f"ERROR: Master branch sibling folder not found at {master_dir}")
         print(f"Expected structure:")
@@ -83,9 +93,27 @@ def find_master_branch_sibling(script_dir):
     
     return master_dir
 
+# Module-level toggle flipped from main() so every run_command/stage_banner 
sees the choice.
+DRY_RUN = False
+VERBOSE = False
+
+
+def stage_banner(title):
+    """Emit a stage header. Verbose mode keeps the full banner; default mode 
prints one line."""
+    if VERBOSE:
+        print(f"\n=== {title} ===")
+    else:
+        print(f"-> {title}")
+
+
 def run_command(cmd, cwd=None, check=True, env=None):
-    """Run a shell command and return the result."""
-    print(f"Running: {' '.join(cmd)}")
+    """Run a shell command and return the result. Honors DRY_RUN."""
+    cmd_str = ' '.join(cmd)
+    if DRY_RUN:
+        loc = f" (in {cwd})" if cwd else ""
+        print(f"[dry-run] would run: {cmd_str}{loc}")
+        return None
+    print(f"Running: {cmd_str}")
     if cwd:
         print(f"  (in directory: {cwd})")
     result = subprocess.run(cmd, cwd=cwd, check=check, capture_output=False, 
env=env)
@@ -115,36 +143,41 @@ def check_prerequisites():
 
 def install_npm_dependencies(docs_dir):
     """Install npm dependencies for Docusaurus."""
-    print("\n=== Installing npm dependencies ===")
+    stage_banner("Installing npm dependencies")
     run_command(['npm', 'ci'], cwd=docs_dir)
 
 def build_docusaurus(docs_dir, staging=False):
     """Build Docusaurus documentation."""
-    print("\n=== Building Docusaurus ===")
+    stage_banner("Building Docusaurus")
     env = os.environ.copy()
     if staging:
         env['SITE_URL'] = 'https://juneau.staged.apache.org'
-        print("  Setting SITE_URL for staging build")
+        if VERBOSE:
+            print("  Setting SITE_URL for staging build")
     run_command(['npm', 'run', 'build'], cwd=docs_dir, env=env)
 
 def compile_java_modules(master_root):
     """Compile and install all Java modules to local repository."""
-    print("\n=== Compiling and installing Java modules ===")
+    stage_banner("Compiling and installing Java modules")
     run_command(['mvn', 'clean', 'install', '-DskipTests'], cwd=master_root)
 
 def generate_maven_site(master_root):
     """Generate Maven site."""
-    print("\n=== Generating Maven site ===")
+    stage_banner("Generating Maven site")
     run_command(['mvn', 'site', '-DskipTests'], cwd=master_root)
 
 def copy_maven_site(master_root, docs_dir):
     """Copy Maven site to static directory (Docusaurus will copy it to 
build)."""
-    print("\n=== Copying Maven site to static directory ===")
-    
+    stage_banner("Copying Maven site to static directory")
+
     source_site = Path(master_root) / 'target' / 'site'
     static_dir = Path(docs_dir) / 'static'
     static_site = static_dir / 'site'
-    
+
+    if DRY_RUN:
+        print(f"[dry-run] would copy {source_site} -> {static_site}")
+        return
+
     if not source_site.exists():
         print(f"ERROR: Maven site not found at {source_site}")
         sys.exit(1)
@@ -161,8 +194,11 @@ def copy_maven_site(master_root, docs_dir):
 
 def verify_apidocs(master_root):
     """Verify that apidocs were generated."""
-    print("\n=== Verifying apidocs generation ===")
-    
+    stage_banner("Verifying apidocs generation")
+    if DRY_RUN:
+        print("[dry-run] would verify apidocs at target/site/apidocs")
+        return
+
     apidocs_dir = Path(master_root) / 'target' / 'site' / 'apidocs'
     
     if not apidocs_dir.exists():
@@ -205,8 +241,11 @@ def get_current_release(master_root):
 
 def copy_current_javadocs(master_root, docs_dir):
     """Copy current javadocs to versioned folder and update JSON index."""
-    print("\n=== Copying current javadocs to versioned folder ===")
-    
+    stage_banner("Copying current javadocs to versioned folder")
+    if DRY_RUN:
+        print("[dry-run] would copy target/site/apidocs to 
static/javadocs/<version>")
+        return
+
     # Get current release version
     current_version = get_current_release(master_root)
     if not current_version:
@@ -236,7 +275,7 @@ def copy_current_javadocs(master_root, docs_dir):
 
 def update_javadocs_json(docs_dir, current_version):
     """Update or create JSON file with javadoc release information."""
-    print("\n=== Updating javadocs release index ===")
+    stage_banner("Updating javadocs release index")
     
     javadocs_dir = Path(docs_dir) / 'static' / 'javadocs'
     json_file = javadocs_dir / 'releases.json'
@@ -294,7 +333,7 @@ def update_javadocs_json(docs_dir, current_version):
 
 def check_topic_links(master_root, docs_dir):
     """Run the topic link checker to validate documentation links."""
-    print("\n=== Checking topic links ===")
+    stage_banner("Checking topic links")
     # Use the checker script from docs/scripts (it's already there)
     script_dir = Path(__file__).parent
     checker_script = script_dir / 'check-topic-links.py'
@@ -309,7 +348,7 @@ def check_topic_links(master_root, docs_dir):
 
 def check_ai_artifacts(docs_dir):
     """Run AI artifact drift checks."""
-    print("\n=== Checking AI artifacts ===")
+    stage_banner("Checking AI artifacts")
     script_dir = Path(__file__).parent
     checker_script = script_dir / 'check-ai-artifacts.py'
     if not checker_script.exists():
@@ -318,35 +357,49 @@ def check_ai_artifacts(docs_dir):
     run_command(['python3', str(checker_script)], cwd=docs_dir)
 
 def main():
+    global DRY_RUN, VERBOSE
+
     parser = argparse.ArgumentParser(description='Build Apache Juneau 
documentation')
     parser.add_argument('--skip-npm', action='store_true', help='Skip npm 
install and Docusaurus build')
     parser.add_argument('--skip-maven', action='store_true', help='Skip Maven 
compilation and site generation')
     parser.add_argument('--skip-copy', action='store_true', help='Skip copying 
Maven site to static directory')
     parser.add_argument('--staging', action='store_true', help='Build for 
staging (sets SITE_URL to juneau.staged.apache.org)')
-    
+    parser.add_argument('--dry-run', action='store_true', help='Print every 
command/copy that would run; perform no work')
+    parser.add_argument('--verbose', action='store_true', help='Print full 
per-stage banner output (default: one line per stage)')
+
     args = parser.parse_args()
-    
+    DRY_RUN = args.dry_run
+    VERBOSE = args.verbose
+
     # Determine script directory and find master branch sibling
     script_dir = Path(__file__).parent.absolute()
     docs_dir = script_dir.parent  # docs/
-    master_root = find_master_branch_sibling(script_dir)
+    master_root = find_master_branch_sibling(script_dir, allow_missing=DRY_RUN)
     
     print(f"Master branch root: {master_root}")
     print(f"Docs directory: {docs_dir}")
-    
+    if DRY_RUN:
+        print("DRY-RUN: no commands will be executed")
+
     # Check prerequisites
-    check_prerequisites()
-    
+    if DRY_RUN:
+        print("[dry-run] would check prerequisites (node, npm, mvn, java)")
+    else:
+        check_prerequisites()
+
     # Change to docs directory for npm operations
     os.chdir(docs_dir)
     
     # Delete build directory to ensure fresh build
     build_dir = Path(docs_dir) / 'build'
     if build_dir.exists():
-        print(f"\n=== Cleaning build directory ===")
-        print(f"Removing {build_dir}")
-        shutil.rmtree(build_dir)
-        print("✓ Build directory cleaned")
+        stage_banner("Cleaning build directory")
+        if DRY_RUN:
+            print(f"[dry-run] would remove {build_dir}")
+        else:
+            print(f"Removing {build_dir}")
+            shutil.rmtree(build_dir)
+            print("✓ Build directory cleaned")
     
     try:
         # Install npm dependencies (can be done early)
@@ -386,17 +439,32 @@ def main():
         if not args.skip_copy:
             build_dir = Path(docs_dir) / 'build'
             asf_yaml = Path(master_root) / '.asf.yaml'
-            if asf_yaml.exists() and build_dir.exists():
-                print(f"\n=== Copying .asf.yaml to build directory ===")
+            if DRY_RUN:
+                stage_banner("Copying .asf.yaml to build directory")
+                print(f"[dry-run] would copy {asf_yaml} -> 
{build_dir}/.asf.yaml")
+            elif asf_yaml.exists() and build_dir.exists():
+                stage_banner("Copying .asf.yaml to build directory")
                 shutil.copy2(asf_yaml, build_dir)
-        
+
         # Check topic links (runs once at the end)
         check_topic_links(master_root, docs_dir)
         check_ai_artifacts(docs_dir)
-        
+
         print("\n=== Documentation build complete ===")
         print(f"Documentation is available in: {docs_dir / 'build'}")
-        
+
+        # Publish reminder — only when this was a real, complete build
+        # (no skips, not a dry-run). Skipped runs are typically 
partial/iterative
+        # and the reminder would be misleading.
+        any_skip = args.skip_npm or args.skip_maven or args.skip_copy
+        if not DRY_RUN and not any_skip:
+            print()
+            print("Next step — publish:")
+            print("  python3 scripts/release-docs-stage.py             # 
deploy to asf-staging")
+            print("  python3 scripts/release-docs-stage.py --no-push   # 
rehearse without pushing")
+            print("Then, after eyeballing https://juneau.staged.apache.org:";)
+            print("  python3 scripts/release-docs.py                   # 
promote asf-staging -> asf-site (LIVE)")
+
     except subprocess.CalledProcessError as e:
         print(f"\nERROR: Command failed with exit code {e.returncode}")
         sys.exit(1)
diff --git a/scripts/release-docs-stage.py b/scripts/release-docs-stage.py
index 7006fa4669..d5439819c0 100755
--- a/scripts/release-docs-stage.py
+++ b/scripts/release-docs-stage.py
@@ -38,6 +38,36 @@ import sys
 import webbrowser
 from pathlib import Path
 
+# Identity guard — required for any push to ASF.
+REQUIRED_GIT_EMAIL = "[email protected]"
+
+
+def verify_apache_identity(repo_dir):
+    """Refuse to proceed unless git is configured with the ASF committer 
identity."""
+    try:
+        result = subprocess.run(
+            ["git", "config", "--get", "user.email"],
+            cwd=repo_dir,
+            capture_output=True,
+            text=True,
+            check=False,
+        )
+        email = result.stdout.strip()
+    except Exception as e:
+        print(f"❌ ERROR: Could not read git user.email: {e}")
+        return False
+
+    if email != REQUIRED_GIT_EMAIL:
+        print("❌ ERROR: Git identity is not the ASF committer identity.")
+        print(f"   Found:    user.email = '{email or '(unset)'}'")
+        print(f"   Required: user.email = '{REQUIRED_GIT_EMAIL}'")
+        print("")
+        print("   Fix (this script cannot mutate git config):")
+        print(f"     git config user.email {REQUIRED_GIT_EMAIL}")
+        print('     git config user.name "James Bognar"')
+        return False
+    return True
+
 
 def run_command(cmd, cwd=None, check=True, description=None):
     """Run a shell command and handle errors."""
@@ -180,9 +210,16 @@ def main():
     print("Release Documentation to Staging Branch")
     print("=" * 79)
     print()
-    
+
+    # Step 0: Identity guard — must hold before any work begins.
+    print("Step 0: Verifying git identity (apache.org email)...")
+    if not verify_apache_identity(docs_dir):
+        play_sound(success=False)
+        sys.exit(1)
+    print("✅ Git identity verified")
+
     # Step 1: Run build-docs.py with --staging flag
-    print("Step 1: Building documentation for staging...")
+    print("\nStep 1: Building documentation for staging...")
     build_script = script_dir / 'build-docs.py'
     if not build_script.exists():
         print(f"❌ ERROR: {build_script} not found")
diff --git a/scripts/release-docs.py b/scripts/release-docs.py
index 45e401e8ed..ea1dd6022d 100755
--- a/scripts/release-docs.py
+++ b/scripts/release-docs.py
@@ -37,6 +37,36 @@ import subprocess
 import sys
 from pathlib import Path
 
+# Identity guard — required for any push to ASF.
+REQUIRED_GIT_EMAIL = "[email protected]"
+
+
+def verify_apache_identity(repo_dir):
+    """Refuse to proceed unless git is configured with the ASF committer 
identity."""
+    try:
+        result = subprocess.run(
+            ["git", "config", "--get", "user.email"],
+            cwd=repo_dir,
+            capture_output=True,
+            text=True,
+            check=False,
+        )
+        email = result.stdout.strip()
+    except Exception as e:
+        print(f"❌ ERROR: Could not read git user.email: {e}")
+        return False
+
+    if email != REQUIRED_GIT_EMAIL:
+        print("❌ ERROR: Git identity is not the ASF committer identity.")
+        print(f"   Found:    user.email = '{email or '(unset)'}'")
+        print(f"   Required: user.email = '{REQUIRED_GIT_EMAIL}'")
+        print("")
+        print("   Fix (this script cannot mutate git config):")
+        print(f"     git config user.email {REQUIRED_GIT_EMAIL}")
+        print('     git config user.name "James Bognar"')
+        return False
+    return True
+
 
 def run_command(cmd, cwd=None, check=True, description=None):
     """Run a shell command and handle errors."""
@@ -175,7 +205,14 @@ def main():
     print("⚠️  WARNING: This will promote documentation from asf-staging to 
asf-site,")
     print("   making it live on the production website.")
     print()
-    
+
+    # Step 0: Identity guard — must hold before any work begins.
+    print("Step 0: Verifying git identity (apache.org email)...")
+    if not verify_apache_identity(docs_dir):
+        sys.exit(1)
+    print("✅ Git identity verified")
+    print()
+
     # Get git remote URL
     remote_url = get_git_remote_url()
     if not remote_url:


Reply via email to