diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 30300b52..5644c5a4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,20 +1,32 @@ -name: Docs +name: Docs checks on: push: branches: [main, master] + paths: + - 'docs/**' + - '.github/workflows/docs.yml' pull_request: branches: [main, master] + paths: + - 'docs/**' + - '.github/workflows/docs.yml' permissions: contents: read jobs: - i18n: - name: i18n coverage + build: + name: Docusaurus build runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - - name: Check documentation i18n coverage - run: python3 scripts/check-docs-i18n.py + - uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install website dependencies + working-directory: docs + run: npm ci + - name: Build documentation + working-directory: docs + run: npm run build diff --git a/.github/workflows/docusaurus.yml b/.github/workflows/docusaurus.yml new file mode 100644 index 00000000..c4530b6c --- /dev/null +++ b/.github/workflows/docusaurus.yml @@ -0,0 +1,43 @@ +name: Publish docs via Docusaurus + +on: + push: + branches: + - main + - master + paths: + - 'docs/**' + - '.github/workflows/docusaurus.yml' + workflow_dispatch: # Allow manual trigger + +permissions: + contents: write + +jobs: + build: + name: Deploy docs + runs-on: ubuntu-latest + steps: + - name: Checkout main + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install website dependencies + working-directory: docs + run: npm ci + + - name: Build website + working-directory: docs + run: npm run build + + - name: Deploy website + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs/build + publish_branch: gh-pages + force_orphan: false diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml deleted file mode 100644 index de0088d2..00000000 --- a/.github/workflows/mkdocs.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Publish docs via GitHub Pages - -on: - push: - branches: - - main - - master - paths: - - 'docs/**' - - '.github/workflows/mkdocs.yml' - workflow_dispatch: # Allow manual trigger - -permissions: - contents: write - -jobs: - build: - name: Deploy docs - runs-on: ubuntu-latest - steps: - - name: Checkout main - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Set up uv - uses: astral-sh/setup-uv@v6 - - - name: Sync locked dependencies - working-directory: docs - run: uv sync --frozen - - - name: Build and deploy docs - working-directory: docs - run: uv run mkdocs gh-deploy --force --config-file mkdocs.yml - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 616967db..dc9f4227 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ docs/site/ +docs/website/node_modules/ examples/**/.work/ target/ /store/ @@ -31,3 +32,13 @@ pchronicle-web/dist pchronicle-web/target/ crates/persisting-pchronicle-cli/web-assets/ .worktrees/ + +# Docusaurus generated metadata +docs/website/.docusaurus/ + +# Docusaurus docs generated from docs/src + +# Docusaurus local dependencies and generated output +docs/node_modules/ +docs/.docusaurus/ +docs/build/ diff --git a/README.md b/README.md index 36676c7e..bbaa6896 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ review/apply → configured capture → a queryable Dataset. ## Install ```bash -pip install persisting[lance] +pip install persisting pvisor --version pchronicle --version ``` diff --git a/benchmark/README.md b/benchmark/README.md index b340074e..80e2a56f 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -55,7 +55,7 @@ just benchmark-pvisor-compare \ ### 环境 ```bash -pip install persisting[lance] +pip install persisting ``` 从**仓库根目录**运行(以便正确解析 `persisting` 包): diff --git a/benchmark/throughput_stress.py b/benchmark/throughput_stress.py index 72c8c23e..85813c0f 100644 --- a/benchmark/throughput_stress.py +++ b/benchmark/throughput_stress.py @@ -6,7 +6,7 @@ python benchmark/throughput_stress.py --producers 2 --consumers 2 --duration 10 python benchmark/throughput_stress.py -p 4 -c 4 -d 30 --batch-size 50 --record-size 256 -依赖: pip install persisting[lance] +依赖: pip install persisting """ from __future__ import annotations diff --git a/crates/persisting-pchronicle-cli/src/server/catalog.rs b/crates/persisting-pchronicle-cli/src/server/catalog.rs index 39f5e334..44115d74 100644 --- a/crates/persisting-pchronicle-cli/src/server/catalog.rs +++ b/crates/persisting-pchronicle-cli/src/server/catalog.rs @@ -40,14 +40,39 @@ pub(crate) struct CatalogAcl { } #[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] struct CatalogFile { #[serde(default)] - libraries: BTreeMap, + meta: Option, #[serde(default)] users: BTreeMap, + #[serde(default)] + datasets: BTreeMap, + #[serde(default)] + grants: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +struct CatalogMeta { + version: u32, + #[serde(default)] + revision: u64, + #[serde(default)] + name: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +struct CatalogGrantFile { + user: String, + dataset: String, + #[serde(default)] + permissions: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] struct CatalogLibraryFile { uri: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -61,11 +86,10 @@ struct CatalogLibraryFile { } #[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] struct CatalogUserFile { access_key: String, secret_key: String, - #[serde(default)] - datasets: Vec, } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] @@ -140,7 +164,6 @@ pub(crate) fn issue_user(path: &Path, name: &str) -> Result { CatalogUserFile { access_key: access_key.clone(), secret_key: secret_key.clone(), - datasets: Vec::new(), }, ); write_catalog_file(path, &file)?; @@ -155,17 +178,27 @@ pub(crate) fn grant_datasets(path: &Path, name: &str, datasets: &[String]) -> Re let name = canonical_user_name(name)?; let mut file = load_editable_catalog(path)?; let library_names = canonical_library_names(&file)?; - let user = file - .users - .get_mut(&name) - .ok_or_else(|| anyhow!("unknown user '{name}'"))?; + anyhow::ensure!(file.users.contains_key(&name), "unknown user '{name}'"); for dataset in datasets { let dataset = granted_library_name(&library_names, dataset)?; - if !user.datasets.iter().any(|existing| existing == &dataset) { - user.datasets.push(dataset); + if !file + .grants + .iter() + .any(|grant| grant.user == name && grant.dataset == dataset) + { + file.grants.push(CatalogGrantFile { + user: name.clone(), + dataset, + permissions: vec!["read".into(), "query".into(), "analyze".into()], + }); } } - let granted = user.datasets.clone(); + let granted = file + .grants + .iter() + .filter(|grant| grant.user == name) + .map(|grant| grant.dataset.clone()) + .collect(); write_catalog_file(path, &file)?; Ok(granted) } @@ -173,29 +206,37 @@ pub(crate) fn grant_datasets(path: &Path, name: &str, datasets: &[String]) -> Re pub(crate) fn revoke_datasets(path: &Path, name: &str, datasets: &[String]) -> Result> { let name = canonical_user_name(name)?; let mut file = load_editable_catalog(path)?; - let user = file - .users - .get_mut(&name) - .ok_or_else(|| anyhow!("unknown user '{name}'"))?; + anyhow::ensure!(file.users.contains_key(&name), "unknown user '{name}'"); let mut to_remove = Vec::new(); for dataset in datasets { let dataset = DatasetMount::new(dataset, "validation") .with_context(|| format!("catalog library name '{dataset}'"))? .name; anyhow::ensure!( - user.datasets.iter().any(|existing| existing == &dataset), + file.grants + .iter() + .any(|grant| grant.user == name && grant.dataset == dataset), "catalog user '{name}' does not grant '{dataset}'" ); to_remove.push(dataset); } - user.datasets - .retain(|existing| !to_remove.iter().any(|dataset| dataset == existing)); - let remaining = user.datasets.clone(); + file.grants.retain(|grant| { + !(grant.user == name && to_remove.iter().any(|dataset| dataset == &grant.dataset)) + }); + let remaining = file + .grants + .iter() + .filter(|grant| grant.user == name) + .map(|grant| grant.dataset.clone()) + .collect(); write_catalog_file(path, &file)?; Ok(remaining) } fn read_catalog_config(path: &Path) -> Result { + if !path.exists() { + return Ok("[meta]\nversion = 1\nrevision = 0\n".to_owned()); + } let metadata = std::fs::metadata(path) .with_context(|| format!("read catalog config metadata {}", path.display()))?; anyhow::ensure!(metadata.is_file(), "catalog config must be a regular file"); @@ -212,6 +253,9 @@ fn parse_catalog_file(content: &str) -> Result { fn load_editable_catalog(path: &Path) -> Result { let file = parse_catalog_file(&read_catalog_config(path)?)?; + if file.datasets.is_empty() && file.users.is_empty() && file.grants.is_empty() { + return Ok(file); + } let libraries = build_libraries(&file)?; build_users(&file, &libraries)?; Ok(file) @@ -219,6 +263,10 @@ fn load_editable_catalog(path: &Path) -> Result { fn write_catalog_file(path: &Path, file: &CatalogFile) -> Result<()> { let serialized = toml::to_string_pretty(file).context("serialize catalog config")?; + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent) + .with_context(|| format!("create catalog config directory {}", parent.display()))?; + } let tmp_name = path .file_name() .and_then(|name| name.to_str()) @@ -233,12 +281,11 @@ fn write_catalog_file(path: &Path, file: &CatalogFile) -> Result<()> { fn build_libraries(file: &CatalogFile) -> Result> { anyhow::ensure!( - !file.libraries.is_empty(), - "catalog config needs at least one library" + !file.datasets.is_empty(), + "catalog config needs at least one dataset" ); let mut libraries = BTreeMap::new(); - let mut s3_credential: Option<(Option, Option, String, String)> = None; - for (name, library) in &file.libraries { + for (name, library) in &file.datasets { let mount = DatasetMount::new(name, "validation") .with_context(|| format!("catalog library name '{name}'"))?; let location = DatasetLocation::parse(&library.uri) @@ -265,19 +312,6 @@ fn build_libraries(file: &CatalogFile) -> Result s3_credential = Some(tuple), - Some(existing) => anyhow::ensure!( - existing == &tuple, - "all s3:// libraries must share the same endpoint, region, and backend keys" - ), - } } _ => anyhow::bail!("catalog library '{name}' must set both access_key and secret_key"), } @@ -307,6 +341,27 @@ fn build_users( libraries: &BTreeMap, ) -> Result> { let mut users_by_access_key = HashMap::new(); + let mut datasets_by_user: HashMap> = HashMap::new(); + for grant in &file.grants { + anyhow::ensure!( + file.users.contains_key(&grant.user), + "catalog grant references unknown user '{}'", + grant.user + ); + anyhow::ensure!( + libraries.contains_key(&grant.dataset), + "catalog grant references unknown dataset '{}'", + grant.dataset + ); + let entry = datasets_by_user.entry(grant.user.clone()).or_default(); + anyhow::ensure!( + !entry.contains(&grant.dataset), + "catalog grant for user '{}' and dataset '{}' is duplicated", + grant.user, + grant.dataset + ); + entry.push(grant.dataset.clone()); + } for (name, user) in &file.users { let access_key = user.access_key.trim().to_owned(); let secret_key = user.secret_key.trim().to_owned(); @@ -318,16 +373,10 @@ fn build_users( !secret_key.is_empty(), "catalog user '{name}' secret_key is empty" ); - for dataset in &user.datasets { - anyhow::ensure!( - libraries.contains_key(dataset), - "catalog user '{name}' grants unknown library '{dataset}'" - ); - } let catalog_user = CatalogUser { name: name.clone(), secret_key, - datasets: user.datasets.clone(), + datasets: datasets_by_user.remove(name).unwrap_or_default(), }; anyhow::ensure!( users_by_access_key @@ -350,22 +399,22 @@ fn canonical_user_name(name: &str) -> Result { } fn canonical_library_names(file: &CatalogFile) -> Result> { - file.libraries + file.datasets .keys() .map(|name| { DatasetMount::new(name, "validation") .map(|mount| mount.name) - .with_context(|| format!("catalog library name '{name}'")) + .with_context(|| format!("catalog dataset name '{name}'")) }) .collect() } fn granted_library_name(library_names: &BTreeSet, dataset: &str) -> Result { let mount = DatasetMount::new(dataset, "validation") - .with_context(|| format!("catalog library name '{dataset}'"))?; + .with_context(|| format!("catalog dataset name '{dataset}'"))?; anyhow::ensure!( library_names.contains(&mount.name), - "unknown library '{dataset}'" + "unknown dataset '{dataset}'" ); Ok(mount.name) } @@ -796,14 +845,14 @@ mod tests { use super::*; const SAMPLE: &str = r#" -[libraries.prod] +[datasets.prod] uri = "s3://bucket/prod" endpoint = "http://127.0.0.1:9000" region = "us-west-2" access_key = "BACKEND_AK" secret_key = "BACKEND_SK" -[libraries.evals] +[datasets.evals] uri = "s3://bucket/evals" endpoint = "http://127.0.0.1:9000" region = "us-west-2" @@ -813,49 +862,63 @@ secret_key = "BACKEND_SK" [users.alice] access_key = "USER_AK" secret_key = "USER_SK" -datasets = ["prod", "evals"] [users.bob] access_key = "BOB_AK" secret_key = "BOB_SK" -datasets = ["evals"] + +[[grants]] +user = "alice" +dataset = "prod" +permissions = ["read", "query", "analyze"] + +[[grants]] +user = "alice" +dataset = "evals" +permissions = ["read", "query", "analyze"] + +[[grants]] +user = "bob" +dataset = "evals" +permissions = ["read", "query"] "#; #[test] fn parse_rejects_unknown_grant() { let error = CatalogAcl::parse( r#" -[libraries.prod] +[datasets.prod] uri = "s3://bucket/prod" access_key = "a" secret_key = "b" [users.alice] access_key = "u" secret_key = "s" -datasets = ["missing"] + +[[grants]] +user = "alice" +dataset = "missing" "#, ) .unwrap_err() .to_string(); - assert!(error.contains("unknown library 'missing'"), "{error}"); + assert!(error.contains("unknown dataset 'missing'"), "{error}"); } #[test] fn parse_rejects_duplicate_user_keys() { let error = CatalogAcl::parse( r#" -[libraries.prod] +[datasets.prod] uri = "s3://bucket/prod" access_key = "a" secret_key = "b" [users.alice] access_key = "same" secret_key = "s1" -datasets = ["prod"] [users.bob] access_key = "same" secret_key = "s2" -datasets = ["prod"] "#, ) .unwrap_err() @@ -864,26 +927,53 @@ datasets = ["prod"] } #[test] - fn parse_rejects_mismatched_s3_backend_keys() { - let error = CatalogAcl::parse( + fn parse_accepts_independent_s3_backend_keys() { + let result = CatalogAcl::parse( r#" -[libraries.prod] +[datasets.prod] uri = "s3://bucket/prod" access_key = "a" secret_key = "b" -[libraries.evals] +[datasets.evals] uri = "s3://bucket/evals" access_key = "c" secret_key = "d" [users.alice] access_key = "u" secret_key = "s" -datasets = ["prod"] + +[users.bob] +access_key = "bob-ak" +secret_key = "bob-sk" + +[[grants]] +user = "alice" +dataset = "prod" +permissions = ["read", "query"] + +[[grants]] +user = "alice" +dataset = "evals" +permissions = ["read", "query"] "#, ) - .unwrap_err() - .to_string(); - assert!(error.contains("share the same"), "{error}"); + .unwrap(); + let alice = result.authenticate("u", "s").unwrap(); + for (name, uri, access_key, secret_key) in [ + ("prod", "s3://bucket/prod", "a", "b"), + ("evals", "s3://bucket/evals", "c", "d"), + ] { + let ticket = result.ticket_for(alice, name).unwrap(); + assert_eq!(ticket.name, name); + assert_eq!(ticket.uri, uri); + assert_eq!(ticket.access_key.as_deref(), Some(access_key)); + assert_eq!(ticket.secret_key.as_deref(), Some(secret_key)); + } + + let bob = result.authenticate("bob-ak", "bob-sk").unwrap(); + assert!(result.list_for(bob).is_empty()); + assert!(result.ticket_for(bob, "prod").is_none()); + assert!(result.ticket_for(bob, "evals").is_none()); } #[test] @@ -910,6 +1000,58 @@ datasets = ["prod"] ); } + #[test] + fn canonical_datasets_and_grants_format_is_accepted() { + let acl = CatalogAcl::parse( + r#" +[datasets.prod] +uri = "s3://bucket/prod" +access_key = "BACKEND_AK" +secret_key = "BACKEND_SK" + +[users.alice] +access_key = "USER_AK" +secret_key = "USER_SK" + +[[grants]] +user = "alice" +dataset = "prod" +permissions = ["read", "query"] +"#, + ) + .unwrap(); + let user = acl.authenticate("USER_AK", "USER_SK").unwrap(); + assert_eq!(acl.list_for(user)[0].name, "prod"); + assert_eq!( + acl.ticket_for(user, "prod").unwrap().secret_key.as_deref(), + Some("BACKEND_SK") + ); + } + + #[test] + fn duplicate_canonical_grants_are_rejected() { + let error = CatalogAcl::parse( + r#" +[datasets.prod] +uri = "./prod" + +[users.alice] +access_key = "USER_AK" +secret_key = "USER_SK" + +[[grants]] +user = "alice" +dataset = "prod" + +[[grants]] +user = "alice" +dataset = "prod" +"#, + ) + .unwrap_err(); + assert!(error.to_string().contains("duplicated")); + } + #[test] fn public_list_omits_backend_secrets() { let acl = CatalogAcl::parse(SAMPLE).unwrap(); @@ -1085,14 +1227,14 @@ datasets = ["prod"] } const LIBRARIES_ONLY: &str = r#" -[libraries.prod] +[datasets.prod] uri = "s3://bucket/prod" endpoint = "http://127.0.0.1:9000" region = "us-west-2" access_key = "BACKEND_AK" secret_key = "BACKEND_SK" -[libraries.evals] +[datasets.evals] uri = "s3://bucket/evals" endpoint = "http://127.0.0.1:9000" region = "us-west-2" @@ -1126,7 +1268,7 @@ secret_key = "BACKEND_SK" } #[test] - fn parse_rejects_libraries_only_catalog() { + fn parse_rejects_catalog_without_users() { let error = CatalogAcl::parse(LIBRARIES_ONLY).unwrap_err().to_string(); assert!(error.contains("at least one user"), "{error}"); } @@ -1148,7 +1290,7 @@ secret_key = "BACKEND_SK" assert_eq!(user.name, "alice"); assert!(acl.list_for(user).is_empty()); let stored = path_text(&path); - assert!(stored.contains("datasets = []"), "{stored}"); + assert!(!stored.contains("datasets = ["), "{stored}"); assert!(stored.contains(&issued.access_key), "{stored}"); assert!(stored.contains(&issued.secret_key), "{stored}"); } @@ -1182,7 +1324,7 @@ secret_key = "BACKEND_SK" .unwrap_err() .to_string(); assert!( - missing_library.contains("unknown library 'missing'"), + missing_library.contains("unknown dataset 'missing'"), "{missing_library}" ); diff --git a/crates/persisting-pchronicle-cli/src/tests.rs b/crates/persisting-pchronicle-cli/src/tests.rs index addec0d5..1b0a3e65 100644 --- a/crates/persisting-pchronicle-cli/src/tests.rs +++ b/crates/persisting-pchronicle-cli/src/tests.rs @@ -664,7 +664,7 @@ async fn serve_catalog_issue_grant_revoke_rewrites_config() -> Result<()> { fs::write( &catalog, r#" -[libraries.prod] +[datasets.prod] uri = "s3://bucket/prod" access_key = "BACKEND_AK" secret_key = "BACKEND_SK" diff --git a/docs/README.md b/docs/README.md index 0ee579ab..4640d845 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,116 +1,51 @@ # Persisting Documentation -This folder contains the documentation for Persisting. +The documentation site is built with [Docusaurus](https://docusaurus.io/). +English and Chinese are separate documentation instances so each language has +stable routes, sidebars, and searchable content. -## Prerequisites +## Quick start -- Python 3.10+ -- [uv](https://docs.astral.sh/uv/) package manager - -## Quick Start - -Run the documentation tasks from the repository root: +Run these commands from the repository root: ```bash -# Install the locked documentation environment -just docs-sync - -# Local preview (auto-reload on src/ changes) -just docs-serve - -# Force rebuild if auto-reload isn't working -just docs-serve-dirty - -# Build static site -just docs-build - -# Check dead links -just docs-links -``` - -## Structure - +just docs-sync # install website dependencies +just docs-serve # build and start a stable static preview +just docs-serve-dirty # start the hot-reload development server +just docs-build # build docs/build +just docs-links # build with broken-link checks enabled ``` -docs/ -├── mkdocs.yml # MkDocs configuration -├── pyproject.toml # Python dependencies -├── overrides/ # Theme customizations -│ └── home.html # Custom homepage template -└── src/ # Documentation source files - ├── index.md # Persisting homepage - ├── overview.md # Product overview - ├── installation.md # Shared installation - ├── pvisor/ # Overview, Get Started, Concepts, Guides, Design, Reference - ├── pchronicle/ # Overview, Get Started, Concepts, Guides, Design, Reference - ├── system-design/ # Cross-product architecture, navigated under Project - ├── project/ # Project overview, engineering, release, and examples - ├── rfcs/ # Accepted data and ownership decisions - ├── guide/ # Legacy redirects plus standalone Queue guides - ├── design/ # Legacy redirects, research, and standalone designs - └── api/ # Standalone Python API reference -``` - -The primary documentation hierarchy is product-oriented. Both pVisor and -pChronicle use the same internal sequence: **Overview → Get Started → Concepts -→ Guides → Design → Reference**. Files left at previous `/guide/...`, -`/design/...`, and `/quickstart/` locations are compatibility redirects and -must not receive new content. - -Each article type has one job: - -| Type | Answers | Links forward to | -| --- | --- | --- | -| Overview | What is the product, what does it own, and where do I start? | Get Started or the section index matching the reader's goal | -| Get Started | What is the shortest verified success loop? | task Guides and Concepts, not implementation internals | -| Concepts | What stable objects and distinctions form the mental model? | Guides for action and Design for mechanisms | -| Guides | How do I complete one user goal, including decisions and verification? | Reference for exact flags and Design only when internals matter | -| Design | How is one owned mechanism implemented, and what are its guarantees and gaps? | owning Concepts, Guides, related Design pages, and System Design contracts | -| Reference | What is the exact current syntax, schema, or format? | Guides for workflows and Design for rationale | -| System Design | Which product owns each cross-product object, transition, and failure? | product-specific pages; it must not duplicate their implementations | -| Project | How is the repository delivered, governed, researched, and reproduced? | product contracts when user-visible behavior is discussed | - -Every non-index article should link back to its owning concept or workflow and -forward to the next relevant layer. Cross-product links should cross only at a -real handoff: pVisor Run output to pChronicle history, or pPilot orchestration -to pVisor execution. - -`site/` is generated by MkDocs and is not a documentation source. Do not edit -or commit generated HTML. - -## Source of truth - -Use this order when documentation disagrees: - -1. executable `--help`, public types, and contract tests define current - behavior; -2. user guides and command references describe supported workflows; -3. architecture pages explain current internals and must label roadmap or - target sections explicitly; -4. RFCs preserve accepted decisions and history, but are not command - references; -5. research and engineering notes are non-normative. -The standalone component commands are the primary references: +The published site includes a local search index, so search works on the static +GitHub Pages deployment without a separate service. -- `pvisor` — one Run and reusable environments; -- `ppilot` — scalable Run orchestration and production; -- `pchronicle` — trajectory Dataset catalog, SQL, analysis, exchange, and - read-only serving; +The canonical Markdown sources are `docs/src/en/` and `docs/src/zh/`. Docusaurus +reads these two trees directly; internal pPilot, Queue, and API material lives +under `docs/src/internal/` and stays outside the public site. +The Docusaurus site is rooted at `docs/`. Its React homepage lives in +`docs/src/pages/index.js`, and shared visual tokens live in +`docs/src/css/custom.css`. -## Translation +Use `docs-serve` for a stable preview of the generated site. Use +`docs-serve-dirty` only while editing and needing hot reload; it runs the +Docusaurus watcher and uses substantially more memory for a large bilingual +site. The stable preview is available at +`http://localhost:3000/Persisting/`, matching the GitHub Pages base path. -Documentation supports English and Chinese. For each user-facing `.md` file -where a translation is maintained: +The public reading path is intentionally progressive: -- `file.md` — English version -- `file.zh.md` — Chinese version +1. **Start here** explains which product matches the reader's task. +2. **Get Started** completes one useful Run or Dataset workflow. +3. **Concepts** names the stable objects and guarantees. +4. **Guides** solve task-shaped problems with verification steps. +5. **Design and Reference** document implementation boundaries and exact syntax. -Not all files have both language versions. The i18n plugin falls back to English when a Chinese version is missing. +Internal orchestration material remains outside the public navigation. Queue, +search, and standalone capture documentation remain separate project areas and +are not part of the default product onboarding path. ## Contributing -1. Run `just docs-serve` for local preview -2. Edit files under `src/` — browser should auto-reload -3. Check command examples against the corresponding binary's `--help` -4. Run `just docs-links` (strict MkDocs build) -5. Submit a PR +Edit the Markdown under `docs/src/en/` or `docs/src/zh/`, and the React/CSS files under +`docs/src/pages/`, `docs/src/css/`, and `docs/src/theme/`. Check command examples against the corresponding binary's +`--help`, then run `just docs-build` and `just docs-links` before opening a PR. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 00000000..ba6c726d --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,72 @@ +const path = require('path'); + +const config = { + title: 'Persisting', + tagline: 'Persistent Infrastructure for the Agent Era', + favicon: 'img/logo-mark.svg', + url: 'https://deeplink-org.github.io', + baseUrl: '/Persisting/', + organizationName: 'DeepLink-org', + projectName: 'Persisting', + onBrokenLinks: 'throw', + markdown: { hooks: { onBrokenMarkdownLinks: 'throw' } }, + presets: [ + ['classic', { + docs: false, + blog: false, + theme: { customCss: require.resolve('./src/css/custom.css') }, + }], + ], + plugins: [ + [require.resolve('@docusaurus/plugin-content-docs'), { + path: path.resolve(__dirname, 'src/en'), routeBasePath: 'docs', sidebarPath: require.resolve('./sidebars.js'), editUrl: 'https://github.com/DeepLink-org/Persisting/edit/main/docs/' + }], + [require.resolve('@docusaurus/plugin-content-docs'), { + id: 'zh', path: path.resolve(__dirname, 'src/zh'), routeBasePath: 'zh/docs', sidebarPath: require.resolve('./sidebars.js'), editUrl: 'https://github.com/DeepLink-org/Persisting/edit/main/docs/' + }], + [require.resolve('@easyops-cn/docusaurus-search-local'), { + hashed: true, + docsDir: [path.resolve(__dirname, 'src/en'), path.resolve(__dirname, 'src/zh')], + language: ['en', 'zh'], + indexDocs: true, + indexBlog: false, + indexPages: true, + }], + ], + themeConfig: { + docs: { + sidebar: { + hideable: true, + autoCollapseCategories: true, + }, + }, + announcementBar: { + id: 'agent-era', + content: 'Persistent Infrastructure for the Agent Era · Start with a Run or a Dataset', + isCloseable: true, + }, + navbar: { + title: 'Persisting', + logo: { alt: 'Persisting', src: 'img/logo-mark.svg' }, + items: [ + { to: '/docs/', label: 'Start here', position: 'left' }, + { to: '/docs/pvisor/', label: 'pVisor', position: 'left' }, + { to: '/docs/pchronicle/', label: 'pChronicle', position: 'left' }, + { href: 'https://github.com/DeepLink-org/Persisting', label: 'GitHub', position: 'right' }, + { to: '/docs/', label: 'English', position: 'right' }, + { to: '/zh/', label: '中文', position: 'right' }, + ], + }, + footer: { + style: 'dark', + links: [ + { title: 'Start here', items: [{ label: 'Choose a workflow', to: '/docs/overview' }, { label: 'Installation', to: '/docs/installation' }] }, + { title: 'Products', items: [{ label: 'pVisor', to: '/docs/pvisor/' }, { label: 'pChronicle', to: '/docs/pchronicle/' }] }, + { title: 'Project', items: [{ label: 'System design', to: '/docs/system-design/' }, { label: 'GitHub', href: 'https://github.com/DeepLink-org/Persisting' }] }, + ], + copyright: `Copyright © ${new Date().getFullYear()} DeepLink-org`, + }, + prism: { theme: require('prism-react-renderer').themes.github, darkTheme: require('prism-react-renderer').themes.dracula }, + }, +}; +module.exports = config; diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml deleted file mode 100644 index 7fbd0131..00000000 --- a/docs/mkdocs.yml +++ /dev/null @@ -1,265 +0,0 @@ -site_name: Persisting -site_description: Persistent infrastructure for the Agent era—from model parameters and KV caches to Agent trajectories -site_url: https://deeplink-org.github.io/Persisting/ -docs_dir: src - -# pPilot pages stay built (cross-links from system-design/project/RFC pages) -# but are hidden from navigation while pPilot is not part of the launch story. -not_in_nav: | - /ppilot/** - -repo_name: DeepLink-org/Persisting -repo_url: https://github.com/DeepLink-org/Persisting - -theme: - name: material - custom_dir: overrides - palette: - - scheme: default - primary: custom - accent: custom - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - scheme: slate - primary: custom - accent: custom - toggle: - icon: material/brightness-4 - name: Switch to light mode - features: - - navigation.tabs - - navigation.sections - - navigation.indexes - - navigation.tracking - - navigation.top - - search.highlight - - search.share - - content.code.copy - - content.code.annotate - icon: - repo: fontawesome/brands/github - -markdown_extensions: - - admonition - - pymdownx.details - - pymdownx.superfences - - pymdownx.highlight: - anchor_linenums: true - line_spans: __span - pygments_lang_class: true - - pymdownx.inlinehilite - - pymdownx.snippets - - pymdownx.tabbed: - alternate_style: true - - pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg - - attr_list - - md_in_html - - def_list - - tables - - toc: - permalink: true - -plugins: - - search - - i18n: - docs_structure: suffix - fallback_to_default: true - reconfigure_material: true - reconfigure_search: true - languages: - - locale: en - default: true - name: English - build: true - site_name: "Persisting Documentation" - - locale: zh - name: 中文 - build: true - site_name: "Persisting 文档" - nav_translations: - Home: 首页 - pVisor: pVisor - pChronicle: pChronicle - Overview: 概览 - Concepts: 核心概念 - Start here: 从这里开始 - Choose a workflow: 选择工作流 - Get Started: 快速开始 - Guides: 指南 - Design: 设计 - Reference: 参考 - Project: 项目 - Architecture: 架构 - System overview: 系统概览 - AgentVisor category: AgentVisor 品类 - Run, Attempt, and Effect: Run、Attempt 与 Effect - Capabilities and evidence: Capability 与 Evidence - Guides overview: 指南概览 - Design overview: 设计概览 - Reference overview: 参考概览 - Execution environments: 执行环境 - Review and apply effects: 审查并应用 Effect - Network control: 网络控制 - Capture trajectories: 捕获轨迹 - Replay Agent trajectories: 回放 Agent 轨迹 - Isolation architecture: 隔离架构 - Gateway architecture: Gateway 架构 - OverlayNet architecture: OverlayNet 架构 - pVisor CLI: pVisor CLI - Dataset interface: Dataset 接口 - Dataset discovery and versioning: Dataset 发现与版本固定 - Recorded data, views, and versions: 记录数据、视图与版本 - Discover and query: 发现与查询 - Import and export: 导入与导出 - Local read-only Dataset server: 本地只读 Dataset 服务 - Local Dataset Web UI: 本地 Dataset Web UI - Gateway forwarding, rewriting, and capture: Gateway 转发、改写与捕获 - Product architecture: 产品架构 - Run storage: 运行存储 - Storyline Lance projection: Storyline Lance 投影 - pChronicle reference: pChronicle 参考 - Product terminology: 产品术语 - AgenticMD format: AgenticMD 格式 - Run data formats: 运行数据格式 - End-to-end architecture: 端到端架构 - Local to fleet: 从本地到集群 - Security and evidence: 安全与 Evidence - Engineering: 工程 - Engineering Notes: 工程说明 - Releasing persisting: 发布 Persisting - Reproducible examples: 可复现示例 - Decisions and RFCs: 决策与 RFC - Index: 索引 - 0001 Storyline format: 0001 Storyline 格式 - 0002 Events format: 0002 Events 格式 - 0003 pChronicle ownership: 0003 pChronicle 所有权 - 0004 ACTF format: 0004 ACTF 格式 - 0005 pChronicle revision lineage: 0005 pChronicle 修订谱系 - 0006 pChronicle Vortex backend: 0006 pChronicle Vortex 后端 - 0007 Events contract and pChronicle sidecar: 0007 事件契约与 pChronicle Sidecar - 0008 ATIF format: 0008 ATIF 格式 - 0009 OpenAI Messages format: 0009 OpenAI Messages 格式 - 0010 Agent corpus Lance layout: 0010 Agent 评测语料 Lance 布局 - 0012 pChronicle find query syntax: 0012 pChronicle find 查询语法 - 0013 pChronicle path Directory: 0013 pChronicle path Directory - 0014 Compact JSONL: 0014 Compact JSONL - Standalone systems: 独立系统 - Installation: 安装指南 - pChronicle CLI: pChronicle 命令参考 - Query model: Query Model - Snapshot: Snapshot - Queue guide: Queue 指南 - Python API overview: Python API 概览 - Queue API: Queue API - Custom queue backends: 自定义 Queue backend - Queue persistence: Queue 持久化 - - mkdocstrings: - handlers: - python: - options: - docstring_style: numpy - docstring_options: - ignore_init_summary: yes - merge_init_into_class: yes - show_submodules: no - -nav: - - Home: - - Start here: index.md - - Choose a workflow: overview.md - - Installation: installation.md - - pVisor: - - Overview: pvisor/index.md - - Get Started: pvisor/get-started.md - - Concepts: - - Overview: pvisor/concepts/index.md - - AgentVisor category: pvisor/concepts/agentvisor.md - - Run, Attempt, and Effect: pvisor/concepts/run-model.md - - Capabilities and evidence: pvisor/concepts/capabilities-and-evidence.md - - Guides: - - Guides overview: pvisor/guides/index.md - - Execution environments: pvisor/guides/execution.md - - Review and apply effects: pvisor/guides/review-apply.md - - Network control: pvisor/guides/network.md - - Capture trajectories: pvisor/guides/capture.md - - Replay Agent trajectories: pvisor/guides/sandbox-replay.md - - Design: - - Design overview: pvisor/design/index.md - - Isolation architecture: pvisor/design/isolation.md - - OverlayNet architecture: pvisor/design/overlaynet.md - - Gateway architecture: pvisor/design/gateway.md - - Reference: - - Reference overview: pvisor/reference/index.md - - pVisor CLI: pvisor/reference/cli.md - - pChronicle: - - Overview: pchronicle/index.md - - Get Started: pchronicle/get-started.md - - Concepts: - - Overview: pchronicle/concepts/index.md - - Dataset discovery and versioning: pchronicle/concepts/dataset-and-source.md - - Recorded data, views, and versions: pchronicle/concepts/facts-and-projections.md - - Guides: - - Guides overview: pchronicle/guides/index.md - - Discover and query: pchronicle/guides/discover-and-query.md - - Import and export: pchronicle/guides/exchange.md - - Local read-only Dataset server: pchronicle/guides/serve.md - - Local Dataset Web UI: pchronicle/guides/ui.md - - Gateway forwarding, rewriting, and capture: pchronicle/guides/serve-gateway.md - - Design: - - Design overview: pchronicle/design/index.md - - Product architecture: pchronicle/design/architecture.md - - Snapshot: pchronicle/design/catalog.md - - Run storage: pchronicle/design/trajectory-storage.md - - Storyline Lance projection: pchronicle/design/storyline-lance.md - - Reference: - - pChronicle reference: pchronicle/reference/index.md - - Product terminology: pchronicle/reference/terminology.md - - pChronicle CLI: pchronicle/reference/cli.md - - Query model: pchronicle/reference/query-model.md - - AgenticMD format: pchronicle/reference/agenticmd.md - - Run data formats: pchronicle/reference/formats/index.md - - Project: - - Overview: project/index.md - - Architecture: - - System overview: system-design/index.md - - End-to-end architecture: system-design/architecture.md - - Local to fleet: system-design/local-to-fleet.md - - Security and evidence: system-design/security-evidence.md - - Engineering: - - Engineering Notes: project/engineering.md - - Releasing persisting: project/releasing.md - - Reproducible examples: project/examples.md - - Decisions and RFCs: - - Index: rfcs/index.md - - 0001 Storyline format: rfcs/0001-storyline-format.md - - 0002 Events format: rfcs/0002-events-format.md - - 0003 pChronicle ownership: rfcs/0003-pchronicle-ownership.md - - 0004 ACTF format: rfcs/0004-actf-format.md - - 0005 pChronicle revision lineage: rfcs/0005-pchronicle-revision-lineage.md - - 0006 pChronicle Vortex backend: rfcs/0006-pchronicle-vortex-backend.md - - 0007 Events contract and pChronicle sidecar: rfcs/0007-events-contract-pchronicle-sidecar.md - - 0008 ATIF format: rfcs/0008-atif-format.md - - 0009 OpenAI Messages format: rfcs/0009-openai-messages-format.md - - 0010 Agent corpus Lance layout: rfcs/0010-agent-corpus-lance-layout.md - - 0012 pChronicle find query syntax: rfcs/0012-pchronicle-find-query-syntax.md - - 0013 pChronicle path Directory: rfcs/0013-pchronicle-warehouse-catalog.md - - 0014 Compact JSONL: rfcs/0014-compact-jsonl.md - - Standalone systems: - - Queue guide: guide/queue.md - - Python API overview: api/index.md - - Queue API: api/queue.md - - Custom queue backends: guide/custom-backends.md - -extra: - generator: false - social: - - icon: fontawesome/brands/github - link: https://github.com/DeepLink-org/Persisting - -extra_css: - - assets/stylesheets/home.css - -copyright: © 2025–2026 Persisting. All rights reserved. diff --git a/docs/overrides/home.html b/docs/overrides/home.html deleted file mode 100644 index 1b5df2f7..00000000 --- a/docs/overrides/home.html +++ /dev/null @@ -1,290 +0,0 @@ -{% extends "main.html" %} - -{% set copy = { - "en": { - "eyebrow": "MODEL STATE · AGENT HISTORY", - "positioning": "Persistent Infrastructure for the Agent Era", - "lede": "Run Agents under governance, then query what actually happened.", - "cta_primary": "Run your first Agent", - "cta_secondary": "Explore a trajectory Dataset", - "cta_tertiary": "Install", - "term_caption": "Execution", - "shot_caption": "Queryable history", - "shot_alt": "pChronicle Runs browser listing captured Agent sessions", - "stat_formats": "trajectory formats", - "stat_executors": "executors: host kernel, libkrun microVM", - "stat_import": "Import Codex and Claude Code sessions directly", - "stat_sql": "Query trajectory history with SQL", - "flow_kicker": "THE THROUGHLINE", - "flow_title": "From execution to queryable history", - "flow_lead": "One path, three steps. Each step is a real command.", - "flow_1_step": "Run", - "flow_1_title": "Execute under governance", - "flow_1_body": "The Agent works in a stage. Filesystem changes stay staged until you review them.", - "flow_2_step": "Capture", - "flow_2_title": "Facts become records", - "flow_2_body": "Configured capture publishes Gateway trajectory events and selected lifecycle records.", - "flow_3_step": "Query", - "flow_3_title": "History becomes queryable", - "flow_3_body": "Datasets answer SQL. External trajectories can enter without ever touching pVisor.", - "flow_note": "Each product also works on its own.", - "depth_kicker": "WHAT THAT MEANS", - "depth_title": "Governance and history, in detail", - "pvisor_body": "Every filesystem change an Agent makes lands in a stage, not your workspace. Review the full diff, then apply what you want and drop the rest.", - "pvisor_link": "Review and apply effects →", - "pchronicle_body": "Trajectories become Datasets you can query with SQL, browse in a local web UI, and exchange across eight formats.", - "pchronicle_link": "Discover and query →", - "pchronicle_shot_alt": "pChronicle analysis view running a SQL query over a trajectory Dataset", - "start_kicker": "FIRST FIVE MINUTES", - "start_title": "Install once, start anywhere", - "start_lead": "One wheel ships both commands. Pick the entry point that matches what you have.", - "start_install": "Install", - "start_exec": "Start with execution", - "start_data": "Start with data", - "start_data_note": "The built-in walkthrough uses temporary examples. It needs neither a pVisor Run nor a source checkout.", - "read_kicker": "KEEP READING", - "read_title": "Go deeper when you need to", - "read_1_t": "Choose a workflow", - "read_1_d": "Understand the two product entry points and the connected path", - "read_2_t": "Review Agent changes", - "read_2_d": "Understand staged Effects and selective apply", - "read_3_t": "Look up the pChronicle CLI", - "read_3_d": "Datasets, command prototypes, and common examples", - "read_4_t": "Inspect system boundaries", - "read_4_d": "Architecture, integration scope, and guarantee boundaries", - "close_title": "From model state to Agent history", - "close_body": "Persisting keeps reusable state durable and completed runs queryable. It records the data and execution mechanisms actually present without inventing controls or evidence absent from the original record." - }, - "zh": { - "eyebrow": "模型状态 · AGENT 历史", - "positioning": "Agent 时代的持久化基础设施", - "lede": "在受治理的环境中运行 Agent,然后查询真实发生过的一切。", - "cta_primary": "运行第一个 Agent", - "cta_secondary": "查看轨迹 Dataset", - "cta_tertiary": "安装", - "term_caption": "执行", - "shot_caption": "可查询的历史", - "shot_alt": "pChronicle Runs 浏览器,列出已捕获的 Agent 会话", - "stat_formats": "种轨迹格式", - "stat_executors": "种执行器:host 内核、libkrun microVM", - "stat_import": "直接导入 Codex 与 Claude Code 会话", - "stat_sql": "用 SQL 查询轨迹历史", - "flow_kicker": "贯通路径", - "flow_title": "从执行到可查询的历史", - "flow_lead": "一条路径,三个步骤。每一步都是真实命令。", - "flow_1_step": "Run", - "flow_1_title": "受治理地执行", - "flow_1_body": "Agent 在 stage 中工作。文件修改先留在 stage,等你审查后再决定去向。", - "flow_2_step": "Capture", - "flow_2_title": "事实成为记录", - "flow_2_body": "配置 capture 后,Gateway 轨迹事件与选定的生命周期记录会被发布出来。", - "flow_3_step": "Query", - "flow_3_title": "历史变得可查询", - "flow_3_body": "Dataset 可用 SQL 查询。外部轨迹无需经过 pVisor 也能直接进入。", - "flow_note": "两者仍可独立使用。", - "depth_kicker": "具体意味着什么", - "depth_title": "治理与历史的细节", - "pvisor_body": "Agent 的每一处文件修改都落在 stage 而非你的工作区。审查完整 diff,然后 apply 你想要的,drop 其余的。", - "pvisor_link": "审查与应用 Effect →", - "pchronicle_body": "轨迹成为可用 SQL 查询的 Dataset,可在本地 Web UI 中浏览,并能在八种格式之间交换。", - "pchronicle_link": "发现与查询 →", - "pchronicle_shot_alt": "pChronicle 分析视图,正在对轨迹 Dataset 执行 SQL 查询", - "start_kicker": "五分钟上手", - "start_title": "装一次,从任意一端开始", - "start_lead": "同一个 wheel 提供两个命令。按你手头已有的东西选择入口。", - "start_install": "安装", - "start_exec": "从执行开始", - "start_data": "从数据开始", - "start_data_note": "内建 walkthrough 使用临时示例,既不要求先运行 pVisor,也不要求源码 checkout。", - "read_kicker": "继续阅读", - "read_title": "需要时再进入细节", - "read_1_t": "选择工作流", - "read_1_d": "理解两个产品入口与贯通路径", - "read_2_t": "审查 Agent 修改", - "read_2_d": "理解 staged Effect 与选择性 apply", - "read_3_t": "查阅 pChronicle CLI", - "read_3_d": "Dataset、命令原型和常见例子", - "read_4_t": "检查系统边界", - "read_4_d": "架构、集成范围和保证边界", - "close_title": "从模型状态到 Agent 历史", - "close_body": "Persisting 让需要复用的状态保持持久,让已经发生的运行保持可查询;它记录实际存在的数据与执行机制,不补造原始记录中不存在的控制或证据。" - } -} %} -{% set t = copy["zh"] if config.theme.language == "zh" else copy["en"] %} - -{% block tabs %} - {{ super() }} - -
- -
-
-
-

{{ t.eyebrow }}

-

Persisting

-

{{ t.positioning }}

-

{{ t.lede }}

- -
- -
-
- -
{{ t.term_caption }}
-
- - - -
-
- - {{ t.shot_alt }} -
-
{{ t.shot_caption }}
-
-
-
-
- -
-
-
    -
  • 8{{ t.stat_formats }}
  • -
  • 2{{ t.stat_executors }}
  • -
  • {{ t.stat_import }}
  • -
  • {{ t.stat_sql }}
  • -
-
-
- -
-
-

{{ t.flow_kicker }}

-

{{ t.flow_title }}

-

{{ t.flow_lead }}

- -
    -
  1. - {{ t.flow_1_step }} -

    {{ t.flow_1_title }}

    -

    {{ t.flow_1_body }}

    - pvisor run --safe codex -
  2. -
  3. - {{ t.flow_2_step }} -

    {{ t.flow_2_title }}

    -

    {{ t.flow_2_body }}

    - pvisor run --gateway-mode capture -
  4. -
  5. - {{ t.flow_3_step }} -

    {{ t.flow_3_title }}

    -

    {{ t.flow_3_body }}

    - pchronicle query ./dataset --sql "DESCRIBE dataset.steps" -
  6. -
- -

{{ t.flow_note }}

-
-
- -
-
-

{{ t.depth_kicker }}

-

{{ t.depth_title }}

- -
-
- PVISOR -

{{ t.pvisor_body }}

-
-
$ pvisor review last
-$ pvisor apply last --path src
-$ pvisor apply last --include 'tests/**'
-$ pvisor drop last
-
- {{ t.pvisor_link }} -
- - -
-
-
- -
-
-

{{ t.start_kicker }}

-

{{ t.start_title }}

-

{{ t.start_lead }}

- -
-
-

{{ t.start_install }}

-
pip install persisting[lance]
-
-
-
-

{{ t.start_exec }}

-
pvisor run --safe codex
-pvisor review last
-pvisor apply last --all
-
-
-

{{ t.start_data }}

-
pchronicle onboard
-pchronicle onboard query
-

{{ t.start_data_note }}

-
-
-
-
-
- -
- -
- -
-
-

{{ t.close_title }}

-

{{ t.close_body }}

-
-
- -
-{% endblock %} - -{% block content %}{% endblock %} - -{% block footer %} - {{ super() }} -{% endblock %} diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 00000000..b766867e --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,18983 @@ +{ + "name": "persisting-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "persisting-docs", + "dependencies": { + "@docusaurus/core": "^3.8.1", + "@docusaurus/plugin-content-docs": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.55.3", + "@mdx-js/react": "^3.0.1", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/tsconfig": "^3.8.1", + "@docusaurus/types": "^3.8.1", + "typescript": "~5.6.2" + } + }, + "node_modules/@11ty/gray-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/gray-matter/-/gray-matter-1.0.0.tgz", + "integrity": "sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0", + "kind-of": "^6.0.3", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.23.0.tgz", + "integrity": "sha512-j45MBISstltys9QyQ4xf6quRiN1g7vMuwQL9VM4dx8YuRZvCQ173b9royZAx6iAbRX3IB1VnG1z//NuwyQ8jpQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.9.tgz", + "integrity": "sha512-4U2JKLMWlDu0CotYyUkWakDxr8AIav3QtIUXXRpfavYN29aVWfzlwJp9T0rPKEf/dO2QCPAUc0Kq1Tj1GJxo2A==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.9", + "@algolia/autocomplete-shared": "1.19.9" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.9.tgz", + "integrity": "sha512-6mExC6X7762s2SV3eJy3QOkB8bdMmnUhQ2agvGVDuzwoGyr3PquGSY/0vPQXCfiAiCaXUz1rXn+lwghgSi0l0w==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.9" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.9.tgz", + "integrity": "sha512-YosP9Uoek6y/Ur1r1qeogk4biMe/hzkyNcgMCciw0//3XpCM7VlYLSHnyt/vOnEOGhCCc0+3v+unEiH6zz+Z1A==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.57.0.tgz", + "integrity": "sha512-JVFFujiZUCguk5tz3LZr4fTQxqpIrj4/Jw3SI7kMljSqtfLxYn/s/TWH0J2s4iNfsDpxPhgFGMotCpmDI4kZ8w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.57.0.tgz", + "integrity": "sha512-6KqECK4ED3JJQEoDrQWnGPQzElA828xAD4qK5ceawNNyP/LcSvzAoLHjFkoTPksZ/kxj6VUtCRH+IHZesLltng==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.57.0.tgz", + "integrity": "sha512-uqpGF3oXYsoCbQq5d7BzNrNTfIfuvJyGP1CKvSW27T9boUg7KOwyxsAw1AX0a3jSW2HrYEJ/NN+Z4MiGivbpeQ==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.57.0.tgz", + "integrity": "sha512-u5NboJVJXDEFplvNnqqX4CxkXPYysjJRj47hOSh9329H8kG5gFLKJBIiS5utMQ+GZm8xQl3Te7NInDk6elEADQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.57.0.tgz", + "integrity": "sha512-uzc0b2LmHAK9/QID4xeo35OG84AkZl4YewkCqawqAOGLjT2eZpM/OZx45ESygMHG30Ws+ZTSdluPtMJcUnrbWQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.57.0.tgz", + "integrity": "sha512-dIAhnM6ue/ssa5PjgNfu4g8A4yTojl9ZOUzZU3wIaIKRerL2R/3Emuf9n/D6ICXXP167KC6XCeC7nliSw7cuSw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.57.0.tgz", + "integrity": "sha512-2TTPTTKSJmCptvhCm4Xf3bBYMqZni+Pgc2hVdqc4l9wsBpSJNVTVIKpnd10OubUgkGcmppVDj1XQqYaf6EnPSQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.57.0.tgz", + "integrity": "sha512-W4JseHKt+pzOxlFV+T3MWEG0h4Z2Se5zjoXUD0ewlw8aOWMG/yjRdopUdLQsXULepB/My2tDuZjkwk2sMfsUrQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.57.0.tgz", + "integrity": "sha512-BrxJVE0/eLinEPICCD7BKN/2xnt0nkjge70u8zzE2ISP3fuB3tjLgcwpanUycvlHBFLI4gK0l5ol54p6IYuR/Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.57.0.tgz", + "integrity": "sha512-Gc29jkeiLKlVfHvyrIgyUHHE+aYTdXEeLfK42rjr5/1TTVsYwUJz0XkvoIBIqfMjcDg6gXeHb1jTUZ0H+SYIlQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.57.0.tgz", + "integrity": "sha512-PIPnPN7MP3fp2VAi01BVXhCWmD366ZB2Hkq5TlYKtThd4KxUtMmaaNDpFgVCTXtSIqWVZLJntOHRvxg/sIPd8Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.57.0.tgz", + "integrity": "sha512-AX3RlOudXMdTwtwUqdAf5hAVLvXfOZZH1FZh6ALDdrhVLT0TtAIe48N6nYcWcTnwoTxK/wDIQqZ19IMjK8zJAA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.57.0.tgz", + "integrity": "sha512-cWZc1dKb7wy9/wPpwMtL1y89gK2G7y2A47Coa7zwf1ydtIeJm4+S+XxoQ2b/ZRiQnrC1YHavLjYUPDCdnT7Khg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", + "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz", + "integrity": "sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz", + "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", + "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", + "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", + "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz", + "integrity": "sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", + "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", + "integrity": "sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-transform-react-display-name": "^7.29.7", + "@babel/plugin-transform-react-jsx": "^7.29.7", + "@babel/plugin-transform-react-jsx-development": "^7.29.7", + "@babel/plugin-transform-react-pure-annotations": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.7.0.tgz", + "integrity": "sha512-p/9xVKmPDj3FPvMfPf5naVO3Ej8SCbcUugGvx1+8GgkuBNbqxqN2Irx3WLBv8VY0jH7XpRwKWdlmjXLZsmTLsg==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.7.0.tgz", + "integrity": "sha512-Sk5xkdRFeE7PeWjG9l4AfTwdvMfr9wHiwNNCpHXT4v4SNyNMKdHGvEILc31BgaVFGDDNbv5u/a73tofRiwbEZw==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.7.0.tgz", + "integrity": "sha512-x6oedjJ8O8/pIDBsMo5Orca3/6cQCz616/CwthVe68l43mqnj2lrJ9kFQITBqy8hMsS3nWeBWFoVO5dJ1DCFKA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.7.0", + "@docsearch/css": "4.7.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.2.tgz", + "integrity": "sha512-aJ1hpGyvfkte3dDAfNbWM4biW4yWZBVz7TIGLZP+v+tWOBgxX3e0N5ZIXHIvmfNNXTI77pcHUx3KmtOk05Ze3Q==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.2.tgz", + "integrity": "sha512-i0ZNcy0f0WhaOlYVgzLsWhIoEXO9kS3HRoKPtgE6vQtZUq7arKZaYdNBudr3mqCmd+TyOkwtwfHgs1ENj07r5g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.10.2", + "@docusaurus/cssnano-preset": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^7.0.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.2.tgz", + "integrity": "sha512-EYByj6nk+aD9KeVxV6Hmo2/nAAT79P21Y82ycTBOBtrmqilloIbIEhgL2/8Xpt2Jz/pgNqHAwyusOGwmbKeJmA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.2", + "@docusaurus/bundler": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^2.1.0", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.3", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.7", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*", + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.2.tgz", + "integrity": "sha512-4gCnHRbJLTloiwfvFAa92tgb2gI4KYhvjfQVYnEaiMO/EgvWfCo1LwytHXen+1oZAN0VAlS0JAPxp3MsvKDa3A==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.2.tgz", + "integrity": "sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.2.tgz", + "integrity": "sha512-9Fd4V/SFjfrVQ0JH5EN0+iPWyFunvTeQE3gfyFeetqPaXMP0OylIjOw16dCuXG4NZJrYdBqwzjh18/h3gRi47w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.2.tgz", + "integrity": "sha512-h/I5e4jaAhDHW4vaLENi1i2hnOEnXY1t9R+nnRTbgUl7ymVRzN/HF7dDfj8rKYGj8gfIge+Ef+iYRAMtbGvsrQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz", + "integrity": "sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "cheerio": "1.0.0-rc.12", + "combine-promises": "^1.1.0", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.2.tgz", + "integrity": "sha512-Sqwl4FPoZBDrlY8I2VU2H8O0M91CHp9T8ToMSkTZmjvHCif+1laqfXi6sTk8IfyVS/trN5yNjcWd1bFsGB6W5Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.2.tgz", + "integrity": "sha512-h5R12sZ/vV9EPiVjvIl9YFCOwkpwXes7dQMYt3EvP6Pphu4amHxxTqWxf08Fl5DR8h+oZMbWpFTNw5vKEYfvzQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.2.tgz", + "integrity": "sha512-UkdvQby5OQUKWrw3lLnSTJXQ6VETaUVTuPQX9AABtmFm5h+ifEBx1OQ+LN726Q4byuwBf2ElHkf4qU4hTxdvRg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.2.tgz", + "integrity": "sha512-8vbZNOSCpnsT57EY6CgN7sgRVmx3KTYwO8Uvo2pbxOyb8tbqAwtT9SslqaQ41HbA1v1hpn5RP7u5s2KvRwAFpQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.2.tgz", + "integrity": "sha512-kMHMBK9j4VAtgd5owwrRLRIi0EjkrpXlX7ePj1+y68XfVZV9I1T4S+koPDm+Hfw2TtnyHvh0uNrDvjz+DjQGVA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.2.tgz", + "integrity": "sha512-Vt90nNFhtAChRe9+it1hcHFgFvETdSnOkL5Bma+p6E/yU2tAYrvvyk+gv+LJGM2ZUkyKuKXLRsZ2Lb0bO7+Vog==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.2.tgz", + "integrity": "sha512-MLCffCldysi/R0nzJQP7ZWd0xAoGNnSTiVOo6TTR6mKVGFhE+/XArGe67ZcaZv1uytgQXoXs92VJrgVDrz80rQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.2.tgz", + "integrity": "sha512-PODkwg5XetLML3hU/3xpCKJUZ9cqExLaBnD/Fzzwj2VHogLeqnDisLIujae87zuze7T4mCm2A6KEqZkyiz07EQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.2.tgz", + "integrity": "sha512-JgfT3jWM0TJ8Uw0cEcqxHpybngQY1vlBYpuuNO+gEh5iPh5Ar+vxq/u9CFrYsWeXy48BN7Db76Pzp2edNXUQ8A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.2.tgz", + "integrity": "sha512-a4B3VczmDl99zK0EufDQYomdJ186WDingjmDXxhN2PNPS9Ty/Y2M5CLFX1KQMRKqRTLiRDKfutzG5IY1FC/ceg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/plugin-content-blog": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/plugin-content-pages": "3.10.2", + "@docusaurus/plugin-css-cascade-layers": "3.10.2", + "@docusaurus/plugin-debug": "3.10.2", + "@docusaurus/plugin-google-analytics": "3.10.2", + "@docusaurus/plugin-google-gtag": "3.10.2", + "@docusaurus/plugin-google-tag-manager": "3.10.2", + "@docusaurus/plugin-sitemap": "3.10.2", + "@docusaurus/plugin-svgr": "3.10.2", + "@docusaurus/theme-classic": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-search-algolia": "3.10.2", + "@docusaurus/types": "3.10.2" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.2.tgz", + "integrity": "sha512-JqTSLQmqmA9uKWZsD5iwBGJ4JyKB4/yTw6PsSXVPRJG/6GAm/u+add9Iip+hvwP12/AnPNztrdxsI14NJW4KeA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/plugin-content-blog": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/plugin-content-pages": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-translations": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.2.tgz", + "integrity": "sha512-R9b/vMpK1yye6hNZTA6x/ivRv+at6GhxnXcxkpzCGzO1R1RwiquqiFg2wMFh6aqlJTpWRFKpFD2TzCDQcyOU0A==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.10.2", + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz", + "integrity": "sha512-1msxllyhi/5m77JukXtp5UFnUAriwZIC1oJ7MTnpQpCwLTbclJi5BK5n28CTZuSXpQN2ewbbnqRgAhMM6c6ihg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "^1.19.2", + "@docsearch/react": "^3.9.0 || ^4.3.2", + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/plugin-content-docs": "3.10.2", + "@docusaurus/theme-common": "3.10.2", + "@docusaurus/theme-translations": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz", + "integrity": "sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.10.2.tgz", + "integrity": "sha512-5GiB7h/nFsMFPO9mCqcRNE1yA5TSXXNCshNIgHPL6fCPOjcTDixs6qjQBu8ddkgPcicwCvOA7n3jeK2rGdJk6g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.2.tgz", + "integrity": "sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==", + "license": "MIT", + "dependencies": { + "@11ty/gray-matter": "^1.0.0", + "@docusaurus/logger": "3.10.2", + "@docusaurus/types": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "escape-string-regexp": "^4.0.0", + "execa": "^5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.2.tgz", + "integrity": "sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz", + "integrity": "sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.55.3", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.3.tgz", + "integrity": "sha512-PlMKmxuonvZ1C+/zJS1hJaF1xaxD1TsUvOMzpP6DdQMtZqmTaYjcLGM12ePzl0m1rp3AgfTBeDbFNHQhwnH/dA==", + "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" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "open-ask-ai": "^0.7.3", + "react": "^16.14.0 || ^17 || ^18 || ^19", + "react-dom": "^16.14.0 || 17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "open-ask-ai": { + "optional": true + } + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "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://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "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://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "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://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "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.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.71.0.tgz", + "integrity": "sha512-9DFR/j+bm+tig1abs1CWS1/r0IVjNUdTp/+q6R/PXayXpO1rgbUh7tkanGYP40I0zdxbOreN3tmzBpVHgfMKzg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.71.0", + "@jsonjoy.com/fs-node-utils": "4.71.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.71.0.tgz", + "integrity": "sha512-dRw5ojxzep3lntVGVBLzQUMYj1hXLH+DAz9sK0vKU+594x/zA2nYPOiitlyhYtOJ2nv1FXNq7c55rgwANknIWw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.71.0", + "@jsonjoy.com/fs-node-builtins": "4.71.0", + "@jsonjoy.com/fs-node-utils": "4.71.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.71.0.tgz", + "integrity": "sha512-yt5Ak0otPdHPIlmMvF16aLG2qSZL52EYJ7HOkYpBcIPWw+kmT1FtTSj4oiV2OUkJbG8pLzA+RhMgrlRl85QuBw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.71.0", + "@jsonjoy.com/fs-node-builtins": "4.71.0", + "@jsonjoy.com/fs-node-utils": "4.71.0", + "@jsonjoy.com/fs-print": "4.71.0", + "@jsonjoy.com/fs-snapshot": "4.71.0", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.71.0.tgz", + "integrity": "sha512-BSzl+QFSxZF58BxGjV1wqCJ+qSn3b2IZnb+z3hDQq6goqOO5RuxF8gRihjsFx17AfpEpa7XjYcP8XpQtDU8RrQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.71.0.tgz", + "integrity": "sha512-OlXBZKIeDx5bIGcQmn0w+nVkLheCiuQSepKiBAiWSWimSdn8Q6Yc9ih2y8zStcJk31fieqnov9V+o8XTWn/5Rw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.71.0", + "@jsonjoy.com/fs-node-builtins": "4.71.0", + "@jsonjoy.com/fs-node-utils": "4.71.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.71.0.tgz", + "integrity": "sha512-YtzCL3jbKYx6LHxqS9ymJ9Ob7SO9cucI+kpNO3LijGNFEjFbvNsTlHkvFgocAMAjUk96TpQTCsYkzFQi1CdlAA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.71.0", + "glob-to-regex.js": "^1.0.1" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.71.0.tgz", + "integrity": "sha512-OhfDSdvyO8uGV0U11OP+mOeVCPgjuP1HqCGR/TdBQLxHoDEWJAK3KOP5fPXo57H7i3G0x0Vmv8xPRHDle4XGzA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.71.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.71.0.tgz", + "integrity": "sha512-md+Wov365xa9A3nfW9YQTHLcweHHAee/e/0UoVRbldEHxboPJknuO3sEkNVVECO0dTqKra/ERaQylAMRrGWd0Q==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.71.0", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "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://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", + "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", + "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://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz", + "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz", + "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", + "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz", + "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz", + "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz", + "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz", + "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==", + "cpu": [ + "arm64" + ], + "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://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz", + "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==", + "cpu": [ + "arm64" + ], + "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://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz", + "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==", + "cpu": [ + "x64" + ], + "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://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz", + "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-wasm32-wasi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz", + "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==", + "cpu": [ + "wasm32" + ], + "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://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz", + "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz", + "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz", + "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==", + "cpu": [ + "x64" + ], + "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/@peculiar/asn1-cms": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.9.4.tgz", + "integrity": "sha512-cben7oxmQsUGZqotus7yt0srYdncOT6RNWcTQ77T2RFOXejYVYkXadrfePdRcrVpO9K95IRLKKglG2k38jKXuw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-x509-attr": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.9.4.tgz", + "integrity": "sha512-xd4YN4vpRjkDAQWVfZZkeu12IEND7DOpkqaHSIHxZl1uggUNa9Ju0QxY2jHvDAS9pP0zhRBytg8ifsnGo3V0jw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.9.4.tgz", + "integrity": "sha512-JJXefFshRAuVAjWQo/39bkg1ywc1VaiO44S8RRC+Ykvf/u2KDmYffoDb0ZBPCR5uJy4AGKQhl8mX+Q8ShcWaXQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.9.4.tgz", + "integrity": "sha512-khuGzHTzNzk4GDlIBEILyIs6Lce0yn0ZBdoI9v93kmNncfZRhD+AQ5ODFqdhvoE8cMJF/JMTQ8yA+t1D14kqCw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-rsa": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.9.4.tgz", + "integrity": "sha512-duRdotlUx9eDZe6QrQpQKl61RbWykCHBCkKayP8V8XdEFwlKHZ8qGGDMyS6Pye7OX7nLFttTTpRkJeet78ckwQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.9.4.tgz", + "integrity": "sha512-kaL4cNxBpdQE2dKlyZBqz4ygCrwffO+8wfoxTEqM1Z8RadvCeELBRzcv0dzM8aY9azHMwODO5nxU65zXmhToOQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.9.4", + "@peculiar/asn1-pfx": "^2.9.4", + "@peculiar/asn1-pkcs8": "^2.9.4", + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-x509-attr": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.9.4.tgz", + "integrity": "sha512-pZ96eD1PptovcWQ/GSmuNFXd/7EQJNlKfDaNCyE2rx3W0v6QFelkzquVqRSRyyDXXCYD69ZXJDzZ8GhIiQzKoA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz", + "integrity": "sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==", + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.9.4.tgz", + "integrity": "sha512-CxhBo/RdEbMMob7T31ZdQjGuoyRFLVwrDzTn25bihzBasRg9kRm/0IxIPvhgQtcK/9dNcO1XQL2fuPugwELL0Q==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.9.4.tgz", + "integrity": "sha512-ehQXbpQaQYycgu8OrvigwSPTFfVRcu0ECNYCWw+yzBp02Lw5paRqzzhUpfOgO2K38+WfFZuEz/0RPtam5g0OMg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-x509": "^2.9.4", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "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": "3.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", + "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", + "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/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "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", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.9", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz", + "integrity": "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", + "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.1.tgz", + "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==", + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", + "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.57.0.tgz", + "integrity": "sha512-HpND7MBGctOAkd1GoQoDZCGoCpqNTS5NG1LuhElFet3RdLJkwnyTYZXZhXwtpAQPrI36fqQ3eT6KQrdKDTKu3A==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.23.0", + "@algolia/client-abtesting": "5.57.0", + "@algolia/client-analytics": "5.57.0", + "@algolia/client-common": "5.57.0", + "@algolia/client-insights": "5.57.0", + "@algolia/client-personalization": "5.57.0", + "@algolia/client-query-suggestions": "5.57.0", + "@algolia/client-search": "5.57.0", + "@algolia/ingestion": "1.57.0", + "@algolia/monitoring": "1.57.0", + "@algolia/recommend": "5.57.0", + "@algolia/requester-browser-xhr": "5.57.0", + "@algolia/requester-fetch": "5.57.0", + "@algolia/requester-node-http": "5.57.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.3.tgz", + "integrity": "sha512-gVOMbbPVrCO3Xs+B+BLAIGFqIQow6qHMTYCEeBqLQB9m4ZmKUqMwkEumlal2iyyezHEd4Y0FvFTLbCRutCutIQ==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.5.tgz", + "integrity": "sha512-uiRYvQYe/nNSzBJ7OUnd2/TZVsAdob3blml44teEpee9Cc1f4rGZFewO+JT3Wo8mgFOSzNqes4FHZn/Qz8WOuw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.9", + "caniuse-lite": "^1.0.30001810", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz", + "integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.4.tgz", + "integrity": "sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.10.0.tgz", + "integrity": "sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "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", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", + "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz", + "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.7" + }, + "engines": { + "node": ">=6.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.11.0.tgz", + "integrity": "sha512-VzY/8kcK5M8oCVr/cwh24J8XVlCOITpmzCizKBC28o7Z1s23MMojXoJ3q7a+TQQoMKvxC3YlG0Z9yU10kJF1uQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-2.1.0.tgz", + "integrity": "sha512-epZuWb/6Q62L+nDHJc/hQAqf8pylsqgk3BpZXVBx1CDnr3nkrVNn73Uu1rXcFzkNcc+hkP3whuOg7JZYaQB65Q==", + "license": "MIT", + "dependencies": { + "address": "^2.0.1" + }, + "bin": { + "detect": "dist/commonjs/bin/detect-port.js", + "detect-port": "dist/commonjs/bin/detect-port.js" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.422", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz", + "integrity": "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "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://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz", + "integrity": "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.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", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.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", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.8", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz", + "integrity": "sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x || 2.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "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.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz", + "integrity": "sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.5.0.tgz", + "integrity": "sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.7", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.7.tgz", + "integrity": "sha512-MF80Dm5Y2veNy8QWVx9Bj3ui4mo7+VPSPsR1M+oaHXV0Gx6zGX9a2F+OZG3Blby9tOlzU9Rs5FUimlEhbKtfnQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "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", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lunr-languages": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.21.0.tgz", + "integrity": "sha512-Hj0VwJP1FGwZzVMMZdDtWY2GB2VVKtvVElYtVajzCZCDr2RTucyLpPibrOPGgTlcq2ENQy2gYLtPnzyFu9jZCg==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.71.0.tgz", + "integrity": "sha512-Zwrk7TpTXBkic7taZL+2QeppbauG0QOufRsT1zuXDYLW8jCajH0W1VSZ17+I7ODqiNbH9J1Vf1QJCqFlCfurDg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.71.0", + "@jsonjoy.com/fs-fsa": "4.71.0", + "@jsonjoy.com/fs-node": "4.71.0", + "@jsonjoy.com/fs-node-builtins": "4.71.0", + "@jsonjoy.com/fs-node-to-fsa": "4.71.0", + "@jsonjoy.com/fs-node-utils": "4.71.0", + "@jsonjoy.com/fs-print": "4.71.0", + "@jsonjoy.com/fs-snapshot": "4.71.0", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.9.0.tgz", + "integrity": "sha512-OASqv+dewv8vjkOBjqMOHvxUaXhtGBLZAXq7JbmYE8TSzBvOswiGq5JcBdc8ypuLL/8YUT1OEyupga6/iqdyTA==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.3", + "terser": "^5.51.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@napi-rs/image": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "imagemin": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "sharp": { + "optional": true + }, + "svgo": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/minimizer-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "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", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", + "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.1.0.tgz", + "integrity": "sha512-bwLf38YmY+TDYHJw1Ex0Co8c4yeXuJAo8YnXGZrscxrvYoVVIvLeniEkV1Ks/54VteMnL4FtyN1+P+TZJdUPmQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.5.tgz", + "integrity": "sha512-8SQMzdrvWaD8deUmrnYB+ASyxBVgWUOilg+A75nE/76WdLpj6LopCwiAVvkzkcqy/9b7t2Mg7faFLjg0ZRcZ3w==", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.1.tgz", + "integrity": "sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz", + "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.110.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.110.3.tgz", + "integrity": "sha512-GuizBzRvo9YPpyoNMf3ag7AzxbaW85qrRSqTha345KyJbAFPt3/cMzBM0h+RWg7SK/7DdzRLINP3LvQ0hvr4hg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.24.4", + "es-module-lexer": "^2.1.0", + "events": "^3.2.0", + "graceful-fs": "^4.2.11", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.7.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.6.tgz", + "integrity": "sha512-yBWCMvIfUmuhAE8vdqUKzH0vg9kuWN0KeG4vBnqRplUFHRU7lMQjkiJWxVQzvo2BTewqhPhDlMB41rAt2jVA9A==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz", + "integrity": "sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.14.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "license": "MIT", + "dependencies": { + "ansis": "^3.2.0", + "consola": "^3.2.3", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/websocket-driver": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", + "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", + "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..d5beab68 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,28 @@ +{ + "name": "persisting-docs", + "private": true, + "scripts": { + "start": "docusaurus start", + "build": "docusaurus build", + "serve": "docusaurus serve", + "clear": "docusaurus clear", + "typecheck": "tsc" + }, + "dependencies": { + "@docusaurus/core": "^3.8.1", + "@docusaurus/plugin-content-docs": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.55.3", + "@mdx-js/react": "^3.0.1", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/tsconfig": "^3.8.1", + "@docusaurus/types": "^3.8.1", + "typescript": "~5.6.2" + } +} diff --git a/docs/pyproject.toml b/docs/pyproject.toml deleted file mode 100644 index b87df5bd..00000000 --- a/docs/pyproject.toml +++ /dev/null @@ -1,29 +0,0 @@ -[project] -name = "persisting-docs" -version = "0.2.0" -description = "Documentation for Persisting agent infrastructure" -readme = "README.md" -requires-python = ">=3.10" -dependencies = [ - "mkdocs>=1.5.0", - "mkdocs-material>=9.4.0", - "mkdocs-material-extensions>=1.3.0", - "mkdocs-static-i18n>=1.0.0", - "mkdocstrings>=0.24.0", - "mkdocstrings-python>=1.7.0", - "jieba>=0.42.1", # Chinese word segmentation for search -] - -[dependency-groups] -dev = [ - "ruff>=0.4.0", # For linting markdown code blocks -] - -[tool.ruff] -# Only lint Python code blocks in markdown files -include = ["*.py", "*.md"] -extend-include = ["*.ipynb"] - -[tool.ruff.lint] -select = ["E", "F", "UP", "B", "SIM", "I"] -ignore = ["E501"] # Ignore line length in documentation diff --git a/docs/sidebars.js b/docs/sidebars.js new file mode 100644 index 00000000..114a4733 --- /dev/null +++ b/docs/sidebars.js @@ -0,0 +1,30 @@ +const product = (name, labels) => [ + { type: 'doc', id: `${name}/index`, label: labels.overview }, + { type: 'doc', id: `${name}/get-started`, label: labels.getStarted }, + { type: 'category', label: labels.concepts, items: [{ type: 'autogenerated', dirName: `${name}/concepts` }] }, + { type: 'category', label: labels.guides, items: [{ type: 'autogenerated', dirName: `${name}/guides` }] }, + { type: 'category', label: labels.design, items: [{ type: 'autogenerated', dirName: `${name}/design` }] }, + { type: 'category', label: labels.reference, items: [{ type: 'autogenerated', dirName: `${name}/reference` }] }, +]; +module.exports = { + enSidebar: [ + { type: 'doc', id: 'index', label: 'Start here' }, + { type: 'doc', id: 'overview', label: 'Choose a workflow' }, + { type: 'doc', id: 'installation', label: 'Installation' }, + { type: 'category', label: 'pVisor', items: product('pvisor', { overview: 'Overview', getStarted: 'Get Started', concepts: 'Concepts', guides: 'Guides', design: 'Design', reference: 'Reference' }) }, + { type: 'category', label: 'pChronicle', items: product('pchronicle', { overview: 'Overview', getStarted: 'Get Started', concepts: 'Concepts', guides: 'Guides', design: 'Design', reference: 'Reference' }) }, + { type: 'category', label: 'System design', items: [{ type: 'autogenerated', dirName: 'system-design' }] }, + { type: 'category', label: 'Project', items: [{ type: 'autogenerated', dirName: 'project' }] }, + { type: 'category', label: 'RFCs', items: [{ type: 'autogenerated', dirName: 'rfcs' }] }, + ], + zhSidebar: [ + { type: 'doc', id: 'index', label: '从这里开始' }, + { type: 'doc', id: 'overview', label: '选择工作流' }, + { type: 'doc', id: 'installation', label: '安装指南' }, + { type: 'category', label: 'pVisor', items: product('pvisor', { overview: '概览', getStarted: '快速开始', concepts: '核心概念', guides: '指南', design: '设计', reference: '参考' }) }, + { type: 'category', label: 'pChronicle', items: product('pchronicle', { overview: '概览', getStarted: '快速开始', concepts: '核心概念', guides: '指南', design: '设计', reference: '参考' }) }, + { type: 'category', label: '系统设计', items: [{ type: 'autogenerated', dirName: 'system-design' }] }, + { type: 'category', label: '项目', items: [{ type: 'autogenerated', dirName: 'project' }] }, + { type: 'category', label: 'RFC', items: [{ type: 'autogenerated', dirName: 'rfcs' }] }, + ], +}; diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css new file mode 100644 index 00000000..21e06b9b --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,48 @@ +:root { --scroll-progress: 0; --scroll-y: 0px; --sky-pitch: 4deg; --sky-lift: -36px; --zodiac-index: 0; --zodiac-angle: 0deg; --zodiac-elevation: 0deg; --zodiac-shift: 46%; --zodiac-yaw: 0deg; --ifm-color-primary: #67e8f9; --ifm-color-primary-dark: #22d3ee; --ifm-color-primary-light: #a5f3fc; --ifm-code-font-size: 90%; --ifm-font-family-base: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --ifm-heading-font-family: var(--ifm-font-family-base); --ifm-line-height-base: 1.7; --ifm-background-color: #070b1e; --ifm-background-surface-color: #101a3a; --ifm-font-color-base: #e7edff; --ifm-heading-color: #ffffff; } +body { min-height: 100vh; color: #e7edff; background: #050b22; overflow-x: hidden; } +#__docusaurus { position: relative; isolation: isolate; background: transparent; } +.main-wrapper { background: transparent; } +.theme-doc-markdown { color: #e7edff; } +.theme-doc-markdown a, .footer__link-item { color: #8ff7e8; } +.theme-doc-markdown a:hover, .footer__link-item:hover { color: #ffffff; } +.navbar { background: rgb(63 81 181 / 96%); box-shadow: 0 2px 16px rgb(15 23 42 / 16%); backdrop-filter: blur(12px); } +.theme-announcement-bar { background: rgb(7 16 45 / 96%); color: #dbeafe; border-bottom: 1px solid rgb(103 232 249 / 20%); } +[class*="announcementBar_"] { background: rgb(7 16 45 / 96%); color: #dbeafe; border-bottom: 1px solid rgb(103 232 249 / 20%); } +.navbar__title { letter-spacing: -.02em; } +.theme-doc-markdown { max-width: 52rem; } +.theme-doc-markdown h1 { letter-spacing: -.035em; } +.theme-doc-markdown h2 { margin-top: 2.5rem; letter-spacing: -.025em; } +.theme-doc-markdown h3 { margin-top: 2rem; } +.theme-code-block { border: 1px solid rgb(148 163 184 / 18%); border-radius: .6rem; box-shadow: 0 10px 28px rgb(15 23 42 / 8%); } +.theme-admonition { border-radius: .6rem; } +.hero--primary { position: relative; background: transparent; } +.hero .container { z-index: 3; } +.hero--primary::after { content: ''; position: absolute; inset: 0; background: linear-gradient(90deg, rgb(5 11 29 / 76%) 0%, rgb(5 11 29 / 56%) 38%, rgb(5 11 29 / 12%) 78%, rgb(5 11 29 / 4%) 100%), linear-gradient(0deg, rgb(5 11 29 / 64%) 0%, transparent 58%); pointer-events: none; } +.hero .container { position: relative; z-index: 1; width: 100%; } +.hero--primary .hero__title, .hero--primary .hero__subtitle { color: #fff !important; text-shadow: 0 3px 24px rgb(0 0 0 / 72%); } +.hero--primary .eyebrow { color: #8ff7e8; } +.hero--primary .button--outline { color: #fff; border-color: rgb(255 255 255 / 62%); } +.hero__title { max-width: 48rem; letter-spacing: -0.04em; font-size: clamp(2.75rem, 7vw, 5.5rem); line-height: 1.02; } +.hero__subtitle { max-width: 38rem; margin: 1.5rem 0 2rem; font-size: 1.25rem; line-height: 1.55; } + +.architecture-section { border-top: 1px solid rgb(148 163 184 / 24%); } +.product-choices { row-gap: 1rem; } +.product-card { height: 100%; padding: 2rem; border: 1px solid rgb(148 163 184 / 28%); border-radius: 1rem; background: rgb(7 16 45 / 94%); box-shadow: 0 12px 30px rgb(0 0 0 / 24%); transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease; } +.product-card:hover { transform: translateY(-4px); border-color: var(--ifm-color-primary); box-shadow: 0 18px 42px rgb(31 41 55 / 14%); } +.product-kicker { margin-bottom: .75rem; color: var(--ifm-color-primary); font-size: .7rem; font-weight: 700; letter-spacing: .14em; } +.product-outcome { min-height: 3.2rem; color: #b8c4e4; font-size: .95rem; } +.section-lede { max-width: 42rem; margin: 0 auto 2rem; color: #b8c4e4; } +.architecture-diagram { display: block; width: min(1100px, 100%); margin: 2rem auto 3rem; border-radius: .75rem; box-shadow: 0 16px 50px rgb(31 41 55 / 12%); } +.workflow-steps { text-align: center; } +.step-number { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; border-radius: 50%; background: var(--ifm-color-primary); color: #fff; font-size: .75rem; font-weight: 700; } +.quickstart-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin: 3rem 0; } +.quickstart-card { padding: 1.25rem; border: 1px solid rgb(148 163 184 / 24%); border-radius: .75rem; background: rgb(12 21 49 / 74%); } +.quickstart-card pre { min-height: 5rem; } +.quickstart-section { border-top: 1px solid rgb(148 163 184 / 24%); } +.quickstart-commands { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-top: 2.5rem; } +.quickstart-commands article { padding: 1.25rem; border: 1px solid rgb(148 163 184 / 24%); border-radius: .75rem; background: rgb(12 21 49 / 86%); } +.quickstart-commands h3 { margin-top: 1rem; } +.quickstart-commands pre { min-height: 5rem; margin-bottom: 0; font-size: .8rem; } +@media (max-width: 996px) { .quickstart-grid { grid-template-columns: 1fr; } } +@media (max-width: 996px) { .quickstart-commands { grid-template-columns: 1fr; } } +@media (max-width: 996px) { .hero { min-height: 40rem; padding: 7rem 0 4rem; } .hero__subtitle { font-size: 1.05rem; } } diff --git a/docs/src/assets/diagrams/agentvisor/README.txt b/docs/src/en/assets/diagrams/agentvisor/README.txt similarity index 100% rename from docs/src/assets/diagrams/agentvisor/README.txt rename to docs/src/en/assets/diagrams/agentvisor/README.txt diff --git a/docs/src/assets/diagrams/agentvisor/agentvisor-stack.svg b/docs/src/en/assets/diagrams/agentvisor/agentvisor-stack.svg similarity index 100% rename from docs/src/assets/diagrams/agentvisor/agentvisor-stack.svg rename to docs/src/en/assets/diagrams/agentvisor/agentvisor-stack.svg diff --git a/docs/src/assets/diagrams/agentvisor/effect-governance.svg b/docs/src/en/assets/diagrams/agentvisor/effect-governance.svg similarity index 100% rename from docs/src/assets/diagrams/agentvisor/effect-governance.svg rename to docs/src/en/assets/diagrams/agentvisor/effect-governance.svg diff --git a/docs/src/assets/diagrams/agentvisor/execution-continuum.svg b/docs/src/en/assets/diagrams/agentvisor/execution-continuum.svg similarity index 100% rename from docs/src/assets/diagrams/agentvisor/execution-continuum.svg rename to docs/src/en/assets/diagrams/agentvisor/execution-continuum.svg diff --git a/docs/src/assets/diagrams/persisting/README.txt b/docs/src/en/assets/diagrams/persisting/README.txt similarity index 100% rename from docs/src/assets/diagrams/persisting/README.txt rename to docs/src/en/assets/diagrams/persisting/README.txt diff --git a/docs/src/assets/diagrams/persisting/dataset-catalog.svg b/docs/src/en/assets/diagrams/persisting/dataset-catalog.svg similarity index 100% rename from docs/src/assets/diagrams/persisting/dataset-catalog.svg rename to docs/src/en/assets/diagrams/persisting/dataset-catalog.svg diff --git a/docs/src/assets/diagrams/persisting/gateway-dataflow.svg b/docs/src/en/assets/diagrams/persisting/gateway-dataflow.svg similarity index 100% rename from docs/src/assets/diagrams/persisting/gateway-dataflow.svg rename to docs/src/en/assets/diagrams/persisting/gateway-dataflow.svg diff --git a/docs/src/assets/diagrams/persisting/gateway-request.svg b/docs/src/en/assets/diagrams/persisting/gateway-request.svg similarity index 100% rename from docs/src/assets/diagrams/persisting/gateway-request.svg rename to docs/src/en/assets/diagrams/persisting/gateway-request.svg diff --git a/docs/src/assets/diagrams/persisting/libkrun-executor.svg b/docs/src/en/assets/diagrams/persisting/libkrun-executor.svg similarity index 100% rename from docs/src/assets/diagrams/persisting/libkrun-executor.svg rename to docs/src/en/assets/diagrams/persisting/libkrun-executor.svg diff --git a/docs/src/assets/diagrams/persisting/pchronicle-product.svg b/docs/src/en/assets/diagrams/persisting/pchronicle-product.svg similarity index 100% rename from docs/src/assets/diagrams/persisting/pchronicle-product.svg rename to docs/src/en/assets/diagrams/persisting/pchronicle-product.svg diff --git a/docs/src/assets/diagrams/persisting/pchronicle-web.svg b/docs/src/en/assets/diagrams/persisting/pchronicle-web.svg similarity index 100% rename from docs/src/assets/diagrams/persisting/pchronicle-web.svg rename to docs/src/en/assets/diagrams/persisting/pchronicle-web.svg diff --git a/docs/src/assets/diagrams/persisting/run-lifecycle.svg b/docs/src/en/assets/diagrams/persisting/run-lifecycle.svg similarity index 100% rename from docs/src/assets/diagrams/persisting/run-lifecycle.svg rename to docs/src/en/assets/diagrams/persisting/run-lifecycle.svg diff --git a/docs/src/assets/diagrams/persisting/system-products.svg b/docs/src/en/assets/diagrams/persisting/system-products.svg similarity index 96% rename from docs/src/assets/diagrams/persisting/system-products.svg rename to docs/src/en/assets/diagrams/persisting/system-products.svg index 27192894..e979ebfc 100644 --- a/docs/src/assets/diagrams/persisting/system-products.svg +++ b/docs/src/en/assets/diagrams/persisting/system-products.svg @@ -45,7 +45,7 @@ Persisting product paths and optional integration - pPilot plans many Runs; pVisor governs each Attempt; pChronicle stores history + pVisor governs execution; pChronicle preserves queryable history Inputs @@ -67,7 +67,7 @@ pVisor: one governed Run per Agent - pPilot adds planning, leases, retry, and reconciliation + review, apply, or drop staged changes Host · OCI container · libkrun VM diff --git a/docs/src/en/assets/diagrams/pvisor/README.txt b/docs/src/en/assets/diagrams/pvisor/README.txt new file mode 100644 index 00000000..b9deac53 --- /dev/null +++ b/docs/src/en/assets/diagrams/pvisor/README.txt @@ -0,0 +1,12 @@ +pVisor documentation diagrams + +These SVG files are source assets, not generated build output. They are kept +inside the Docusaurus website assets directory so the website and repository README can reference +the same versioned diagrams. + +- agentvisor-architecture.svg: product ownership and the boundary between + pVisor, pChronicle, and execution providers. + +Keep status labels honest when the implementation changes. Product-specific +claims belong here; industry-level category diagrams live in the sibling +`agentvisor` directory. diff --git a/docs/src/assets/diagrams/pvisor/agentvisor-architecture.svg b/docs/src/en/assets/diagrams/pvisor/agentvisor-architecture.svg similarity index 94% rename from docs/src/assets/diagrams/pvisor/agentvisor-architecture.svg rename to docs/src/en/assets/diagrams/pvisor/agentvisor-architecture.svg index adb179d6..5620ed35 100644 --- a/docs/src/assets/diagrams/pvisor/agentvisor-architecture.svg +++ b/docs/src/en/assets/diagrams/pvisor/agentvisor-architecture.svg @@ -1,6 +1,6 @@ pVisor AgentVisor architecture - An Agent sends one Run contract into pVisor. pVisor governs lifecycle, capabilities, Effects, checkpoints, lineage, Evidence, and runtime drivers. pPilot orchestrates many Runs, while host, container, VM, and future fleet providers execute Attempts. Configured pChronicle capture receives Gateway trajectory events, pVisor lifecycle records, and their event-carried Evidence; the full Run Bundle and its Artifact, lineage, Effect, and broader Evidence inventory remain local. + An Agent sends one Run contract into pVisor. pVisor governs lifecycle, capabilities, Effects, checkpoints, lineage, Evidence, and runtime drivers. orchestration orchestrates many Runs, while host, container, VM, and future fleet providers execute Attempts. Configured pChronicle capture receives Gateway trajectory events, pVisor lifecycle records, and their event-carried Evidence; the full Run Bundle and its Artifact, lineage, Effect, and broader Evidence inventory remain local. @@ -92,7 +92,7 @@ - pPilot + orchestration plan · lease · schedule retry · reconcile Many Runs diff --git a/docs/src/assets/screenshots/pchronicle/analysis-sql.jpg b/docs/src/en/assets/screenshots/pchronicle/analysis-sql.jpg similarity index 100% rename from docs/src/assets/screenshots/pchronicle/analysis-sql.jpg rename to docs/src/en/assets/screenshots/pchronicle/analysis-sql.jpg diff --git a/docs/src/assets/screenshots/pchronicle/assistant-settings.jpg b/docs/src/en/assets/screenshots/pchronicle/assistant-settings.jpg similarity index 100% rename from docs/src/assets/screenshots/pchronicle/assistant-settings.jpg rename to docs/src/en/assets/screenshots/pchronicle/assistant-settings.jpg diff --git a/docs/src/assets/screenshots/pchronicle/data-overview.jpg b/docs/src/en/assets/screenshots/pchronicle/data-overview.jpg similarity index 100% rename from docs/src/assets/screenshots/pchronicle/data-overview.jpg rename to docs/src/en/assets/screenshots/pchronicle/data-overview.jpg diff --git a/docs/src/assets/screenshots/pchronicle/run-detail.jpg b/docs/src/en/assets/screenshots/pchronicle/run-detail.jpg similarity index 100% rename from docs/src/assets/screenshots/pchronicle/run-detail.jpg rename to docs/src/en/assets/screenshots/pchronicle/run-detail.jpg diff --git a/docs/src/assets/screenshots/pchronicle/runs-browser.jpg b/docs/src/en/assets/screenshots/pchronicle/runs-browser.jpg similarity index 100% rename from docs/src/assets/screenshots/pchronicle/runs-browser.jpg rename to docs/src/en/assets/screenshots/pchronicle/runs-browser.jpg diff --git a/docs/src/assets/screenshots/pchronicle/storage-layout.jpg b/docs/src/en/assets/screenshots/pchronicle/storage-layout.jpg similarity index 100% rename from docs/src/assets/screenshots/pchronicle/storage-layout.jpg rename to docs/src/en/assets/screenshots/pchronicle/storage-layout.jpg diff --git a/docs/src/assets/stylesheets/home.css b/docs/src/en/assets/stylesheets/home.css similarity index 80% rename from docs/src/assets/stylesheets/home.css rename to docs/src/en/assets/stylesheets/home.css index d6409f98..65a5f7cb 100644 --- a/docs/src/assets/stylesheets/home.css +++ b/docs/src/en/assets/stylesheets/home.css @@ -4,10 +4,12 @@ recipes rather than one inverted palette. */ :root { - --md-primary-fg-color: #475569; - --md-primary-fg-color--light: #64748b; - --md-primary-fg-color--dark: #334155; - --md-accent-fg-color: #0f766e; + /* Keep Material's indigo/pink relationship; Persisting's teal and blue + accents remain inside the page content. */ + --md-primary-fg-color: #3f51b5; + --md-primary-fg-color--light: #7986cb; + --md-primary-fg-color--dark: #303f9f; + --md-accent-fg-color: #ff4081; /* Semantic palette: teal marks execution, blue marks history. */ --ph-exec: #0d9488; @@ -23,18 +25,16 @@ /* Hero, light recipe. */ --ph-hero-bg: - radial-gradient(ellipse 70% 55% at 78% 8%, rgba(45, 212, 191, 0.16), transparent 62%), - radial-gradient(ellipse 65% 55% at 12% 88%, rgba(59, 130, 246, 0.13), transparent 60%), - linear-gradient(168deg, #f7fafc, #eef4f8 55%, #e9f1f4); + linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(245, 247, 255, 0.96)); --ph-hero-ink: #0b1220; --ph-hero-dim: #46566d; --ph-hero-eyebrow: #0f766e; --ph-hero-rule: rgba(15, 23, 42, 0.1); --ph-btn-fg: #0b1220; - --ph-btn-line: rgba(15, 23, 42, 0.22); + --ph-btn-line: rgba(63, 81, 181, 0.28); --ph-btn-hover: rgba(15, 23, 42, 0.05); - --ph-shadow: 0 22px 60px rgba(15, 23, 42, 0.14); - --ph-shadow-sm: 0 10px 28px rgba(15, 23, 42, 0.1); + --ph-shadow: 0 8px 24px rgba(63, 81, 181, 0.14); + --ph-shadow-sm: 0 4px 14px rgba(63, 81, 181, 0.12); /* Terminal cards stay dark in both schemes: a shell is a shell. */ --ph-term-bg: #0b1322; @@ -75,20 +75,40 @@ body { } .ph-shell { - width: min(1180px, calc(100% - 44px)); + width: min(1280px, calc(100% - 56px)); margin: 0 auto; } +/* The landing page is a full-width surface. Material's regular content grid + remains in place for documentation pages, but must not squeeze the hero + into the reading column. */ +body:has(.ph) .md-tabs:has(.ph), +body:has(.ph) .md-tabs:has(.ph) .ph { + max-width: none; +} + +body:has(.ph) .md-tabs:has(.ph) { + width: 100%; +} + /* ---------------------------------------------------------------- hero -- */ .ph-hero { - padding: 84px 0 92px; + position: relative; + overflow: hidden; + padding: 94px 0 104px; background: var(--ph-hero-bg); color: var(--ph-hero-ink); } .ph-hero-copy { max-width: 780px; + margin: 0 auto; + text-align: center; +} + +.ph-hero .ph-shell { + display: block; } .ph-eyebrow, @@ -118,9 +138,16 @@ body { line-height: 1.28; } +.ph-hero-copy .ph-positioning + .ph-positioning { + margin-top: 16px; + font-size: clamp(1.05rem, 1.7vw, 1.25rem); + font-weight: 450; + line-height: 1.65; +} + .ph-lede { max-width: 640px; - margin: 16px 0 0; + margin: 16px auto 0; color: var(--ph-hero-dim); font-size: clamp(1.02rem, 1.7vw, 1.2rem); line-height: 1.66; @@ -129,6 +156,7 @@ body { .ph-actions { display: flex; flex-wrap: wrap; + justify-content: center; gap: 11px; margin-top: 34px; } @@ -154,15 +182,15 @@ body { } .ph-btn--primary { - border-color: var(--ph-exec); - background: var(--ph-exec); + border-color: var(--md-primary-fg-color); + background: var(--md-primary-fg-color); color: #fff; } .ph-btn--primary:hover { - border-color: var(--ph-exec-bright); - background: var(--ph-exec-bright); - color: #062a26; + border-color: var(--md-primary-fg-color--dark); + background: var(--md-primary-fg-color--dark); + color: #fff; } .ph-btn--quiet { @@ -180,6 +208,38 @@ body { margin-top: 62px; } +.ph-hero-art { + position: relative; + width: 100vw; + min-height: 620px; + overflow: hidden; + border: 1px solid rgba(94, 234, 212, 0.25); + border-radius: 24px; + background: #07101d url('../diagrams/persisting/hero-cyberpunk.svg') center / cover no-repeat; + box-shadow: var(--ph-shadow); + max-width: none; + margin: 58px 0 0; + margin-left: calc(50% - 50vw); + border-radius: 0; + background-size: cover; + background-position: center; +} + +.ph-hero-art__label, +.ph-hero-art__caption { + position: absolute; + left: 24px; + right: 24px; + color: #a7f3d0; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.68rem; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.ph-hero-art__label { top: 22px; } +.ph-hero-art__caption { bottom: 22px; color: #bfdbfe; font-family: inherit; letter-spacing: 0; text-transform: none; line-height: 1.5; } + .ph-panel { margin: 0; min-width: 0; @@ -458,6 +518,39 @@ body { line-height: 1.68; } +/* Material-style feature grid: short, scannable capabilities before the + deeper workflow sections. */ +.ph-capabilities { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin-top: 42px; + overflow: hidden; + border: 1px solid var(--ph-line); + border-radius: 8px; + background: var(--ph-line); +} + +.ph-capabilities article { + min-height: 150px; + padding: 26px 24px; + background: var(--ph-card); +} + +.ph-capabilities h3 { + margin: 0 0 10px; + color: var(--ph-ink); + font-size: 1.02rem; + font-weight: 700; +} + +.ph-capabilities p { + margin: 0; + color: var(--ph-muted); + font-size: 0.92rem; + line-height: 1.6; +} + /* Wrap rather than scroll: a clipped command reads as broken on a landing page. */ .ph-step code { display: block; @@ -657,6 +750,14 @@ body { } @media (max-width: 920px) { + .ph-hero .ph-shell { + grid-template-columns: 1fr; + } + + .ph-hero-art { + min-height: 460px; + } + /* Stack the dual visual; the beam turns vertical. */ .ph-stage { grid-template-columns: 1fr; @@ -679,6 +780,7 @@ body { } .ph-flow, + .ph-capabilities, .ph-depth, .ph-start, .ph-start-paths { @@ -695,6 +797,10 @@ body { padding: 60px 0 68px; } + .ph-hero-art { + min-height: 390px; + } + .ph-section { padding: 62px 0; } diff --git a/docs/src/en/index.md b/docs/src/en/index.md new file mode 100644 index 00000000..4b9e3615 --- /dev/null +++ b/docs/src/en/index.md @@ -0,0 +1,31 @@ +--- +title: Start here +sidebar_label: Start here +--- + +# Start here + +Persisting gives you two independent product paths. Choose the one that matches the work in front of you: + +- [Run an Agent safely with pVisor](pvisor/get-started.md): stage workspace changes, inspect the Run Bundle, and apply only what you approve. +- [Explore durable history with pChronicle](pchronicle/get-started.md): open a Dataset, run a read-only query, and follow Source lineage. +- [Understand the product boundary](overview.md): see how execution and history connect without becoming one opaque system. + +If you are evaluating the system, start with [Choose a workflow](overview.md), then follow the product walkthrough that matches your data. + +## What you will have after the first walkthrough + +- A **pVisor** walkthrough ends with a stopped Run, a readable Run Bundle, and + a deliberate apply or drop decision. Your project is changed only when you + choose to apply the staged Effect. +- A **pChronicle** walkthrough ends with a read-only Dataset query and a clear + distinction between the Dataset, its Source, and the Snapshot being read. + +You do not need both products to begin. Add the capture handoff only when you +need to correlate execution evidence with durable trajectory history. + +## Before you start + +Install the CLI with the [installation guide](installation.md). Use pVisor when +you have a local project and an Agent command to run; use pChronicle when you +already have trajectory data or want to try its temporary onboarding Dataset. diff --git a/docs/src/en/installation.md b/docs/src/en/installation.md new file mode 100644 index 00000000..06fb0f0b --- /dev/null +++ b/docs/src/en/installation.md @@ -0,0 +1,107 @@ +# Installation + +Persisting gives you two public command-line paths: + +- `pvisor` runs an Agent inside a reviewable execution boundary. +- `pchronicle` opens, queries, exchanges, and serves trajectory Datasets. + +The default install includes the complete public CLI and Dataset workflow. + +## 1. Install the tools + +```bash +pip install persisting +``` + +Verify that the commands are available: + +```bash +pvisor --version +pchronicle --help +``` + +The wheel installs matching versions of the Python package and the public CLI +entry points into the active Python environment. Use a virtual environment when +the project has other Python dependencies: + +```bash +python3 -m venv .venv +source .venv/bin/activate +python -m pip install --upgrade pip +pip install persisting +``` + +:::tip You can start with either product +You do not need a pVisor Run to explore pChronicle. If you want to run an Agent +first, continue with [Run your first Agent](pvisor/get-started.md). If you +already have trajectory data, continue with [Explore your first Dataset](pchronicle/get-started.md). +::: + +## 2. Check platform requirements + +The CLI supports macOS and Linux with Python 3.10 or newer. A normal host Run +works without a filesystem extension. On macOS, install macFUSE before using a +host-process `pvisor run --safe` workflow: + +```bash +brew install --cask macfuse +``` + +Approve the macFUSE system extension when macOS asks. If the required mount +capability is unavailable, `--safe` fails closed rather than writing directly +to the project workspace. The libkrun VM executor does not require macFUSE. + +## 3. Install from source when needed + +Use the nightly wheel when you need the latest build published from `main`: + +```bash +curl -fsSL https://raw.githubusercontent.com/DeepLink-org/Persisting/main/scripts/install-nightly.sh | bash +``` + +For local development, install the Python package from a checkout: + +```bash +git clone https://github.com/DeepLink-org/Persisting.git +cd Persisting +pip install -e . +``` + +A source build of the CLI components is also available: + +```bash +just install-cli +``` + +Use `PERSISTING_PVISOR_BIN` only when you deliberately need to test a specific +pVisor binary. Keep the Python package and CLI from the same revision when +debugging provider behavior. + +## 4. Enable VM or OCI execution when needed + +The default local workflow does not require Docker or Podman. To run an OCI +image through the VM executor, provide an image explicitly: + +```bash +pvisor run --image ubuntu:latest -- COMMAND +``` + +`ubuntu:latest` is also the default VM image. `--image-store DIR` changes the +local content-addressed cache, `--overlayfs-target` selects the guest workspace, +and `--vm-rootfs DIR` points to a prepared Linux rootfs. Linux hosts use KVM; +Apple Silicon macOS hosts use HVF. Building the VM support from source on macOS +also requires Zig: + +```bash +brew install zig +``` + +Treat these options as a separate platform step. First complete the staged host +workflow so that you have a baseline Run Bundle to compare against. + +## 5. Choose the next step + +- [Run your first Agent](pvisor/get-started.md) — stage, review, and selectively apply changes. +- [Explore your first Dataset](pchronicle/get-started.md) — query temporary data before preparing a source. +- [Choose a workflow](overview.md) — decide which product matches the work in front of you. +- [Execution environments](pvisor/guides/execution.md) — compare host, OCI, and VM boundaries. diff --git a/docs/src/en/overview.md b/docs/src/en/overview.md new file mode 100644 index 00000000..1db61bc8 --- /dev/null +++ b/docs/src/en/overview.md @@ -0,0 +1,81 @@ +# Start with the question you have + +Persisting has two independent entry points. Start with the one that matches +the work in front of you, then follow the short path to a useful result. + +## I want to run an Agent safely and review its changes + +Start with **pVisor**. It gives one Agent a Run-owned workspace, records the +execution boundary, and leaves filesystem changes staged until you decide what +enters the real project. + +1. [Install the command line tools](installation.md). +2. [Run your first Agent](pvisor/get-started.md). +3. [Review and selectively apply changes](pvisor/guides/review-apply.md). +4. [Choose a host, OCI, or VM environment](pvisor/guides/execution.md). + +You should finish with a completed Run, a readable Run Bundle, and either an +applied or discarded stage. + +```bash +pvisor run --stage ./runs/task-001 -- codex +pvisor review last +pvisor apply last --path src +``` + +## I already have Agent trajectories + +Start with **pChronicle**. It can inspect local or object-store data and can +also import supported external formats. The first walkthrough creates temporary +example data, so you can learn the query flow before preparing a Dataset. + +1. [Explore a first Dataset](pchronicle/get-started.md). +2. [Discover and query your own data](pchronicle/guides/discover-and-query.md). +3. [Import or export a supported format](pchronicle/guides/exchange.md). +4. [Serve a Dataset locally](pchronicle/guides/serve.md). + +You should finish with a read-only query, a normalized view, and a clear Source +lineage for the data you inspected. + +```bash +pchronicle onboard query +pchronicle query ./trajectory-data \ + --sql 'SELECT source, COUNT(*) FROM dataset.steps GROUP BY source' +``` + +## I want execution and history together + +Connect the two products only after each standalone workflow works. Configure +pVisor capture to publish selected Gateway trajectory events and lifecycle +records into pChronicle. The handoff is explicit and narrow: it does not move +the private Run Bundle or invent evidence that the original Source did not +provide. + +1. [Capture Agent trajectories](pvisor/guides/capture.md). +2. [Understand the event and sidecar contract](rfcs/0007-events-contract-pchronicle-sidecar.md). +3. [Read the execution-to-history architecture](system-design/architecture.md). + +```text +pVisor Run ── configured capture ──> canonical event Source ──> Dataset views +external trajectory Source ──────────────────────────────────> Dataset views +``` + +## I need to understand the boundary before I run anything + +Read the concepts in this order: + +1. [Run, Attempt, and Effect](pvisor/concepts/run-model.md) — the stable objects. +2. [Capabilities and evidence](pvisor/concepts/capabilities-and-evidence.md) — what a Run can claim. +3. [Execution environments](pvisor/guides/execution.md) — how provider choice changes the boundary. +4. [Security and evidence](system-design/security-evidence.md) — what persists and what stays local. + +The documentation uses one rule throughout: a successful command does not imply +that every requested capability was enforced. The Run Bundle records the +mechanisms and limitations that actually applied. + +## Keep going + +- [pVisor command model](pvisor/design/cli.md) +- [pVisor case catalog](pvisor/reference/cases.md) +- [pChronicle concepts](pchronicle/concepts/index.md) +- [System design](system-design/index.md) diff --git a/docs/src/pchronicle/concepts/dataset-and-source.md b/docs/src/en/pchronicle/concepts/dataset-and-source.md similarity index 100% rename from docs/src/pchronicle/concepts/dataset-and-source.md rename to docs/src/en/pchronicle/concepts/dataset-and-source.md diff --git a/docs/src/pchronicle/concepts/facts-and-projections.md b/docs/src/en/pchronicle/concepts/facts-and-projections.md similarity index 100% rename from docs/src/pchronicle/concepts/facts-and-projections.md rename to docs/src/en/pchronicle/concepts/facts-and-projections.md diff --git a/docs/src/en/pchronicle/concepts/index.md b/docs/src/en/pchronicle/concepts/index.md new file mode 100644 index 00000000..578229d4 --- /dev/null +++ b/docs/src/en/pchronicle/concepts/index.md @@ -0,0 +1,25 @@ +# pChronicle concepts + +pChronicle is built around a **Dataset**, which is a path. Read these concepts +before querying history or integrating storage. + +:::note When this section helps +Use this section after the first query when you need to explain where a result +came from, keep a stable Snapshot while investigating, or choose between +canonical records and a derived view. +::: + +Follow these articles in order: + +1. [Dataset, Source, and Snapshot](dataset-and-source.md) explains how a path + is addressed, pinned, and read consistently. +2. [Recorded data, views, and versions](facts-and-projections.md) separates + canonical facts from the views used to inspect and exchange them. + +Storage mechanisms and current implementation belong to +[pChronicle Design](../design/index.md). Continue with +[common workflows](../guides/index.md) or the +[CLI reference](../reference/cli.md). + +After this section you should be able to describe a result by its Dataset, +Source, and Snapshot instead of treating a query output as an untraceable file. diff --git a/docs/src/pchronicle/design/architecture.md b/docs/src/en/pchronicle/design/architecture.md similarity index 100% rename from docs/src/pchronicle/design/architecture.md rename to docs/src/en/pchronicle/design/architecture.md diff --git a/docs/src/pchronicle/design/catalog.md b/docs/src/en/pchronicle/design/catalog.md similarity index 100% rename from docs/src/pchronicle/design/catalog.md rename to docs/src/en/pchronicle/design/catalog.md diff --git a/docs/src/pchronicle/design/index.md b/docs/src/en/pchronicle/design/index.md similarity index 100% rename from docs/src/pchronicle/design/index.md rename to docs/src/en/pchronicle/design/index.md diff --git a/docs/src/pchronicle/design/storyline-lance.md b/docs/src/en/pchronicle/design/storyline-lance.md similarity index 100% rename from docs/src/pchronicle/design/storyline-lance.md rename to docs/src/en/pchronicle/design/storyline-lance.md diff --git a/docs/src/pchronicle/design/trajectory-storage.md b/docs/src/en/pchronicle/design/trajectory-storage.md similarity index 100% rename from docs/src/pchronicle/design/trajectory-storage.md rename to docs/src/en/pchronicle/design/trajectory-storage.md diff --git a/docs/src/pchronicle/get-started.md b/docs/src/en/pchronicle/get-started.md similarity index 84% rename from docs/src/pchronicle/get-started.md rename to docs/src/en/pchronicle/get-started.md index cb0665bc..e2a3d511 100644 --- a/docs/src/pchronicle/get-started.md +++ b/docs/src/en/pchronicle/get-started.md @@ -19,7 +19,12 @@ pchronicle onboard query Neither command requires a source checkout or an existing Dataset. -## 2. Inspect your own Dataset +## 2. Inspect a Dataset you already have + +The onboarding Dataset is temporary and is removed when the walkthrough ends. +For a persistent query, point the commands below at a Dataset path you already +own. If you do not have one yet, stop after the onboarding query and continue +with [Discover and query your own data](guides/discover-and-query.md). A Dataset may be a local path, an object-store URI prefix, or an alias such as `@prod`: diff --git a/docs/src/pchronicle/guides/discover-and-query.md b/docs/src/en/pchronicle/guides/discover-and-query.md similarity index 88% rename from docs/src/pchronicle/guides/discover-and-query.md rename to docs/src/en/pchronicle/guides/discover-and-query.md index 841f9aaf..a837e67f 100644 --- a/docs/src/pchronicle/guides/discover-and-query.md +++ b/docs/src/en/pchronicle/guides/discover-and-query.md @@ -3,6 +3,11 @@ Use this workflow when you have a local path, object-store URI, or alias and want to understand its run data before writing a report. +:::tip What you will have at the end +You will know which Sources a Dataset contains, which relations are available, +and how to answer one bounded, read-only question reproducibly. +::: + ## 1. Inspect the Dataset ```bash @@ -25,6 +30,10 @@ pchronicle ls ./dataset --errors report pchronicle ls ./dataset --errors strict ``` +Use `report` while exploring unfamiliar data. Switch to `strict` in automation +when an incomplete Dataset should fail the job instead of producing a partial +answer. + ## 2. Start with a built-in analysis ```bash diff --git a/docs/src/pchronicle/guides/exchange.md b/docs/src/en/pchronicle/guides/exchange.md similarity index 100% rename from docs/src/pchronicle/guides/exchange.md rename to docs/src/en/pchronicle/guides/exchange.md diff --git a/docs/src/pchronicle/guides/index.md b/docs/src/en/pchronicle/guides/index.md similarity index 100% rename from docs/src/pchronicle/guides/index.md rename to docs/src/en/pchronicle/guides/index.md diff --git a/docs/src/pchronicle/guides/serve-gateway.md b/docs/src/en/pchronicle/guides/serve-gateway.md similarity index 100% rename from docs/src/pchronicle/guides/serve-gateway.md rename to docs/src/en/pchronicle/guides/serve-gateway.md diff --git a/docs/src/pchronicle/guides/serve.md b/docs/src/en/pchronicle/guides/serve.md similarity index 100% rename from docs/src/pchronicle/guides/serve.md rename to docs/src/en/pchronicle/guides/serve.md diff --git a/docs/src/en/pchronicle/guides/troubleshooting.md b/docs/src/en/pchronicle/guides/troubleshooting.md new file mode 100644 index 00000000..ef0c9068 --- /dev/null +++ b/docs/src/en/pchronicle/guides/troubleshooting.md @@ -0,0 +1,82 @@ +# Troubleshoot a Dataset + +Diagnose a pChronicle result in the same order every time: confirm the path, +inspect what is visible, then narrow the query. This keeps a missing Dataset, +an empty result, and a resource limit from looking like the same failure. + +## Confirm the Dataset first + +Use a concrete path while investigating. An alias adds one more resolution step: + +```bash +pchronicle alias list +pchronicle status ./trajectory-data --format json +pchronicle ls ./trajectory-data --format json +``` + +If an alias fails, resolve the alias before debugging storage credentials or SQL: + +```bash +pchronicle alias get-url prod +pchronicle status @prod --format json +``` + +An alias points to a Dataset; it does not copy or move the underlying data. + +## The Dataset opens but appears empty + +Check the summary before writing a more selective query: + +```bash +pchronicle analysis overview ./trajectory-data +pchronicle find ./trajectory-data --match "" --format json +``` + +An empty result can mean that the path contains a supported format with no +matching records, that a filter is scoped to the wrong entity, or that the +Dataset contains files pChronicle does not recognize. The overview and JSON +metadata identify the visible sources and the search mode. + +## A query returns no rows + +Start with a bounded count, then inspect the normalized table names: + +```bash +pchronicle query ./trajectory-data \ + --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' +pchronicle query ./trajectory-data \ + --sql 'SELECT source, COUNT(*) AS steps FROM dataset.steps GROUP BY source' +``` + +Use `find` for identity or text discovery before composing a join. A Snapshot +pins one read view; if data changes between two commands, record the Snapshot +identifier from the JSON output and reuse it in the follow-up query. + +## The query stops at a limit + +Resource limits are part of the public query contract. Reduce the question +before raising a limit: + +```bash +pchronicle query ./trajectory-data \ + --sql 'SELECT source, COUNT(*) FROM dataset.steps GROUP BY source' \ + --max-output-rows 20 --timeout 10s +``` + +Use `--file` for a checked-in query and explicit output limits in CI. A query +that needs a larger budget should explain why in the calling workflow rather +than silently removing the guard. + +## The source format is unsupported + +Check the [supported formats](../reference/formats/index.md) and use the +exchange guide to import into a Dataset pChronicle can normalize. Import does +not invent missing lineage or Evidence; preserve the original Source alongside +the normalized view when provenance matters. + +## Before opening an issue + +Include the pChronicle version, Dataset path or alias name (without credentials), +the output of `status --format json`, the exact query, and its resource limits. +For object storage, include the provider type and region or endpoint, never +access keys or signed URLs. diff --git a/docs/src/pchronicle/guides/ui.md b/docs/src/en/pchronicle/guides/ui.md similarity index 98% rename from docs/src/pchronicle/guides/ui.md rename to docs/src/en/pchronicle/guides/ui.md index 78396a0f..ca25348d 100644 --- a/docs/src/pchronicle/guides/ui.md +++ b/docs/src/en/pchronicle/guides/ui.md @@ -8,7 +8,7 @@ storage. The screenshots and examples on this page were produced directly by: ./target/release/pchronicle serve tmp/test/ data/ --listen 127.0.0.1:9980 ``` -After the listener is ready, open . This command mounts +After the listener is ready, open [http://127.0.0.1:9980/](http://127.0.0.1:9980/). This command mounts two Datasets. Because neither has an explicit name, the UI derives `test` and `data` from the last path component. Give mounts stable UI and SQL schema names when they will be reused: diff --git a/docs/src/pchronicle/index.md b/docs/src/en/pchronicle/index.md similarity index 56% rename from docs/src/pchronicle/index.md rename to docs/src/en/pchronicle/index.md index 3c1635f0..63032fdc 100644 --- a/docs/src/pchronicle/index.md +++ b/docs/src/en/pchronicle/index.md @@ -8,6 +8,12 @@ Within Persisting's model-state-to-Agent-history story, pChronicle is the durable store and query engine for Agent history. It can run as a local tool or be deployed as a platform in front of many paths. +:::tip What you will complete +The first walkthrough creates temporary data, opens it as a Dataset, runs a +read-only summary, and answers one SQL question. You can learn the query model +without preparing a production store first. +::: + ## The one object you work with A **Dataset** is a path: a local directory or file, or an object-store URI @@ -42,22 +48,34 @@ pchronicle query ./trajectory-data \ --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' ``` -## Choose a task +## Choose your next step + +Start with [Explore your first Dataset](get-started.md) if you are learning +the command line. It creates temporary data and lets you complete a read-only +query before you connect a real source. + +When you already have a question, follow the matching path: -| I want to... | Start with | -| --- | --- | -| Inspect a Dataset | `pchronicle ls DATASET` or `pchronicle status DATASET` | -| Run a common report | `pchronicle analysis overview DATASET` | -| Ask a custom SQL question | `pchronicle query DATASET --sql SQL` | -| Give a Dataset a short name | `pchronicle alias add NAME DATASET` | -| Import or export runs | `pchronicle import` or `pchronicle export` | -| Analyze with Codex or Claude | `pchronicle agent codex DATASET` | -| Open the local read-only UI and API | [`pchronicle serve DATASET`](guides/ui.md) | +- **Inspect a Dataset:** `pchronicle ls DATASET` or `pchronicle status DATASET` +- **Run a common report:** `pchronicle analysis overview DATASET` +- **Ask a custom SQL question:** `pchronicle query DATASET --sql SQL` +- **Name a Dataset:** `pchronicle alias add NAME DATASET` +- **Import or export runs:** [Exchange data](guides/exchange.md) +- **Analyze with an Agent:** `pchronicle agent codex DATASET` +- **Open the local UI and API:** [Serve a Dataset](guides/ui.md) pChronicle reads and organizes run history. It does not execute or schedule Agents. To run an Agent in a controlled workspace, start with [pVisor](../pvisor/index.md). +## A useful reading order + +1. [Explore your first Dataset](get-started.md) to complete a read-only query. +2. [Discover and query](guides/discover-and-query.md) when you are ready to inspect real data. +3. [Exchange data](guides/exchange.md) when a supported external format is involved. +4. [Serve a Dataset](guides/serve.md) when another tool needs local access. +5. [CLI reference](reference/cli.md) when you need exact flags, budgets, or output formats. + ## Keep reading - [Explore your first Dataset](get-started.md) diff --git a/docs/src/pchronicle/reference/agenticmd.md b/docs/src/en/pchronicle/reference/agenticmd.md similarity index 100% rename from docs/src/pchronicle/reference/agenticmd.md rename to docs/src/en/pchronicle/reference/agenticmd.md diff --git a/docs/src/en/pchronicle/reference/cases-platform.md b/docs/src/en/pchronicle/reference/cases-platform.md new file mode 100644 index 00000000..93c99960 --- /dev/null +++ b/docs/src/en/pchronicle/reference/cases-platform.md @@ -0,0 +1,92 @@ +# pChronicle 集群平台与 Catalog Server 场景 + +本文覆盖平台化部署。Catalog 配置只管理用户、Dataset 和授权;Warehouse 的服务参数仍由 `pchronicle serve` 提供。 + +## P01:从空配置创建 Catalog 用户 + +```bash +pchronicle serve catalog user create \ + --catalog-config ./catalog.toml alice +``` + +如果文件不存在,命令创建配置文件、生成用户 AK/SK,并只在本次输出 secret。 + +## P02:登记 Dataset + +```bash +pchronicle serve catalog dataset create \ + --catalog-config ./catalog.toml \ + prod s3://bucket/prod \ + --endpoint http://127.0.0.1:9000 \ + --region us-west-2 \ + --ak BACKEND_AK \ + --sk BACKEND_SK +``` + +该命令只登记 Dataset,不创建或删除后端数据。 + +## P03:授权用户 + +```bash +pchronicle serve catalog grant \ + --catalog-config ./catalog.toml \ + alice prod \ + --permission read \ + --permission query \ + --permission analyze +``` + +预期:配置中出现独立的 `[[grants]]` 记录。 + +## P04:启动 Catalog Server + +```bash +pchronicle serve \ + --catalog-config ./catalog.toml \ + --listen 127.0.0.1:8081 +``` + +父进程负责用户认证、Dataset 列表和 ticket;查询数据面在授权 mounts 的 worker 中执行。 + +## P05:访问授权 Dataset + +```bash +pchronicle alias add team catalog://127.0.0.1:8081 \ + --ak USER_AK --sk USER_SK +pchronicle query @team/prod \ + --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' +``` + +预期:授权用户可以查询 `prod`;未授权用户或未知 Dataset 返回相同的 404 资源错误。 + +## P06:撤销授权 + +```bash +pchronicle serve catalog revoke \ + --catalog-config ./catalog.toml \ + alice prod --permission query +``` + +预期:后续查询被拒绝,但 `read` 和其它仍保留的权限不受影响。 + +## P07:RustFS Warehouse 回归 + +准备 RustFS,并设置: + +```bash +export PCHRONICLE_RUSTFS_ENDPOINT=http://127.0.0.1:9000 +export PCHRONICLE_RUSTFS_ACCESS_KEY=rustfsadmin +export PCHRONICLE_RUSTFS_SECRET_KEY=rustfsadmin +export PCHRONICLE_RUSTFS_BUCKET=pchronicle-cases +``` + +然后运行 RustFS 回归测试,验证 Dataset 写入、Catalog discovery、SQL 查询、Explorer 和 refresh 行为。 + +平台验收重点: + +- Catalog 文件可从空文件开始构建; +- 用户、Dataset 和 grants 修改是确定性的; +- Dataset 后端凭据只在授权 ticket 中使用; +- Worker 只收到当前用户被授权的 mounts; +- Catalog refresh 不影响已完成查询的 snapshot; +- RustFS 上的 Warehouse 行为与本地 Dataset 一致。 diff --git a/docs/src/en/pchronicle/reference/cases-self.md b/docs/src/en/pchronicle/reference/cases-self.md new file mode 100644 index 00000000..c4138aeb --- /dev/null +++ b/docs/src/en/pchronicle/reference/cases-self.md @@ -0,0 +1,65 @@ +# pChronicle 单机与自助使用场景 + +本文覆盖不依赖 Catalog Server 的基础工作流。每个案例都可以在一台开发机上独立执行,Dataset 可以是本地目录或对象存储 URI。 + +## 准备 + +```bash +mkdir -p /tmp/pchronicle-cases +cd /tmp/pchronicle-cases +pchronicle onboard +``` + +## S01:浏览本地 Dataset + +```bash +pchronicle ls ./trajectory-data +pchronicle status ./trajectory-data +``` + +预期:命令列出 Dataset 中的 runs、steps 和 tool calls;空 Dataset 返回明确的空结果。 + +## S02:执行 SQL 查询 + +```bash +pchronicle query ./trajectory-data \ + --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' +``` + +预期:查询成功并返回确定的 runs 数量。 + +## S03:运行内建分析 + +```bash +pchronicle analysis overview ./trajectory-data +``` + +预期:输出运行数、步骤数、工具调用数和时间范围。 + +## S04:导入和导出 + +```bash +pchronicle import input.jsonl --output ./trajectory-data +pchronicle export ./trajectory-data --output output.jsonl +``` + +预期:导出内容可以再次导入,记录的 ID 和事件顺序保持一致。 + +## S05:本地 Warehouse + +```bash +pchronicle serve ./trajectory-data --listen 127.0.0.1:8081 +``` + +预期:Web UI、`/api/query/tables`、`/api/catalog` 和 Explorer API 可用;未启用 Catalog 时不需要用户凭据。 + +## S06:对象存储 Dataset + +```bash +export AWS_ENDPOINT_URL_S3=http://127.0.0.1:9000 +export AWS_ACCESS_KEY_ID=rustfsadmin +export AWS_SECRET_ACCESS_KEY=rustfsadmin +pchronicle ls s3://bucket/trajectory +``` + +预期:pChronicle 通过 S3 兼容接口发现并查询 Dataset。endpoint 和凭据不会写入 Dataset URI。 diff --git a/docs/src/pchronicle/reference/cli.md b/docs/src/en/pchronicle/reference/cli.md similarity index 85% rename from docs/src/pchronicle/reference/cli.md rename to docs/src/en/pchronicle/reference/cli.md index e07351e7..c1005932 100644 --- a/docs/src/pchronicle/reference/cli.md +++ b/docs/src/en/pchronicle/reference/cli.md @@ -3,6 +3,32 @@ This page is the English reference for the canonical `pchronicle` command line. New commands and scripts should use the syntax documented here. +## Find the command you need + +Start with the shortest path to a useful answer: + +- **Try the product:** `pchronicle onboard query` uses temporary example data + and needs no Dataset path. +- **Check a Dataset:** use `ls` and `analysis overview` before writing SQL. +- **Locate a run or phrase:** use `find --run-id`, `--session-id`, or + `--match`; inspect the returned identity before querying more data. +- **Ask a repeatable question:** use `query --sql` or `query --file` and set + output and resource limits for automation. +- **Expose history:** use `serve` only after the read-only query works; the + [serve guide](../guides/serve.md) explains the lifecycle and shutdown path. + +For a first interaction, copy this sequence: + +```bash +pchronicle onboard query +pchronicle ls ./trajectory-data +pchronicle query ./trajectory-data --sql 'SELECT COUNT(*) FROM dataset.runs' +``` + +The second and third commands require a Dataset you already have. If you do +not have one, stop after `onboard query` and continue with the +[Dataset walkthrough](../get-started.md). + ## Dataset A Dataset is a **path**. pChronicle opens that path as the trajectory store. @@ -280,7 +306,7 @@ pchronicle serve \ Every listener must use a loopback address. A bare single Dataset is mounted as `default`; with several Datasets, use `NAME=DATASET` when a stable mount name is needed. Control requires a mount named `default`. -`--catalog-config FILE` serves a path Directory instead of opening libraries +`--catalog-config FILE` serves a path Directory instead of opening Datasets in the parent process. Pair it with `alias add NAME catalog://127.0.0.1:PORT --ak --sk`. `pchronicle serve catalog issue|grant|revoke` rewrites that file and does not start HTTP; `issue` prints the user secret once. Restart serve after changing @@ -308,3 +334,22 @@ Use [Discover and query](../guides/discover-and-query.md) for the locate-then-SQ workflow, [Import and export](../guides/exchange.md) for interchange, and [Serve Datasets locally](../guides/serve.md) for the read-only server. Snapshot construction is explained in [Snapshot design](../design/catalog.md). + +#### Catalog management + +Catalog configuration contains only users, Datasets, and grants. Management commands create the file when it does not exist. + +```text +pchronicle serve catalog user create --catalog-config FILE NAME +pchronicle serve catalog user list --catalog-config FILE +pchronicle serve catalog user remove --catalog-config FILE NAME +pchronicle serve catalog dataset create --catalog-config FILE NAME URI [OPTIONS] +pchronicle serve catalog dataset list --catalog-config FILE +pchronicle serve catalog dataset show --catalog-config FILE NAME +pchronicle serve catalog dataset remove --catalog-config FILE NAME +pchronicle serve catalog grant --catalog-config FILE USER DATASET --permission PERMISSION... +pchronicle serve catalog revoke --catalog-config FILE USER DATASET --permission PERMISSION... +pchronicle serve catalog grants --catalog-config FILE +``` + +`user create` generates AK/SK and prints the secret once. `dataset create` registers the URI and storage credentials without creating or deleting backend data. `grant` and `revoke` manage `read`, `query`, `analyze`, `write`, and `admin` permissions. diff --git a/docs/src/pchronicle/reference/formats/index.md b/docs/src/en/pchronicle/reference/formats/index.md similarity index 100% rename from docs/src/pchronicle/reference/formats/index.md rename to docs/src/en/pchronicle/reference/formats/index.md diff --git a/docs/src/pchronicle/reference/index.md b/docs/src/en/pchronicle/reference/index.md similarity index 100% rename from docs/src/pchronicle/reference/index.md rename to docs/src/en/pchronicle/reference/index.md diff --git a/docs/src/pchronicle/reference/query-model.md b/docs/src/en/pchronicle/reference/query-model.md similarity index 100% rename from docs/src/pchronicle/reference/query-model.md rename to docs/src/en/pchronicle/reference/query-model.md diff --git a/docs/src/pchronicle/reference/terminology.md b/docs/src/en/pchronicle/reference/terminology.md similarity index 100% rename from docs/src/pchronicle/reference/terminology.md rename to docs/src/en/pchronicle/reference/terminology.md diff --git a/docs/src/project/engineering.md b/docs/src/en/project/engineering.md similarity index 88% rename from docs/src/project/engineering.md rename to docs/src/en/project/engineering.md index 0132cab5..23de28c6 100644 --- a/docs/src/project/engineering.md +++ b/docs/src/en/project/engineering.md @@ -13,16 +13,16 @@ Run these from the repository root. `just --list` shows the full recipe set. | `just test` | Workspace Rust tests through `cargo nextest`, then the Python suite | | `just test ` | One crate or Cargo package (for example `pvisor` or `persisting-pvisor`) | | `just docs-sync` | Install the locked documentation environment | -| `just docs-serve` | Local MkDocs preview with auto-reload | -| `just docs-serve-dirty` | Preview with `--dirtyreload` when auto-reload stalls | +| `just docs-serve` | Local Docusaurus preview with automatic reload when files change | +| `just docs-serve-dirty` | Local Docusaurus preview when automatic reload stalls | | `just docs-build` | Build the static documentation site | -| `just docs-links` | Strict MkDocs build that fails on dead links | -| `just examples` | All product example suites (pVisor, pChronicle, and pPilot) | +| `just docs-links` | Docusaurus production build with broken-link checks | +| `just examples` | pVisor and pChronicle product example suites | | `just gate` | Format, lint, and the full Rust test workspace | | `just dev` | Scoped runtime-crate check; not the full workspace matrix | `just test` uses the debug nextest profile for faster iteration. Pass a Cargo -package name or a short crate alias (`pvisor`, `ppilot`, `pchronicle`, +package name or a short crate alias (`pvisor`, `pchronicle`, `pchronicle-cli`, `agentctl`, `capture`). The no-argument form also runs `just test-py`. @@ -75,7 +75,7 @@ they rebuild the standard library and are intended for focused debugging sessions. For supported behavior, start with [pVisor Guides](../pvisor/guides/index.md), -[pPilot orchestration](../ppilot/guides/orchestrate.md), or +批量 Run 工作流,或 [pChronicle Guides](../pchronicle/guides/index.md), and consult [System Design](../system-design/index.md) for the rationale behind an implementation. diff --git a/docs/src/project/examples.md b/docs/src/en/project/examples.md similarity index 85% rename from docs/src/project/examples.md rename to docs/src/en/project/examples.md index c644003f..a984f97b 100644 --- a/docs/src/project/examples.md +++ b/docs/src/en/project/examples.md @@ -9,7 +9,6 @@ the documented sequence: execute, govern effects, and inspect history. just examples just examples-pvisor just examples-pchronicle -just examples-ppilot ``` ## pVisor @@ -21,13 +20,6 @@ just examples-ppilot | `03-network-isolation` | Explicit proxy policy and its boundary | | `04-gateway-llm-control` | Embedded Gateway routing and capture | -## pPilot - -| Example | What it demonstrates | -|---|---| -| `01-run` | Concurrent `plan()` / `execute()` work written to a durable sink | -| `02-produce` | A Python planner that creates independent, reviewable pVisor Runs | - ## pChronicle | Example | What it demonstrates | @@ -49,11 +41,11 @@ as `jq`. The pVisor filesystem examples additionally require macFUSE or FUSE3. `just examples-pvisor-portable` runs 03/04 without FUSE. Start with `pvisor/01-filesystem-isolation`, continue to changeset management, -then run the pPilot examples when you want many-Run production, and the +then run the orchestration layer examples when you want many-Run production, and the pChronicle examples when you are ready to inspect history. Use [pVisor Guides](../pvisor/guides/index.md) for task explanations, -[pPilot orchestration](../ppilot/guides/orchestrate.md) for many-Run workflows, +orchestration layer orchestration for many-Run workflows, and [pChronicle Guides](../pchronicle/guides/index.md) for Dataset workflows. The examples verify a product workflow; exact command syntax remains in each product's Reference section. diff --git a/docs/src/project/index.md b/docs/src/en/project/index.md similarity index 80% rename from docs/src/project/index.md rename to docs/src/en/project/index.md index 15972ac8..bd45bb17 100644 --- a/docs/src/project/index.md +++ b/docs/src/en/project/index.md @@ -2,7 +2,7 @@ Persisting's public positioning spans model state and Agent history. This section records delivery state, durable decisions, contributor workflows, and -systems outside the current pVisor, pPilot, and pChronicle product path. +systems outside the current pVisor and pChronicle product path. ## Architecture @@ -26,9 +26,9 @@ systems outside the current pVisor, pPilot, and pChronicle product path. Queue and its Python API remain independent of the Agent execution path: -- [Queue guide](../guide/queue.md) -- [Queue API](../api/queue.md) -- [Custom Queue backends](../guide/custom-backends.md) +- Queue guide +- Queue API remains outside the default product documentation +- Custom Queue backends remain outside the default product documentation Historical queue-era design notes are retained outside the published site in the repository's `docs/archive/` directory. diff --git a/docs/src/project/releasing.md b/docs/src/en/project/releasing.md similarity index 100% rename from docs/src/project/releasing.md rename to docs/src/en/project/releasing.md diff --git a/docs/src/pvisor/concepts/agentvisor.md b/docs/src/en/pvisor/concepts/agentvisor.md similarity index 100% rename from docs/src/pvisor/concepts/agentvisor.md rename to docs/src/en/pvisor/concepts/agentvisor.md diff --git a/docs/src/pvisor/concepts/capabilities-and-evidence.md b/docs/src/en/pvisor/concepts/capabilities-and-evidence.md similarity index 100% rename from docs/src/pvisor/concepts/capabilities-and-evidence.md rename to docs/src/en/pvisor/concepts/capabilities-and-evidence.md diff --git a/docs/src/en/pvisor/concepts/index.md b/docs/src/en/pvisor/concepts/index.md new file mode 100644 index 00000000..70c11dde --- /dev/null +++ b/docs/src/en/pvisor/concepts/index.md @@ -0,0 +1,28 @@ +# pVisor concepts + +pVisor is built around an **Agent Run**, not a process, container, or virtual +machine. Read these concepts before comparing providers or interpreting a Run +Bundle. + +:::note When this section helps +Come here after the first Run when a command succeeded but you need to know what +was actually isolated, which changes are still staged, or why two execution +providers make different guarantees. +::: + +Follow these articles in order: + +1. [What is an AgentVisor?](agentvisor.md) explains the product category and + the boundary between an Agent and its runtime. +2. [Run, Attempt, and Effect](run-model.md) defines the stable objects that + survive process and provider changes. +3. [Capabilities and evidence](capabilities-and-evidence.md) explains how a + request becomes an installed mechanism and a claim in the Run Bundle. + +The category article is implementation-neutral. The Run and capability pages +define pVisor's stable user model. Platform mechanisms and current gaps belong +to [pVisor Design](../design/index.md). + +After this section you should be able to read a Run Bundle without confusing a +requested capability with an enforced one. Continue to [practical guides](../guides/index.md) +when you are ready to make a provider or policy decision. diff --git a/docs/src/pvisor/concepts/run-model.md b/docs/src/en/pvisor/concepts/run-model.md similarity index 100% rename from docs/src/pvisor/concepts/run-model.md rename to docs/src/en/pvisor/concepts/run-model.md diff --git a/docs/src/en/pvisor/design/cli.md b/docs/src/en/pvisor/design/cli.md new file mode 100644 index 00000000..7f0321f4 --- /dev/null +++ b/docs/src/en/pvisor/design/cli.md @@ -0,0 +1,101 @@ +# pVisor command model + +The `pvisor` command is the public entry point for one governed Agent Run. Its +interface is organized around four responsibilities: start a Run, inspect its +record, decide what happens to staged changes, and manage reusable environments. +The command line and `RunConfig` describe the same model; a configuration file +is an explicit input, never an implicit project policy. + +## Start with `run` + +The short form is intentionally equivalent to the explicit form: + +```bash +pvisor -- codex +pvisor run --stage ./runs/task-001 -- codex +``` + +Use `--stage` when filesystem changes must remain available for review. Without +a stage, pVisor still records a Run, but there is no durable workspace change set +to apply. The selected host, container, or VM provider records its effective +capabilities and limitations in the Run Bundle. + +Common controls are grouped by purpose: + +| Purpose | Options | Result | +| --- | --- | --- | +| Workspace | `--stage`, `--overlayfs-path`, `--overlayfs-compose` | create a copy-on-write view and retain a changeset | +| Runtime | `--executor host\|container\|vm`, `--rootfs`, `--container-image` | select the execution provider and root filesystem | +| Network | `--overlaynet-deny-all`, `--overlaynet-allow`, `--overlaynet-limit` | request deny, allowlist, or rate-limit policy | +| Gateway | `--gateway-mode`, `--gateway-route`, `--gateway-level` | route and optionally capture model traffic | +| Limits | `--timeout`, `--memory`, `--max-processes`, `--max-open-files` | constrain the Attempt where the provider supports it | +| Configuration | `--spec`, `--name`, `--pass-env` | provide a prepared RunSpec, identity, and explicit environment | + +Provider selection does not change the Run contract. It changes the mechanism +used to enforce each capability dimension, and the resulting evidence is +reported separately. + +## Inspect and decide + +A completed Run remains a record until its staged effects are explicitly +accepted or discarded: + +```bash +pvisor review last +pvisor inspect last -- git status --short +pvisor apply last --path src +pvisor apply last --include 'tests/**' --exclude 'tests/generated/**' +pvisor apply last --all +# or: pvisor drop last +``` + +`review` explains the Run Bundle and staged changes. `inspect` executes a +read-only command against the Run view. `apply` commits a selected path set and +keeps the remainder staged; `drop` discards the stage. Neither operation +rewrites a live Run. A reset creates a new stage generation so stale metadata +cannot replace a newer decision. + +## Checkpoints and forks + +Checkpoints are stopped-consistent filesystem and AgentCtl safe points. They do +not claim to capture process memory: + +```bash +pvisor checkpoint last --name before-experiment +pvisor fork last --checkpoint before-experiment -- codex +``` + +Use checkpoints to preserve a known workspace state before a new attempt. The +checkpoint protocol waits for participating AgentCtl sessions to quiesce, +records the upper layer and lineage, then resumes the Run. + +## Reusable environments + +`env` gives a named stage a stable lifecycle across commands: + +```bash +pvisor env create dev --target ./project +pvisor env exec dev -- make test +pvisor env shell dev +pvisor env inspect dev -- git status --short +pvisor env apply dev --path src +pvisor env drop dev +pvisor env delete dev --force +``` + +An environment is a persistent stage, not a resident VM. `start` and `stop` +control whether new sessions are accepted. `apply` and `drop` advance the stage +generation after a decision. + +## Configuration precedence + +`--spec` accepts TOML `RunConfig` or prepared JSON `RunSpec`. Explicit scalar +options override file values. Repeated list options replace the complete list, +and the command after `--` replaces `run.command`. `--container-image` and +`--rootfs` may infer the matching executor; an explicit `--executor` remains +clearer in automation. + +Keep the public workflow small: start a Run, inspect its evidence, then make an +explicit decision about staged effects. Detailed provider behavior belongs to +[execution environments](../guides/execution.md), while the complete option +surface belongs to the [CLI reference](../reference/cli.md). diff --git a/docs/src/pvisor/design/gateway.md b/docs/src/en/pvisor/design/gateway.md similarity index 100% rename from docs/src/pvisor/design/gateway.md rename to docs/src/en/pvisor/design/gateway.md diff --git a/docs/src/pvisor/design/index.md b/docs/src/en/pvisor/design/index.md similarity index 100% rename from docs/src/pvisor/design/index.md rename to docs/src/en/pvisor/design/index.md diff --git a/docs/src/pvisor/design/isolation.md b/docs/src/en/pvisor/design/isolation.md similarity index 100% rename from docs/src/pvisor/design/isolation.md rename to docs/src/en/pvisor/design/isolation.md diff --git a/docs/src/pvisor/design/overlaynet.md b/docs/src/en/pvisor/design/overlaynet.md similarity index 100% rename from docs/src/pvisor/design/overlaynet.md rename to docs/src/en/pvisor/design/overlaynet.md diff --git a/docs/src/pvisor/get-started.md b/docs/src/en/pvisor/get-started.md similarity index 97% rename from docs/src/pvisor/get-started.md rename to docs/src/en/pvisor/get-started.md index ca66c844..8f3ab8e5 100644 --- a/docs/src/pvisor/get-started.md +++ b/docs/src/en/pvisor/get-started.md @@ -9,7 +9,7 @@ It assumes macOS or Linux. The wheel installs the current Persisting command-line entry points together: ```bash -pip install persisting[lance] +pip install persisting ``` To use the current nightly build instead: @@ -39,7 +39,7 @@ requirements, and component overrides. From a project directory: ```bash -pvisor -- codex +pvisor run --stage ./runs/task-001 -- codex ``` Replace `codex` with another Agent command if needed. `--stage ./runs/task-001` creates a diff --git a/docs/src/pvisor/guides/capture.md b/docs/src/en/pvisor/guides/capture.md similarity index 100% rename from docs/src/pvisor/guides/capture.md rename to docs/src/en/pvisor/guides/capture.md diff --git a/docs/src/pvisor/guides/execution.md b/docs/src/en/pvisor/guides/execution.md similarity index 100% rename from docs/src/pvisor/guides/execution.md rename to docs/src/en/pvisor/guides/execution.md diff --git a/docs/src/pvisor/guides/index.md b/docs/src/en/pvisor/guides/index.md similarity index 71% rename from docs/src/pvisor/guides/index.md rename to docs/src/en/pvisor/guides/index.md index d406e0d4..f0a65db1 100644 --- a/docs/src/pvisor/guides/index.md +++ b/docs/src/en/pvisor/guides/index.md @@ -3,6 +3,12 @@ Follow the lifecycle of one Run, then connect execution to durable history when needed. +:::note Start with the outcome +Each guide below is task-shaped. Begin with the first outcome you need and +keep the Run Bundle open while you work; it is the authoritative record of +which controls were actually installed. +::: + 1. [Choose an execution environment](execution.md). 2. [Review and selectively apply filesystem effects](review-apply.md). 3. [Control network access](network.md). diff --git a/docs/src/pvisor/guides/network.md b/docs/src/en/pvisor/guides/network.md similarity index 100% rename from docs/src/pvisor/guides/network.md rename to docs/src/en/pvisor/guides/network.md diff --git a/docs/src/pvisor/guides/review-apply.md b/docs/src/en/pvisor/guides/review-apply.md similarity index 80% rename from docs/src/pvisor/guides/review-apply.md rename to docs/src/en/pvisor/guides/review-apply.md index 813f0e64..f3de9a5d 100644 --- a/docs/src/pvisor/guides/review-apply.md +++ b/docs/src/en/pvisor/guides/review-apply.md @@ -5,6 +5,13 @@ permission to modify the base project. After the Run, you decide which effects cross that boundary. This workflow applies the filesystem [Effect model](../concepts/run-model.md). +:::note Before you start +You need a project directory and a command that can run your Agent. If you are +starting from scratch, complete [Run your first Agent](../get-started.md) first. +The workflow below assumes you want manual control over when staged changes +enter the base project. +::: + ## Run with a manual stage The short form is: @@ -67,6 +74,12 @@ point and discard the remaining changes: pvisor drop last ``` +:::tip Verify the result +After each batch, compare the staged view with the base project. A successful +`apply` means that the selected dependency-closed batch crossed the boundary; +it does not mean that every remaining Effect was applied. +::: + ## Continue from an accepted point Use a checkpoint before starting another line of work: diff --git a/docs/src/pvisor/guides/sandbox-replay.md b/docs/src/en/pvisor/guides/sandbox-replay.md similarity index 100% rename from docs/src/pvisor/guides/sandbox-replay.md rename to docs/src/en/pvisor/guides/sandbox-replay.md diff --git a/docs/src/en/pvisor/guides/troubleshooting.md b/docs/src/en/pvisor/guides/troubleshooting.md new file mode 100644 index 00000000..39d0e499 --- /dev/null +++ b/docs/src/en/pvisor/guides/troubleshooting.md @@ -0,0 +1,81 @@ +# Troubleshoot a Run + +When a Run does not behave as expected, start with the Run Bundle instead of +repeating the command with stronger flags. The Bundle records the boundary that +was requested, the mechanisms that were installed, and the warnings that limit +what the Run can claim. + +## Start with three read-only checks + +Run these from the project that started the Agent: + +```bash +pvisor status last +pvisor inspect last -- git status --short +pvisor review last +``` + +`status` tells you whether the Run is still active or stopped. `inspect` runs a +read-only command in the Run view, so it helps distinguish a staged change from +a change already present in the base project. `review` shows the durable Run +Bundle and its Evidence before any apply or drop decision. + +## The Agent changed the project directly + +Check whether the command used a stage: + +```bash +pvisor run --stage ./runs/task-001 -- AGENT_COMMAND +``` + +Without a stage, the host executor may still provide safe-best-effort controls, +but there is no staged filesystem Effect to review and selectively apply. If a +staged Run was expected, inspect the recorded stage path and the executor +warnings before rerunning it. + +## A requested capability was not enforced + +Treat a requested option as intent, not evidence. Open the Run Bundle and look +for the effective capability record and its mechanism. Provider support varies +by operating system and executor; a cooperative network proxy, for example, +does not make every ambient connection impossible. + +Continue with [Capabilities and evidence](../concepts/capabilities-and-evidence.md) +and [Execution environments](execution.md) before changing the command. + +## The stage is empty or the wrong files appear + +Check the command's working directory and stage path first: + +```bash +pvisor inspect last -- pwd +pvisor inspect last -- git status --short +``` + +The Agent edits the Run-owned view. A command that writes outside that view may +be reported as an external Effect or may be unavailable to the executor. Keep +the stage path inside the intended project boundary and avoid comparing a +generated Run directory with the project root by filename alone. + +## Capture or Dataset output is missing + +Execution review and trajectory capture are separate decisions. First confirm +that the Run completed and its Bundle is readable. Then check the capture +configuration and the destination Dataset with pChronicle: + +```bash +pchronicle ls ./trajectory-data +pchronicle analysis overview ./trajectory-data +``` + +If the Dataset is not present, read [Capture Agent trajectories](capture.md) +and verify the configured destination before starting another Run. A local Run +Bundle is not automatically a pChronicle Dataset. + +## Before opening an issue + +Include the pVisor version, operating system, executor, the exact command, and +the relevant `status` and `review` output. Remove credentials and private +workspace contents. The most useful report explains which capability was +requested, which mechanism the Bundle records, and where the observed result +differs. diff --git a/docs/src/pvisor/index.md b/docs/src/en/pvisor/index.md similarity index 51% rename from docs/src/pvisor/index.md rename to docs/src/en/pvisor/index.md index 1d308fc4..79010abd 100644 --- a/docs/src/pvisor/index.md +++ b/docs/src/en/pvisor/index.md @@ -8,6 +8,12 @@ before they reach the project. Within Persisting's model-state-to-Agent-history story, pVisor owns the execution boundary and the reviewable record of one Run. +:::tip What you will complete +By the end of the first walkthrough you will have a Run-owned stage, a Run +Bundle that explains the controls actually installed, and a deliberate choice +to apply or drop the resulting filesystem effects. +::: + pVisor does not replace the Agent's reasoning loop. You can keep using Agent CLIs, scripts, and frameworks you already have. @@ -16,7 +22,7 @@ CLIs, scripts, and frameworks you already have. From a project directory: ```bash -pvisor -- codex +pvisor run --stage ./runs/task-001 -- codex pvisor review last pvisor apply last --path src ``` @@ -35,20 +41,31 @@ The exact filesystem and network boundary depends on the platform and chosen executor. pVisor records the effective controls so that a Run is not described as more isolated than it was. -## Choose a task +## Choose your next step + +Start with [Run your first Agent](get-started.md) if this is your first +session. It ends with a reviewed stage and gives you the vocabulary used by +the rest of the documentation. + +When you already know what you need, follow the matching path: -| I want to... | Start with | -| --- | --- | -| Complete one staged Agent Run | [Run your first Agent](get-started.md) | -| Review and selectively accept changes | [Review and apply](guides/review-apply.md) | -| Choose host, container, or VM execution | [Execution layouts](guides/execution.md) | -| Control network access | [Network policy](guides/network.md) | -| Capture trajectory data | [Capture trajectories](guides/capture.md) | -| Look up exact command syntax | [CLI reference](reference/cli.md) | +- **Keep or discard changes:** [Review and apply](guides/review-apply.md) +- **Compare host, container, and VM:** [Execution layouts](guides/execution.md) +- **Constrain network access:** [Network policy](guides/network.md) +- **Publish trajectory events:** [Capture trajectories](guides/capture.md) +- **Look up exact flags:** [CLI reference](reference/cli.md) pVisor's local run-review-apply loop works on its own. pChronicle is optional: use it when you want to retain and query trajectory Datasets after a Run. +## A useful reading order + +1. [Run your first Agent](get-started.md) to see the complete success loop. +2. [Review and apply](guides/review-apply.md) when you need finer control over changes. +3. [Execution layouts](guides/execution.md) when provider boundaries affect your decision. +4. [Capabilities and evidence](concepts/capabilities-and-evidence.md) when you need to interpret a Run Bundle. +5. [CLI reference](reference/cli.md) only when you need an exact flag or output field. + ## Keep reading - [Run your first Agent](get-started.md) diff --git a/docs/src/en/pvisor/reference/cases.md b/docs/src/en/pvisor/reference/cases.md new file mode 100644 index 00000000..4fd5e30b --- /dev/null +++ b/docs/src/en/pvisor/reference/cases.md @@ -0,0 +1,53 @@ +# pVisor case catalog + +The case catalog is the executable index for `pvisor run`. It starts with a +minimal host Run and progresses through staged changes, provider selection, +network policy, Gateway capture, and prepared RunSpecs. + +Use the catalog when you need a reproducible command or a regression target. +Each case documents its prerequisites, command, expected result, and machine +check. The checks are folded into the page so the same examples can be read by +people and executed by `scripts/run-pvisor-cases.py`. + +## Choose a case group + +| Goal | Cases | +| --- | --- | +| First command and Run identity | A01–A03 | +| Limits and runtime controls | A04, B01–B04 | +| Review, apply, and drop changes | C01–C05 | +| Host and VM execution | D01–E06 | +| Native OCI containers | F01–F04 | +| Network and Gateway behavior | G01–H03 | +| RunConfig and RunSpec inputs | I01–I03 | +| Complete combinations | J01–J03 | + +## Run the catalog + +Prepare a workspace and list the available cases: + +```bash +mkdir -p /tmp/pvisor-cases/workspace +cd /tmp/pvisor-cases/workspace +python3 scripts/run-pvisor-cases.py --list +``` + +Run selected cases or produce a report: + +```bash +python3 scripts/run-pvisor-cases.py \ + --pvisor target/release/pvisor \ + --case A01,C01 \ + --keep +python3 scripts/run-pvisor-cases.py \ + --pvisor target/release/pvisor \ + --report target/pvisor-case-report.md +``` + +The runner creates an isolated workspace per case. Replace placeholder paths +and images with local resources when a case requires a Linux rootfs, OCI runtime, +VM image, or Agent executable. Missing prerequisites are reported as failures +so that an environment problem cannot look like a passing case. + +The complete command-by-command catalog is maintained in the localized version +of this page; the executable assertions below each example are language-neutral. diff --git a/docs/src/pvisor/reference/cli.md b/docs/src/en/pvisor/reference/cli.md similarity index 94% rename from docs/src/pvisor/reference/cli.md rename to docs/src/en/pvisor/reference/cli.md index 36f17934..7c5208fb 100644 --- a/docs/src/pvisor/reference/cli.md +++ b/docs/src/en/pvisor/reference/cli.md @@ -6,6 +6,32 @@ Full command examples for Host, OCI VM, and transparent host-rootfs VM are in [Run workloads with pVisor](../guides/execution.md). +## Find the command you need + +Use the smallest surface that matches your next decision: + +- **Run an Agent:** start with [`pvisor run`](../get-started.md), then use + `review`, `inspect`, and `apply` to decide what reaches the project. +- **Understand a boundary:** use `status` and `inspect`, then read the + [execution guide](../guides/execution.md) before changing providers. +- **Keep a workspace:** use `env create` and `env exec` for a reusable staged + environment; use `env apply` or `env drop` to close the loop. +- **Continue a trajectory:** use `replay` only when you already have a + supported trajectory and want a fresh sandbox; begin with the + [replay guide](../guides/sandbox-replay.md). + +If this is your first command, do not start with the full option list below: + +```bash +pvisor run --stage ./runs/task-001 -- codex +pvisor review last +pvisor apply last --path src +``` + +The reference that follows is organized by lifecycle. Options that affect the +same Run are intentionally described together so that a copied command has a +clear verification step. + ```text pvisor ├── run execute one Agent Run diff --git a/docs/src/pvisor/reference/index.md b/docs/src/en/pvisor/reference/index.md similarity index 75% rename from docs/src/pvisor/reference/index.md rename to docs/src/en/pvisor/reference/index.md index 74ceb7d4..83aaed9a 100644 --- a/docs/src/pvisor/reference/index.md +++ b/docs/src/en/pvisor/reference/index.md @@ -1,6 +1,7 @@ # pVisor reference - [`pvisor` command reference](cli.md) +- [Case catalog](cases.md) — runnable scenarios for checking a provider boundary The command references describe the current public surface. For concepts, use [pVisor Concepts](../concepts/index.md); for mechanisms and known gaps, use diff --git a/docs/src/rfcs/0001-storyline-format.md b/docs/src/en/rfcs/0001-storyline-format.md similarity index 100% rename from docs/src/rfcs/0001-storyline-format.md rename to docs/src/en/rfcs/0001-storyline-format.md diff --git a/docs/src/rfcs/0002-events-format.md b/docs/src/en/rfcs/0002-events-format.md similarity index 100% rename from docs/src/rfcs/0002-events-format.md rename to docs/src/en/rfcs/0002-events-format.md diff --git a/docs/src/rfcs/0003-pchronicle-ownership.md b/docs/src/en/rfcs/0003-pchronicle-ownership.md similarity index 100% rename from docs/src/rfcs/0003-pchronicle-ownership.md rename to docs/src/en/rfcs/0003-pchronicle-ownership.md diff --git a/docs/src/rfcs/0004-actf-format.md b/docs/src/en/rfcs/0004-actf-format.md similarity index 100% rename from docs/src/rfcs/0004-actf-format.md rename to docs/src/en/rfcs/0004-actf-format.md diff --git a/docs/src/rfcs/0005-pchronicle-revision-lineage.md b/docs/src/en/rfcs/0005-pchronicle-revision-lineage.md similarity index 100% rename from docs/src/rfcs/0005-pchronicle-revision-lineage.md rename to docs/src/en/rfcs/0005-pchronicle-revision-lineage.md diff --git a/docs/src/rfcs/0006-pchronicle-vortex-backend.md b/docs/src/en/rfcs/0006-pchronicle-vortex-backend.md similarity index 99% rename from docs/src/rfcs/0006-pchronicle-vortex-backend.md rename to docs/src/en/rfcs/0006-pchronicle-vortex-backend.md index da7ee4fd..d91f53a5 100644 --- a/docs/src/rfcs/0006-pchronicle-vortex-backend.md +++ b/docs/src/en/rfcs/0006-pchronicle-vortex-backend.md @@ -135,7 +135,7 @@ Vortex projector 固定输入事实 snapshot 后异步构建。构建、上传 ### 3.6 依赖和构建默认隔离 -Vortex 不进入 pChronicle、pPilot、pVisor、Gateway 或 CLI 的默认依赖图。默认构建、测试和发布 +Vortex 不进入 pChronicle、orchestration layer、pVisor、Gateway 或 CLI 的默认依赖图。默认构建、测试和发布 二进制中不得出现 Vortex crate,除非消费者显式启用或构建独立实验 crate。 ## 4. 范围与非目标 @@ -1226,7 +1226,7 @@ Lance 的 merge、MVCC、maintenance、scalar index 和 Vortex 的 overlay、dir | workspace-wide CI 变慢 | 独立 job/cache;日常使用 targeted package commands | | test matrix 成倍增长 | core semantic tests共享 fixture;后端专项测试独立运行 | -验收要求:默认 `cargo build`、pPilot、pVisor、Gateway 和 pChronicle CLI 的依赖图中不出现任何 +验收要求:默认 `cargo build`、orchestration layer、pVisor、Gateway 和 pChronicle CLI 的依赖图中不出现任何 `vortex-*` package;只有显式构建实验 crate 时才增加编译成本。 ### 18.4 独立 helper 与同进程链接的权衡 @@ -1517,7 +1517,7 @@ codec。它适合作为 benchmark baseline,不作为目标设计。 - 锁定与 Arrow 58.3/DataFusion 54/object_store 0.13.2 兼容的 crates.io release; - 记录 clean build、增量 build、package graph、二进制和 target 增量; - 写最小 nested `TrajectoryBundle`,用 `vx`/Rust reader 检查 layout tree; -- 不修改 Gateway、pPilot、pVisor 或默认 CLI。 +- 不修改 Gateway、orchestration layer、pVisor 或默认 CLI。 ### Phase 1:标准 Vortex 单文件 codec prototype diff --git a/docs/src/rfcs/0007-events-contract-pchronicle-sidecar.md b/docs/src/en/rfcs/0007-events-contract-pchronicle-sidecar.md similarity index 94% rename from docs/src/rfcs/0007-events-contract-pchronicle-sidecar.md rename to docs/src/en/rfcs/0007-events-contract-pchronicle-sidecar.md index 9a1f6055..6e3b88ec 100644 --- a/docs/src/rfcs/0007-events-contract-pchronicle-sidecar.md +++ b/docs/src/en/rfcs/0007-events-contract-pchronicle-sidecar.md @@ -4,14 +4,14 @@ |---|---| | **Status** | Accepted | | **Date** | 2026-08-16 | -| **Components** | `persisting-events` · pVisor · pPilot · pChronicle · Gateway | +| **Components** | `persisting-events` · pVisor · orchestration layer · pChronicle · Gateway | | **Amends** | [RFC-0002 Events](0002-events-format.md) · [RFC-0003 pChronicle ownership](0003-pchronicle-ownership.md) | -| **Related** | [端到端架构](../system-design/architecture.md) · [pPilot architecture](../ppilot/design/orchestration.md) · [轨迹存储](../pchronicle/design/trajectory-storage.md) | +| **Related** | [端到端架构](../system-design/architecture.md) · orchestration architecture · [轨迹存储](../pchronicle/design/trajectory-storage.md) | ## 摘要 Persisting 将运行时事件的逻辑契约从存储实现中拆出,由唯一新增 crate -`persisting-events` 拥有。pVisor、Gateway、pPilot 与 pChronicle 共享该契约,但只有 +`persisting-events` 拥有。pVisor、Gateway、orchestration layer 与 pChronicle 共享该契约,但只有 pChronicle 拥有 Lance、DataFusion、对象存储、Catalog、查询与投影实现。 pVisor 需要持久轨迹或 Attempt registry 时启动 @@ -76,7 +76,7 @@ pVisor 只暴露两个面向用户的落盘选择:格式和目标位置。 | `--record-format lance` | 启动 `pchronicle serve --control 127.0.0.1:0 `,通过 control 协议写 canonical Lance | 旧的 `--chronicle-mode`、`--chronicle-dir` 和 `--pchronicle-binary` 不再是 pVisor -CLI 参数。pVisor 库/配置仍可通过 `chronicle.binary` 选择 sidecar executable;pPilot +CLI 参数。pVisor 库/配置仍可通过 `chronicle.binary` 选择 sidecar executable;orchestration layer 自己的 `--pchronicle-binary` 不属于 pVisor CLI。pVisor 管理自己启动的 child 生命周期; child 退出、握手失败或协议版本不兼容都会显式使持久化路径失败。 @@ -112,7 +112,7 @@ pVisor 到 sidecar 的 append 队列是有界的。入队使用 `try_send`:队 ## 依赖边界 ```text -pVisor / Gateway / pPilot +pVisor / Gateway / orchestration layer │ │ EventRecord + optional control protocol ▼ @@ -148,7 +148,7 @@ pChronicle 的间接依赖,不改变本 RFC 的 ownership,但 SHOULD 在后 | pVisor 继续内嵌 Lance adapter | 执行器与存储引擎生命周期、feature 和依赖重新耦合 | | `EventRecord` 继续由 pChronicle 定义 | producer 为使用基础事件信封被迫依赖存储产品 | | 单独保留 `persisting-pchronicle-client` | 协议包过碎;control 契约可以作为事件边界的可选 feature | -| pVisor 与 pPilot 各写一套 IPC client | 会产生协议漂移、重复认证与错误语义 | +| pVisor 与 orchestration layer 各写一套 IPC client | 会产生协议漂移、重复认证与错误语义 | | pVisor 写 JSONL,pChronicle 以后导入 | 缺少运行期 durable ACK、fencing 与统一 canonical append 语义 | ## 验收条件 diff --git a/docs/src/rfcs/0008-atif-format.md b/docs/src/en/rfcs/0008-atif-format.md similarity index 90% rename from docs/src/rfcs/0008-atif-format.md rename to docs/src/en/rfcs/0008-atif-format.md index d8cdbaac..e0f22e04 100644 --- a/docs/src/rfcs/0008-atif-format.md +++ b/docs/src/en/rfcs/0008-atif-format.md @@ -86,8 +86,8 @@ JSON Pointer。 | --- | --- | | `/schema_version` | `/origin/schema_version` | | `/session_id` | `/session` | -| `/trajectory_id` | `/trajectory`
`/session` | -| `/agent/name` | `/agent/id`
`/agent/name` | +| `/trajectory_id` | `/trajectory`
`/session` | +| `/agent/name` | `/agent/id`
`/agent/name` | | `/agent/version` | `/agent/ver` | | `/agent/model_name` | `/agent/model` | | `/agent/tool_definitions` | `/agent/tools` | @@ -98,32 +98,32 @@ JSON Pointer。 | `/extra` | `/extra` | | `/steps/{s}/step_id` | `/turns/{t}/id` | | `/steps/{s}/timestamp` | `/turns/{t}/ts` | -| `/steps/{s}/source` | `/turns/{t}/src`
`/turns/{t}/kind` | +| `/steps/{s}/source` | `/turns/{t}/src`
`/turns/{t}/kind` | | `/steps/{s}/message` | `/turns/{t}/msg` | | `/steps/{s}/model_name` | `/turns/{t}/model` | | `/steps/{s}/reasoning_effort` | `/turns/{t}/effort` | | `/steps/{s}/reasoning_content` | `/turns/{t}/reason` | -| `/steps/{s}/tool_calls` | `/turns/{t}/tool_calls`
`/turns/{t}/kind` | +| `/steps/{s}/tool_calls` | `/turns/{t}/tool_calls`
`/turns/{t}/kind` | | `/steps/{s}/tool_calls/{c}/tool_call_id` | `/turns/{t}/tool_calls/{c}/tcid` | | `/steps/{s}/tool_calls/{c}/function_name` | `/turns/{t}/tool_calls/{c}/fn` | | `/steps/{s}/tool_calls/{c}/arguments` | `/turns/{t}/tool_calls/{c}/args` | | `/steps/{s}/tool_calls/{c}/result` | `/turns/{t}/tool_calls/{c}/result` | | `/steps/{s}/tool_calls/{c}/extra` | `/turns/{t}/tool_calls/{c}/extra` | -| `/steps/{s}/tool_calls/{c}/extra/duration_ms` | `/turns/{t}/tool_calls/{c}/extra/duration_ms`
`/turns/{t}/tool_calls/{c}/duration_ms` | +| `/steps/{s}/tool_calls/{c}/extra/duration_ms` | `/turns/{t}/tool_calls/{c}/extra/duration_ms`
`/turns/{t}/tool_calls/{c}/duration_ms` | | `/steps/{s}/observation/results` | `/turns/{t}/observation/results` | | `/steps/{s}/metrics` | `/turns/{t}/metrics` | -| `/steps/{s}/metrics/latency_ms` | `/turns/{t}/metrics/latency_ms`
`/turns/{t}/latency_ms` | -| `/steps/{s}/metrics/elapsed_ms` | `/turns/{t}/metrics/elapsed_ms`
`/turns/{t}/latency_ms` | -| `/steps/{s}/metrics/duration_ms` | `/turns/{t}/metrics/duration_ms`
`/turns/{t}/latency_ms` | -| `/steps/{s}/metrics/ttft_ms` | `/turns/{t}/metrics/ttft_ms`
`/turns/{t}/ttft_ms` | +| `/steps/{s}/metrics/latency_ms` | `/turns/{t}/metrics/latency_ms`
`/turns/{t}/latency_ms` | +| `/steps/{s}/metrics/elapsed_ms` | `/turns/{t}/metrics/elapsed_ms`
`/turns/{t}/latency_ms` | +| `/steps/{s}/metrics/duration_ms` | `/turns/{t}/metrics/duration_ms`
`/turns/{t}/latency_ms` | +| `/steps/{s}/metrics/ttft_ms` | `/turns/{t}/metrics/ttft_ms`
`/turns/{t}/ttft_ms` | | `/steps/{s}/extra` | `/turns/{t}/extra` | | `/steps/{s}/llm_call_count` | `/turns/{t}/nllm` | | `/steps/{s}/is_copied_context` | `/turns/{t}/copied` | | `/subagent_trajectories/{c}` | `""` | | `/subagent_trajectories/{c}/session_id` | `/session` | -| `/subagent_trajectories/{c}/trajectory_id` | `/children/{c}`
`/trajectory`
`/session` | -| `/session_id`
`/trajectory_id` | `/parent/psid` | -| `/{unmapped-root}`
`/agent/{unmapped-agent}`
`/steps/{s}/{unmapped-step}`
`/steps/{s}/tool_calls/{c}/{unmapped-tool}`
`/steps/{s}/observation/{unmapped-observation}` | `/unknown_fields/sources/atif/fields/{E(P)}` | +| `/subagent_trajectories/{c}/trajectory_id` | `/children/{c}`
`/trajectory`
`/session` | +| `/session_id`
`/trajectory_id` | `/parent/psid` | +| `/{unmapped-root}`
`/agent/{unmapped-agent}`
`/steps/{s}/{unmapped-step}`
`/steps/{s}/tool_calls/{c}/{unmapped-tool}`
`/steps/{s}/observation/{unmapped-observation}` | `/unknown_fields/sources/atif/fields/{E(P)}` | 条件和规范化规则: diff --git a/docs/src/rfcs/0009-openai-messages-format.md b/docs/src/en/rfcs/0009-openai-messages-format.md similarity index 100% rename from docs/src/rfcs/0009-openai-messages-format.md rename to docs/src/en/rfcs/0009-openai-messages-format.md diff --git a/docs/src/rfcs/0010-agent-corpus-lance-layout.md b/docs/src/en/rfcs/0010-agent-corpus-lance-layout.md similarity index 100% rename from docs/src/rfcs/0010-agent-corpus-lance-layout.md rename to docs/src/en/rfcs/0010-agent-corpus-lance-layout.md diff --git a/docs/src/rfcs/0012-pchronicle-find-query-syntax.md b/docs/src/en/rfcs/0012-pchronicle-find-query-syntax.md similarity index 100% rename from docs/src/rfcs/0012-pchronicle-find-query-syntax.md rename to docs/src/en/rfcs/0012-pchronicle-find-query-syntax.md diff --git a/docs/src/rfcs/0013-pchronicle-warehouse-catalog.md b/docs/src/en/rfcs/0013-pchronicle-warehouse-catalog.md similarity index 100% rename from docs/src/rfcs/0013-pchronicle-warehouse-catalog.md rename to docs/src/en/rfcs/0013-pchronicle-warehouse-catalog.md diff --git a/docs/src/rfcs/0014-compact-jsonl.md b/docs/src/en/rfcs/0014-compact-jsonl.md similarity index 97% rename from docs/src/rfcs/0014-compact-jsonl.md rename to docs/src/en/rfcs/0014-compact-jsonl.md index 22e38566..5119d281 100644 --- a/docs/src/rfcs/0014-compact-jsonl.md +++ b/docs/src/en/rfcs/0014-compact-jsonl.md @@ -133,14 +133,10 @@ reader 遇到其他组合 MUST 拒绝导出。 `offload_threshold = 0` 禁用 offload。否则 raw record 长度大于或等于阈值时 MUST offload。 -descriptor 的 JSONB schema 为: - -```json -{"path":"_offload","key":"<64 lowercase hexadecimal characters>"} -``` +descriptor 的 JSONB schema 在实现中包含 `path` 与 `key` 两个字段。 - `key` MUST 等于 raw record 的 BLAKE3-256 hex digest; -- object MUST 位于 `//`; +- object MUST 位于 `dataset/path/key`; - 相同 key MUST 内容相同,可在多行间共享; - import 发现已有 key 但内容不同 MUST 失败; - export MUST 重新计算 digest,不匹配时 MUST 失败; @@ -194,7 +190,7 @@ pchronicle export \ --output-format compact-jsonl ``` -export MUST: +`export` MUST: 1. 验证 `pchronicle.format=compact-jsonl/v1`; 2. 验证 `filename` 是相对路径且不含 `..`; diff --git a/docs/src/rfcs/index.md b/docs/src/en/rfcs/index.md similarity index 100% rename from docs/src/rfcs/index.md rename to docs/src/en/rfcs/index.md diff --git a/docs/src/system-design/architecture.md b/docs/src/en/system-design/architecture.md similarity index 82% rename from docs/src/system-design/architecture.md rename to docs/src/en/system-design/architecture.md index 617bd161..0b93146b 100644 --- a/docs/src/system-design/architecture.md +++ b/docs/src/en/system-design/architecture.md @@ -12,13 +12,11 @@ commands belong to each product's Reference. | --- | --- | --- | | `persisting-events` contract | storage-independent `EventRecord` identity/envelope and the optional versioned pChronicle control protocol | storage rows, storage engines, query, or projection | | pVisor | one Run, its Attempts, execution environment, capability admission, effects, and runtime evidence | many-Run scheduling or durable history queries | -| pPilot | planning, bounded execution, leases, retry and recovery, reconciliation, result collection, and task-to-Run mapping for many Runs | Agent reasoning, provider enforcement, or trajectory formats and storage | | pChronicle | Agent trajectory storage engine: path identity, Snapshot, canonical events, projections, query, and exchange | starting, scheduling, or controlling a Run | | Runtime provider | one physical execution mechanism | logical Run identity or product policy | Gateway, OverlayFS, and OverlayNet are pVisor runtime mechanisms. They do not -form independent control planes. pPilot scales the pVisor Run model and remains -inside the pVisor product boundary. +form independent control planes. ## Runtime placement and platform boundary @@ -51,8 +49,7 @@ Pinned external Sources │ └─> normalized Dataset views ``` -pPilot is the optional many-Run orchestrator on the governed-execution path. -pVisor can complete its standalone loop with a terminal RunResult, staged +pVisor completes its standalone loop with a terminal RunResult, staged Effects, and a private, versioned Run Bundle. Configured capture is not a pVisor runtime prerequisite. External file and Storyline Sources are pinned and normalized directly; they neither pass through pVisor nor become canonical @@ -112,39 +109,6 @@ Evidence. Artifact references, lineage, staged filesystem Effects, AgentCtl/network/resource Evidence, and the full Run Bundle remain local unless a separate adapter moves them. -## Many-Run path - -```text -Manifest or task stream - → pPilot planner - → stable task_id and run_id - → bounded RunFuture set - → pVisor placement and Attempts - → pPilot checkpoint and reconciliation - → terminal results and task-to-Run mapping -``` - -pPilot schedules Run futures rather than Agent conversations. It persists the -relationship: - -```text -job_id → task_id → run_id → attempt_id / lease_epoch → terminal result -``` - -The system does not promise exactly-once physical execution. Lease fencing, -stable identity, idempotent event ingestion, and terminal compare-and-swap aim -for at-least-once Attempts with one visible Run result. - -With `run --sink`, the default path writes the configured result journal and -uses a pChronicle control child for selected coordination records. When built -with `traj-sink` and invoked with `--traj`, pPilot additionally emits only -terminal `ppilot.result` or `ppilot.failure` records; it does not capture a -general Run trajectory. Delegated pVisor Runs do not receive Chronicle capture -configuration. pPilot owns orchestration decisions and task-to-Run mapping in -all of these modes. Command flags and resume behavior belong to the -[pPilot CLI reference](../ppilot/reference/cli.md) and -[orchestration design](../ppilot/design/orchestration.md). - ## Dataset path Canonical runtime writers and pinned external Sources are independent Source @@ -172,7 +136,6 @@ external file does not convert it into a canonical runtime event Source. | External file or imported Source | discovered content, pinned Source version, normalized representation, and recorded conversion lineage where implemented | completeness of an external task manifest or absence of unreported trajectories | | Gateway capture | requests and responses observed and durably published through the configured Gateway path | absence of traffic that bypassed Gateway | | pVisor Run | Run/Attempt identity, recorded terminal facts, installed mechanisms, observed Effects, and provider-specific Evidence | enforcement a selected provider did not supply | -| pPilot job | persisted task/Run mapping, retry and lease history, and terminal result behavior supported by its selected mode | physical exactly-once execution | Ingestion preserves these boundaries. A normalized representation or Catalog Snapshot does not upgrade the evidence supplied by its Source. @@ -190,11 +153,9 @@ itself. Sidecar flags and mode names belong to the | Failure | Owner | Required behavior | | --- | --- | --- | | Attempt exits or provider disappears | pVisor | finalize evidence; expose failure or create a fenced replacement Attempt | -| Worker lease expires | pPilot | prevent stale terminal publication; reconcile expected and observed state | | sidecar append queue is saturated or closed | pVisor/Gateway producer | reject before submission and report the failure; do not claim durability | | append connection or acknowledgement is lost | producer and pChronicle writer | preserve the write as unknown because it may have committed; do not reuse its sequence as if definitely rejected | | history publication conflicts | pChronicle writer | preserve the previously published Snapshot; surface or retry according to the writer contract | -| control plane restarts | pPilot | reconcile checkpoint, active Attempts, and terminal history facts | | view generation fails | pChronicle | keep canonical facts readable; rebuild the derived view | Recovery never upgrades uncertainty into success. A missing terminal fact, a @@ -204,8 +165,7 @@ lost callback, and an unenforced capability remain visible states. Security is reported per capability dimension. pVisor records requested policy, installed mechanism, provider identity, enforcement result, and observed -effects. pPilot preserves authority generation and lease history across -placement. Configured pChronicle capture stores lifecycle facts and only the +effects. Configured pChronicle capture stores lifecycle facts and only the Evidence carried by Gateway or lifecycle event records; the broader Run Bundle evidence inventory remains local unless moved separately. @@ -237,7 +197,6 @@ See [Security and evidence](security-evidence.md) for evidence levels and | logical runtime event and local Chronicle control protocol | `persisting-events` | [RFC-0007](../rfcs/0007-events-contract-pchronicle-sidecar.md) | | Agent execution and Effect review | pVisor | [pVisor concepts](../pvisor/concepts/index.md) and [guides](../pvisor/guides/index.md) | | provider and runtime mechanisms | pVisor | [pVisor design](../pvisor/design/index.md) | -| many-Run orchestration | pPilot within pVisor | [pPilot design](../ppilot/design/orchestration.md) | | Dataset, facts, and projections | pChronicle | [pChronicle concepts](../pchronicle/concepts/index.md) | | storage and Snapshot implementation | pChronicle | [pChronicle design](../pchronicle/design/index.md) | | stable command syntax and formats | each product | [pVisor reference](../pvisor/reference/index.md) and [pChronicle reference](../pchronicle/reference/index.md) | diff --git a/docs/src/system-design/index.md b/docs/src/en/system-design/index.md similarity index 79% rename from docs/src/system-design/index.md rename to docs/src/en/system-design/index.md index d1a51cf8..61234792 100644 --- a/docs/src/system-design/index.md +++ b/docs/src/en/system-design/index.md @@ -5,8 +5,6 @@ state—parameters and KV caches—and Agent history. This section focuses on th current public product path: - [pVisor](../pvisor/index.md) virtualizes and governs one Agent Run; -- [pPilot](../ppilot/index.md) scales that Run model across many tasks and - remains inside the pVisor execution boundary; - [pChronicle](../pchronicle/index.md) organizes durable trajectory Sources into queryable Datasets. @@ -38,13 +36,17 @@ passing through pVisor or becoming canonical events. Each path retains source-specific guarantees; ingestion does not add Evidence that its Source did not provide. -| Concern | Owner | -| --- | --- | -| One Run's execution boundary | pVisor | -| Model, network, and filesystem runtime drivers | pVisor | -| Many-Run planning, leases, and task-to-Run mapping | pPilot | -| Canonical events, terminal facts, and Dataset history | pChronicle | -| Query, exchange, and revision lineage | pChronicle | +The ownership boundary is deliberately simple: + +- **pVisor owns execution.** It defines one Run's boundary and its model, + network, and filesystem runtime drivers. Its private Run Bundle remains useful + even when no history is captured. +- **pChronicle owns history.** It records canonical events and terminal facts, + then provides Dataset queries, exchange, and revision lineage. + +This separation is a practical choice for users: start with execution or +history independently, and add the capture handoff only when the question you +need to answer crosses both domains. ## Continue by question @@ -52,7 +54,6 @@ not provide. - [Local-to-fleet continuity](local-to-fleet.md) - [Security and evidence model](security-evidence.md) - [pVisor implementation boundaries](../pvisor/design/index.md) -- [pPilot orchestration](../ppilot/design/orchestration.md) - [pChronicle implementation boundaries](../pchronicle/design/index.md) Delivery state is reported in the product Design pages and diff --git a/docs/src/system-design/local-to-fleet.md b/docs/src/en/system-design/local-to-fleet.md similarity index 88% rename from docs/src/system-design/local-to-fleet.md rename to docs/src/en/system-design/local-to-fleet.md index 23a99006..7ab62298 100644 --- a/docs/src/system-design/local-to-fleet.md +++ b/docs/src/en/system-design/local-to-fleet.md @@ -23,6 +23,5 @@ attestation, recovery, and reconciliation without redefining the Run. The stable identity model is defined in [Run, Attempt, and Effect](../pvisor/concepts/run-model.md). Provider admission -belongs to [pVisor isolation](../pvisor/design/isolation.md). Fleet -coordination—placement, leases, and reconciliation—is owned by -[pPilot](../ppilot/design/orchestration.md). +belongs to [pVisor isolation](../pvisor/design/isolation.md). Fleet coordination—placement, leases, and reconciliation—belongs to the +deployment control plane and does not change the logical Run contract. diff --git a/docs/src/system-design/security-evidence.md b/docs/src/en/system-design/security-evidence.md similarity index 94% rename from docs/src/system-design/security-evidence.md rename to docs/src/en/system-design/security-evidence.md index 89b1d6d4..31079f6f 100644 --- a/docs/src/system-design/security-evidence.md +++ b/docs/src/en/system-design/security-evidence.md @@ -2,8 +2,8 @@ Persisting does not compress security into one `safe` or `sandboxed` label. Every Run reports guarantees by capability dimension. pVisor owns admission -and runtime enforcement. pPilot preserves authority generation and lease -history across placement; it does not upgrade a pVisor evidence level. +and runtime enforcement. Placement and recovery mechanisms do not upgrade a +pVisor evidence level. Configured pChronicle capture preserves lifecycle facts and only the Evidence carried by Gateway or lifecycle event records. The full Run Bundle evidence inventory remains local unless moved separately. diff --git a/docs/src/index.md b/docs/src/index.md deleted file mode 100644 index 7b61dbac..00000000 --- a/docs/src/index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -template: home.html -title: Persisting — Persistent Infrastructure for the Agent Era -description: Persisting model state and Agent history—from model parameters and KV caches to Agent trajectories. -hide: toc ---- - - diff --git a/docs/src/index.zh.md b/docs/src/index.zh.md deleted file mode 100644 index cf0910af..00000000 --- a/docs/src/index.zh.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -template: home.html -title: Persisting — Agent 时代的持久化基础设施 -description: 从模型参数、KV Cache 到 Agent 轨迹,持久化模型状态与 Agent 历史。 -hide: toc ---- - - diff --git a/docs/src/installation.md b/docs/src/installation.md deleted file mode 100644 index 0c2d3142..00000000 --- a/docs/src/installation.md +++ /dev/null @@ -1,127 +0,0 @@ -# Installation - -Persisting is distributed as a Python wheel containing both the Python package -and its matched CLI component set: - -The public entry points documented here focus on controlled Agent execution and -durable trajectory history. - -| Distribution | Contents | Use case | -|---|---|---| -| Host wheel | Python package plus the `pvisor`, `ppilot`, and `pchronicle` entry points | Python APIs, controlled Agent execution, Run orchestration, and trajectory data workflows | - -## Requirements - -- Python 3.10+ -- Pulsing, installed automatically as a dependency -- macOS or Linux for the CLI -- macOS: macFUSE 5 for host-process `pvisor run --safe` (not required by libkrun Runs) - -Install the macOS filesystem runtime once before the first safe Run: - -```bash -brew install --cask macfuse -``` - -On Apple Silicon, enable the macFUSE system extension when macOS prompts for -approval. Plain non-staged host Runs remain available without macFUSE, but -`--safe` fails closed rather than writing directly to the project workspace. -The libkrun OCI-image executor keeps its cached rootfs immutable through its -built-in Overlay virtio-fs backend and does not require macFUSE. - -## Python package - -```bash -# Recommended: install with Lance support -pip install persisting[lance] - -# Minimal install without Lance, for custom backends only -pip install persisting -``` - -Both installation commands install the matching `pvisor`, `ppilot`, and -`pchronicle` entry points into the Python environment's scripts directory. - -### Nightly wheel - -The rolling [`nightly`](https://github.com/DeepLink-org/Persisting/releases/tag/nightly) -release is updated daily and on pushes to `main`: - -```bash -curl -fsSL https://raw.githubusercontent.com/DeepLink-org/Persisting/main/scripts/install-nightly.sh | bash -``` - -### From source - -```bash -git clone https://github.com/DeepLink-org/Persisting.git -cd Persisting -pip install -e ".[lance]" -``` - -## CLI component set - -The wheel bundles matched components. Use `pvisor` for one Run and its execution -environment, `ppilot` for bounded collections of Runs, and `pchronicle` for -Dataset catalog, SQL, analysis, exchange, and read-only serving. - -`ppilot` is also installed from source through `just install-cli`. - -### Cargo installation from source - -```bash -git clone https://github.com/DeepLink-org/Persisting.git -cd Persisting -just install-cli -``` - -This alternative installs matching command-line components into the Cargo -binary directory without installing the Python package. - -### Component overrides - -Set `PERSISTING_PVISOR_BIN` to select an explicit pVisor binary. - -## Container and libkrun executors - -Container execution still requires an explicitly configured compatible Linux -pVisor guest binary. The `vm` executor instead statically includes libkrun and -its Linux guest init in the host `pvisor` binary. Release wheels also install -libkrunfw beside `pvisor`. Source builds automatically download the pinned -official release into the user cache and verify its SHA-256; macOS compiles the -downloaded kernel bundle with `/usr/bin/cc`. `--vm-library-dir` may still point -at a system installation. Building pVisor from source on macOS also requires -Zig (`brew install zig`) to cross-compile libkrun's embedded Linux guest init. - -Use `pvisor run --image ubuntu:latest -- COMMAND` to pull and run a public OCI -image without Docker or Podman. `ubuntu:latest` is also the default for -`--executor vm`; `--image-store DIR` overrides the local content-addressed -cache. `--overlayfs-target` selects the guest workspace path. `--vm-rootfs DIR` -remains available for an explicit prepared Linux rootfs. Linux hosts use KVM; -Apple Silicon macOS hosts use HVF through the same executor and configuration. - -## Verify the installation - -```python -import persisting -print(persisting.__version__) -``` - -```bash -pvisor --version -pchronicle --help -``` - -## Dependencies - -| Package | Version | Required | Purpose | -|---|---|---|---| -| `pulsing` | >=0.1.0 | Yes | Distributed actor runtime for the control plane | -| `lance` | >=0.9.0 | Optional (`[lance]`) | Lance columnar storage | -| `pyarrow` | >=14.0.0 | Optional (`[lance]`) | Apache Arrow | - -## Next steps - -- [Run your first Agent](pvisor/get-started.md) — complete the run, review, and selective-apply loop -- [Choose a workflow](overview.md) — start with pVisor or pChronicle -- [Explore pVisor](pvisor/index.md) or [pChronicle](pchronicle/index.md) by product diff --git a/docs/src/installation.zh.md b/docs/src/installation.zh.md deleted file mode 100644 index 6c7beee4..00000000 --- a/docs/src/installation.zh.md +++ /dev/null @@ -1,118 +0,0 @@ -# 安装指南 - -Persisting 通过 Python wheel 发布,wheel 同时包含 Python 包和版本匹配的 CLI 组件集: - -本文记录的公开入口聚焦可控 Agent 执行与持久轨迹历史。 - -| 安装物 | 内容 | 用途 | -|---|---|---| -| 宿主机 wheel | Python 包以及 `pvisor`、`ppilot`、`pchronicle` 入口 | Python API、可控 Agent 执行、Run 编排与轨迹数据工作流 | - -## 环境要求 - -- Python 3.10+ -- Pulsing(作为依赖自动安装) -- CLI 需要 macOS 或 Linux -- macOS:宿主进程模式的 `pvisor run --safe` 需要 macFUSE 5(libkrun Run 不需要) - -首次执行 safe Run 前安装一次 macOS 文件系统运行时: - -```bash -brew install --cask macfuse -``` - -Apple Silicon 需要在 macOS 提示时允许 macFUSE system extension。普通非 staged 的 -host Run 不依赖 macFUSE;`--safe` 在挂载能力不可用时会 fail closed,不会退化为直接 -写项目目录。libkrun OCI 镜像 executor 使用内置 Overlay virtio-fs 保证缓存 rootfs -不被修改,不依赖 macFUSE。 - -## Python 包 - -```bash -# 推荐:带 Lance 支持 -pip install persisting[lance] - -# 最小安装(不含 Lance,仅用于自定义后端) -pip install persisting -``` - -上面两种安装命令都会把版本匹配的 `pvisor`、`ppilot` 与 `pchronicle` 入口安装到 -Python 环境的 scripts 目录。 - -### Nightly wheel - -每日 / `main` 推送会滚动更新 GitHub Release 标签 [`nightly`](https://github.com/DeepLink-org/Persisting/releases/tag/nightly): - -```bash -curl -fsSL https://raw.githubusercontent.com/DeepLink-org/Persisting/main/scripts/install-nightly.sh | bash -``` - -### 从源码 - -```bash -git clone https://github.com/DeepLink-org/Persisting.git -cd Persisting -pip install -e ".[lance]" -``` - -## CLI 组件集 - -wheel 内是一组版本匹配的组件:单 Run 与执行环境使用 `pvisor`,成组 Run 的有界编排使用 -`ppilot`,Dataset 目录、SQL、分析、格式交换与只读服务使用 `pchronicle`。 - -`ppilot` 也可通过 `just install-cli` 从源码安装。 - -### 通过 Cargo 从源码安装 - -```bash -git clone https://github.com/DeepLink-org/Persisting.git -cd Persisting -just install-cli -``` - -这是不安装 Python 包的替代路径,会把版本匹配的命令行组件安装到 Cargo bin 目录。 - -### 组件覆盖 - -`PERSISTING_PVISOR_BIN` 可显式指定 pVisor 二进制路径。 - -## Container/libkrun executor - -Container executor 仍需显式配置兼容的 Linux guest pVisor。`vm` executor 则把 -libkrun 和 Linux guest init 静态链接进宿主 `pvisor`;发行 wheel 还会把 libkrunfw -安装在 `pvisor` 同目录。源码构建会自动下载固定版本的官方 release,校验 SHA-256 -后放入用户缓存;macOS 使用 `/usr/bin/cc` 把其中的 kernel bundle 编译成 dylib。 -仍可用 `--vm-library-dir` 显式指向系统 libkrunfw。在 macOS 上从源码构建 pVisor -还需安装 Zig(`brew install zig`),用于交叉编译 libkrun 内嵌的 Linux guest init。 - -`pvisor run --image ubuntu:latest -- COMMAND` 可在不安装 Docker 或 Podman 的情况下 -直接拉取并运行公开 OCI 镜像;`--executor vm` 未指定 rootfs 时也默认使用 -`ubuntu:latest`。`--image-store DIR` 可覆盖本地内容寻址缓存目录, -`--overlayfs-target` 用于指定 guest 工作路径。`--vm-rootfs DIR` 仍可指定预先准备的 Linux 根文件 -系统。Linux 宿主使用 KVM,Apple Silicon macOS 宿主使用 HVF。 - -## 验证 - -```python -import persisting -print(persisting.__version__) -``` - -```bash -pvisor --version -pchronicle --help -``` - -## 依赖 - -| 包名 | 版本 | 必需 | 说明 | -|------|------|------|------| -| `pulsing` | >=0.1.0 | 是 | 分布式 actor 运行时(控制面) | -| `lance` | >=0.9.0 | 可选 (`[lance]`) | Lance 列式存储 | -| `pyarrow` | >=14.0.0 | 可选 (`[lance]`) | Apache Arrow | - -## 下一步 - -- [运行第一个 Agent](pvisor/get-started.md) — 完成 run、review 与选择性 apply 闭环 -- [选择工作流](overview.md) — 从 pVisor 或 pChronicle 开始 -- 按产品进入 [pVisor](pvisor/index.md) 或 [pChronicle](pchronicle/index.md) diff --git a/docs/src/api/index.md b/docs/src/internal/api/index.md similarity index 100% rename from docs/src/api/index.md rename to docs/src/internal/api/index.md diff --git a/docs/src/api/index.zh.md b/docs/src/internal/api/index.zh.md similarity index 100% rename from docs/src/api/index.zh.md rename to docs/src/internal/api/index.zh.md diff --git a/docs/src/api/queue.md b/docs/src/internal/api/queue.md similarity index 100% rename from docs/src/api/queue.md rename to docs/src/internal/api/queue.md diff --git a/docs/src/guide/custom-backends.md b/docs/src/internal/guide/custom-backends.md similarity index 100% rename from docs/src/guide/custom-backends.md rename to docs/src/internal/guide/custom-backends.md diff --git a/docs/src/guide/custom-backends.zh.md b/docs/src/internal/guide/custom-backends.zh.md similarity index 100% rename from docs/src/guide/custom-backends.zh.md rename to docs/src/internal/guide/custom-backends.zh.md diff --git a/docs/src/guide/queue.md b/docs/src/internal/guide/queue.md similarity index 100% rename from docs/src/guide/queue.md rename to docs/src/internal/guide/queue.md diff --git a/docs/src/guide/queue.zh.md b/docs/src/internal/guide/queue.zh.md similarity index 100% rename from docs/src/guide/queue.zh.md rename to docs/src/internal/guide/queue.zh.md diff --git a/docs/src/ppilot/design/orchestration.md b/docs/src/internal/ppilot/design/orchestration.md similarity index 100% rename from docs/src/ppilot/design/orchestration.md rename to docs/src/internal/ppilot/design/orchestration.md diff --git a/docs/src/ppilot/design/orchestration.zh.md b/docs/src/internal/ppilot/design/orchestration.zh.md similarity index 100% rename from docs/src/ppilot/design/orchestration.zh.md rename to docs/src/internal/ppilot/design/orchestration.zh.md diff --git a/docs/src/ppilot/get-started.md b/docs/src/internal/ppilot/get-started.md similarity index 97% rename from docs/src/ppilot/get-started.md rename to docs/src/internal/ppilot/get-started.md index b538a8ef..258e0598 100644 --- a/docs/src/ppilot/get-started.md +++ b/docs/src/internal/ppilot/get-started.md @@ -8,7 +8,7 @@ executed by multiple workers, with terminal results written to a durable sink. `ppilot` ships in the same Python wheel as `pvisor` and `pchronicle`: ```bash -pip install persisting[lance] +pip install persisting ppilot --version ``` diff --git a/docs/src/ppilot/get-started.zh.md b/docs/src/internal/ppilot/get-started.zh.md similarity index 97% rename from docs/src/ppilot/get-started.zh.md rename to docs/src/internal/ppilot/get-started.zh.md index feb5bd7b..9f622a49 100644 --- a/docs/src/ppilot/get-started.zh.md +++ b/docs/src/internal/ppilot/get-started.zh.md @@ -8,7 +8,7 @@ `ppilot` 与 `pvisor`、`pchronicle` 装在同一个 Python wheel 里: ```bash -pip install persisting[lance] +pip install persisting ppilot --version ``` diff --git a/docs/src/ppilot/guides/orchestrate.md b/docs/src/internal/ppilot/guides/orchestrate.md similarity index 100% rename from docs/src/ppilot/guides/orchestrate.md rename to docs/src/internal/ppilot/guides/orchestrate.md diff --git a/docs/src/ppilot/guides/orchestrate.zh.md b/docs/src/internal/ppilot/guides/orchestrate.zh.md similarity index 100% rename from docs/src/ppilot/guides/orchestrate.zh.md rename to docs/src/internal/ppilot/guides/orchestrate.zh.md diff --git a/docs/src/ppilot/index.md b/docs/src/internal/ppilot/index.md similarity index 100% rename from docs/src/ppilot/index.md rename to docs/src/internal/ppilot/index.md diff --git a/docs/src/ppilot/index.zh.md b/docs/src/internal/ppilot/index.zh.md similarity index 100% rename from docs/src/ppilot/index.zh.md rename to docs/src/internal/ppilot/index.zh.md diff --git a/docs/src/ppilot/reference/cli.md b/docs/src/internal/ppilot/reference/cli.md similarity index 100% rename from docs/src/ppilot/reference/cli.md rename to docs/src/internal/ppilot/reference/cli.md diff --git a/docs/src/ppilot/reference/cli.zh.md b/docs/src/internal/ppilot/reference/cli.zh.md similarity index 100% rename from docs/src/ppilot/reference/cli.zh.md rename to docs/src/internal/ppilot/reference/cli.zh.md diff --git a/docs/src/overview.md b/docs/src/overview.md deleted file mode 100644 index f1dd8391..00000000 --- a/docs/src/overview.md +++ /dev/null @@ -1,101 +0,0 @@ -# From model state to Agent history - -**Persisting is persistent infrastructure for the Agent era.** It connects the -state an Agent needs to work with the history needed to understand what it did. - -## One persistence continuum - -| Layer | Examples | Why persistence matters | -| --- | --- | --- | -| Model state | model parameters and checkpoints | load, share, version, and recover model state | -| Inference state | KV caches and reusable intermediate state | avoid repeated work across requests and Runs | -| Agent history | trajectories, tool calls, execution records, and effects | review, query, compare, and reproduce behavior | - -These layers do not have to use one physical format or one API. The shared -idea is durable identity and explicit lifecycle: reusable state should survive -the process that created it, and completed work should remain inspectable. - -## Current user workflows - -The current product is the path from execution to queryable history. Choose the -entry point that matches the task in front of you. - -| Command | Start here when you need to | Durable result | -| --- | --- | --- | -| `pvisor` | run one existing Agent with explicit workspace and runtime controls | a Run result, private Run Bundle, and staged filesystem changes | -| `pchronicle` | inspect or exchange Agent trajectory data | a browsable and queryable Dataset view | - -## Command ownership - -| Command | Primary responsibility | -|---|---| -| `pvisor` | One Run, environments, review, checkpoints, apply/drop | -| `ppilot` | Bounded collections of Runs: planning, concurrency, recovery, sinks | -| `pchronicle` | Dataset catalog, SQL, built-in analysis, find, import/export, read-only serving | - -pVisor works without pChronicle, and pChronicle can read external trajectories -that never passed through pVisor. - -## Workflow 1: run and review one Agent - -Use pVisor when the immediate question is: “How do I let this Agent work while -keeping its filesystem changes reviewable?” - -```bash -pvisor run --safe codex -pvisor review last -pvisor apply last --all # or: pvisor drop last -``` - -The Agent works in a Run-owned stage. `review` shows the staged changes; -`apply` accepts selected changes into the base workspace; `drop` discards them. -The exact filesystem and network boundary depends on the selected execution -provider and is recorded with the Run. - -[Complete the first pVisor Run →](pvisor/get-started.md) - -## Workflow 2: explore Agent history - -Use pChronicle when you have trajectory data and need to browse, query, analyze, -import, export, or serve it. - -```bash -pchronicle onboard -pchronicle onboard query -``` - -The walkthrough creates temporary example Datasets. A Dataset can be a local -path, an object-store URI prefix, or a configured alias. It may contain data -captured by Persisting or imported from supported external formats. - -[Explore the first Dataset →](pchronicle/get-started.md) - -## The throughline: from execution to queryable history - -Configured capture connects the two workflows into one path: - -```text -pVisor Run ── configured Gateway/lifecycle capture ──> pChronicle Dataset - -External trajectory files ───────────────────────────> pChronicle Dataset -``` - -The configured handoff publishes Gateway trajectory events and selected -lifecycle records. It does not automatically publish the full private Run -Bundle, all staged effects, or every piece of provider-specific evidence. -Likewise, importing an external trajectory does not retroactively add execution -controls that were never recorded. See -[Capture Agent Trajectories](pvisor/guides/capture.md). - -Each product also works on its own: pVisor can finish a Run without pChronicle, -and pChronicle can query Datasets that never came from pVisor. - -![Current Persisting workflows and the execution-to-history throughline](assets/diagrams/persisting/system-products.svg) - -## Where to go next - -- [Install Persisting](installation.md) -- [Choose a pVisor execution environment](pvisor/guides/execution.md) -- [Review and selectively apply Agent changes](pvisor/guides/review-apply.md) -- [Read the pChronicle CLI guide](pchronicle/reference/cli.md) -- [Inspect architecture and delivery boundaries](system-design/index.md) diff --git a/docs/src/overview.zh.md b/docs/src/overview.zh.md deleted file mode 100644 index e8eb8099..00000000 --- a/docs/src/overview.zh.md +++ /dev/null @@ -1,92 +0,0 @@ -# 从模型状态到 Agent 历史 - -**Persisting 是 Agent 时代的持久化基础设施。** 它连接 Agent 工作所需的状态,以及理解 -Agent 做过什么所需的历史。 - -## 一条持久化主线 - -| 层次 | 典型数据 | 为什么需要持久化 | -| --- | --- | --- | -| 模型状态 | 模型参数与 checkpoint | 加载、共享、版本管理和恢复模型状态 | -| 推理状态 | KV Cache 与可复用中间状态 | 避免在请求和 Run 之间重复计算 | -| Agent 历史 | 轨迹、tool call、执行记录与 effect | 审查、查询、比较和复现行为 | - -这些层次不要求使用同一种物理格式或同一个 API。共同点是持久身份与显式生命周期:需要复用的 -状态不应随创建它的进程消失,已经完成的工作应当继续可检查。 - -## 当前用户工作流 - -当前产品是从执行到可查询历史的路径。直接选择当前任务对应的入口。 - -| 命令 | 适用任务 | 持久产物 | -| --- | --- | --- | -| `pvisor` | 用明确的 workspace 和 runtime 控制运行一个现有 Agent | Run result、私有 Run Bundle 和 staged 文件修改 | -| `pchronicle` | 检查或交换 Agent 轨迹数据 | 可浏览、可查询的 Dataset 视图 | - -## 命令分工 - -| 命令 | 主要职责 | -|---|---| -| `pvisor` | 单个 Run、执行环境、审查、检查点、apply/drop | -| `ppilot` | 成组的 Run:规划、并发、恢复、结果汇聚 | -| `pchronicle` | Dataset 目录、SQL、内建分析、find、导入导出、只读服务 | - -pVisor 不依赖 pChronicle 也能独立工作;pChronicle 可以读取从未经过 pVisor 的外部轨迹。 - -## 工作流一:运行并审查一个 Agent - -当问题是“怎样让 Agent 工作,同时让它的文件修改保持可审查”时,使用 pVisor: - -```bash -pvisor run --safe codex -pvisor review last -pvisor apply last --all # 或:pvisor drop last -``` - -Agent 在 Run 独占的 stage 中工作。`review` 查看 staged 修改;`apply` 把选中的修改接受到 -基础工作区;`drop` 放弃修改。具体文件系统和网络边界取决于所选 execution provider, -并随 Run 一起记录。 - -[完成第一个 pVisor Run →](pvisor/get-started.md) - -## 工作流二:查看 Agent 历史 - -已经有轨迹数据,需要浏览、查询、分析、导入、导出或提供本地服务时,使用 pChronicle: - -```bash -pchronicle onboard -pchronicle onboard query -``` - -本演练会创建临时示例 Dataset。Dataset 可以是本地路径、对象存储 URI prefix 或配置好的 -alias;其中的数据既可以由 Persisting capture,也可以来自支持的外部格式。 - -[查看第一个 Dataset →](pchronicle/get-started.md) - -## 贯通路径:从执行到可查询历史 - -配置 capture 后,两条工作流连成一条路径: - -```text -pVisor Run ── configured Gateway/lifecycle capture ──> pChronicle Dataset - -External trajectory files ───────────────────────────> pChronicle Dataset -``` - -当前交接会发布 Gateway 轨迹 event 和选定的 lifecycle record,但不会自动发布完整的私有 -Run Bundle、全部 staged effect 或所有 provider 特定 evidence。类似地,导入外部轨迹不会 -事后补造原始记录中从未存在的执行控制。详见 -[捕获 Agent 轨迹](pvisor/guides/capture.md)。 - -两者仍可独立使用:pVisor 可以在没有 pChronicle 的情况下完成一次 Run;pChronicle 也可以 -查询从未经过 pVisor 的 Dataset。 - -![Persisting 当前工作流与从执行到历史的贯通路径](assets/diagrams/persisting/system-products.svg) - -## 下一步 - -- [安装 Persisting](installation.md) -- [选择 pVisor 执行环境](pvisor/guides/execution.md) -- [审查并选择性应用 Agent 修改](pvisor/guides/review-apply.md) -- [查阅 pChronicle CLI 指南](pchronicle/reference/cli.md) -- [检查架构与交付边界](system-design/index.md) diff --git a/docs/src/pages/404.js b/docs/src/pages/404.js new file mode 100644 index 00000000..af0ad8d1 --- /dev/null +++ b/docs/src/pages/404.js @@ -0,0 +1,28 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; +import styles from './index.module.css'; + +export default function NotFound() { + return ( + +
+
+

404 / PAGE NOT FOUND

+

The path changed. The workflow did not.

+

+ Return to the documentation map, search the published content, or start + with one of Persisting's two product paths. +

+
+ Start here + Search docs + pVisor + pChronicle +
+
+
+
+ ); +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js new file mode 100644 index 00000000..b4cb1b9a --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,37 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import CodeBlock from '@theme/CodeBlock'; +import clsx from 'clsx'; +import styles from './index.module.css'; + +const capabilities = [ + ['Governed execution', 'Run an Agent inside a provider-aware, reviewable workspace.'], + ['Reviewable changes', 'Inspect a complete stage before any file reaches the project.'], + ['Capability evidence', 'See which filesystem, network, and process controls actually applied.'], + ['Trajectory Datasets', 'Turn captured or imported history into normalized, queryable views.'], + ['Open formats', 'Exchange supported trajectory formats while preserving Source lineage.'], + ['Local first', 'Start locally and move to object storage when the workflow is ready.'], +]; + +export default function Home() { + const productDiagram = useBaseUrl('/img/diagrams/persisting/system-products.svg'); + return +
+

PERSISTENT INFRASTRUCTURE FOR AGENTS

+

Persistent Infrastructure for the Agent Era

+

Run Agents inside a reviewable execution boundary. Preserve accepted decisions and resulting history as a queryable Dataset.

+
Get startedRead the system design
+
+
+
+

GOVERNED EXECUTION

pVisor

Give an Agent a staged workspace and an explicit execution provider. Inspect Evidence before any Effect reaches the project.

You finish with a reviewable Run Bundle and controlled changes.

Start a Run →
+

DURABLE HISTORY

pChronicle

Pin, normalize, query, and exchange Agent trajectory Sources, whether they came from pVisor or elsewhere.

You finish with a queryable Dataset and traceable Source lineage.

Explore Datasets →
+
+

One boundary, two durable paths

Execution and history stay independently useful. Connect them only when the workflow needs a durable handoff.

pVisor execution and pChronicle history paths
01

Run

Give the Agent a staged workspace and record the effective controls.

02

Review

Inspect Evidence and Effects before deciding what crosses into the project.

03

Remember

Capture selected lifecycle facts and trajectory events as a queryable Dataset.

+

Everything needed for a durable Agent workflow

{capabilities.map(([title, body]) =>

{title}

{body}

)}
+

From install to a useful result

Run the smallest complete path first. Keep the output, then choose the guide that answers your next question.

01

Install

{"pip install persisting"}
02

Run or explore

{"pvisor run --stage ./runs/task-001 -- codex\n# or: pchronicle onboard"}
03

Review or query

{"pvisor review last\n# or: pchronicle onboard query"}
Run your first AgentExplore a Dataset
+
+
; +} diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css new file mode 100644 index 00000000..cb68cc80 --- /dev/null +++ b/docs/src/pages/index.module.css @@ -0,0 +1,2 @@ +.hero { position: relative; min-height: 40rem; padding: 7rem 0 5rem; text-align: left; overflow: hidden; display: flex; align-items: center; } +.eyebrow { color: #5eead4; font-size: .75rem; font-weight: 700; letter-spacing: .16em; } diff --git a/docs/src/pages/zh.js b/docs/src/pages/zh.js new file mode 100644 index 00000000..c3453619 --- /dev/null +++ b/docs/src/pages/zh.js @@ -0,0 +1,36 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import CodeBlock from '@theme/CodeBlock'; +import styles from './index.module.css'; + +const capabilities = [ + ['受治理执行', '在了解 Provider 边界、可审查的 workspace 中运行 Agent。'], + ['可审查修改', '在文件进入真实项目之前,先检查完整 stage。'], + ['Capability Evidence', '查看实际生效的文件系统、网络和进程控制。'], + ['轨迹 Dataset', '把捕获或导入的历史转换为规范化、可查询的视图。'], + ['开放格式', '交换支持的轨迹格式,同时保留 Source lineage。'], + ['本地优先', '从本地路径开始,准备好后再迁移到对象存储。'], +]; + +export default function ChineseHome() { + const productDiagram = useBaseUrl('/img/diagrams/persisting/system-products.svg'); + return +
+

面向 AGENT 的持久化基础设施

+

Agent 时代的持久化基础设施

+

在可审查的执行边界中运行 Agent,保留经过确认的决策,并将产生的历史保存为可查询 Dataset。

+
开始使用阅读系统设计
+
+
+
+

受治理执行

pVisor

为 Agent 提供 staged workspace 与明确的执行 Provider。在 Effect 进入项目之前先查看 Evidence。

最终得到可审查的 Run Bundle,并控制哪些修改进入项目。

开始一次 Run →
+

持久历史

pChronicle

固定、规范化、查询和交换 Agent 轨迹 Source,无论它是否来自 pVisor。

最终得到可查询 Dataset,并保留清晰的 Source lineage。

探索 Dataset →
+
+

一条边界,两条持久化路径

执行与历史各自独立可用,只有在工作流需要持久交接时才把它们连接起来。

pVisor 执行路径与 pChronicle 历史路径
01

运行

为 Agent 提供 staged workspace,并记录实际生效的控制机制。

02

审查

在决定哪些修改进入项目之前,先检查 Evidence 与 Effect。

03

留存

把选定的生命周期事实与轨迹事件捕获为可查询 Dataset。

+

一条持久化 Agent 工作流所需的一切

{capabilities.map(([title, body]) =>

{title}

{body}

)}
+

从安装到得到结果

先完成最小闭环,保留输出,再按下一个问题选择深入指南。

01

安装

{"pip install persisting"}
02

运行或探索

{"pvisor run --stage ./runs/task-001 -- codex\n# 或:pchronicle onboard"}
03

审查或查询

{"pvisor review last\n# 或:pchronicle onboard query"}
运行第一个 Agent探索一个 Dataset
+
+
; +} diff --git a/docs/src/pchronicle/concepts/index.md b/docs/src/pchronicle/concepts/index.md deleted file mode 100644 index 8193df05..00000000 --- a/docs/src/pchronicle/concepts/index.md +++ /dev/null @@ -1,14 +0,0 @@ -# pChronicle concepts - -pChronicle is built around a **Dataset**, which is a path. Read these concepts -before querying history or integrating storage. - -| Question | Concept article | -| --- | --- | -| How is trajectory data addressed and pinned? | [Dataset, Source, and Snapshot](dataset-and-source.md) | -| What is recorded versus the views used to inspect it? | [Recorded data, views, and versions](facts-and-projections.md) | - -Storage mechanisms and current implementation belong to -[pChronicle Design](../design/index.md). Continue with -[common workflows](../guides/index.md) or the -[CLI reference](../reference/cli.md). diff --git a/docs/src/pchronicle/concepts/index.zh.md b/docs/src/pchronicle/concepts/index.zh.md deleted file mode 100644 index 9b25a997..00000000 --- a/docs/src/pchronicle/concepts/index.zh.md +++ /dev/null @@ -1,11 +0,0 @@ -# pChronicle 核心概念 - -pChronicle 围绕 **Dataset** 构建,Dataset 就是 path。查询历史或集成存储前,先理解这些概念。 - -| 问题 | 概念文章 | -| --- | --- | -| 轨迹数据如何寻址并固定版本? | [Dataset、Source 与 Snapshot](dataset-and-source.md) | -| 记录事实与查看它所用的视图有何区别? | [记录数据、查询视图与派生版本](facts-and-projections.md) | - -存储机制与当前实现属于 [pChronicle Design](../design/index.md)。接下来可以进入 -[常见工作流](../guides/index.md) 或 [命令行参考](../reference/cli.md)。 diff --git a/docs/src/pvisor/concepts/index.md b/docs/src/pvisor/concepts/index.md deleted file mode 100644 index 853ac068..00000000 --- a/docs/src/pvisor/concepts/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# pVisor concepts - -pVisor is built around an **Agent Run**, not a process, container, or virtual -machine. Read these concepts before comparing providers or interpreting a Run -Bundle. - -| Question | Concept article | -| --- | --- | -| What infrastructure category virtualizes Agent execution? | [What is an AgentVisor?](agentvisor.md) | -| What survives process and provider changes? | [Run, Attempt, and Effect](run-model.md) | -| How is authority requested and enforcement reported? | [Capabilities and evidence](capabilities-and-evidence.md) | - -The category article is implementation-neutral. The Run and capability pages -define pVisor's stable user model. Platform mechanisms and current gaps belong -to [pVisor Design](../design/index.md). diff --git a/docs/src/pvisor/concepts/index.zh.md b/docs/src/pvisor/concepts/index.zh.md deleted file mode 100644 index 4792a662..00000000 --- a/docs/src/pvisor/concepts/index.zh.md +++ /dev/null @@ -1,13 +0,0 @@ -# pVisor 核心概念 - -pVisor 围绕 **Agent Run** 构建,而不是围绕进程、Container 或虚拟机。比较 Provider 或 -解释 Run Bundle 前,先理解这些概念。 - -| 问题 | 概念文章 | -| --- | --- | -| 什么基础设施品类负责虚拟化 Agent 执行? | [什么是 AgentVisor?](agentvisor.md) | -| 哪些状态跨越进程和 Provider 变化? | [Run、Attempt 与 Effect](run-model.md) | -| 如何请求权限并报告实际 enforcement? | [Capability 与 Evidence](capabilities-and-evidence.md) | - -品类文章不绑定具体实现;Run 和 capability 文章定义 pVisor 稳定的用户模型;平台机制与 -当前缺口属于 [pVisor Design](../design/index.md)。 diff --git a/docs/src/pvisor/design/cli.md b/docs/src/pvisor/design/cli.md deleted file mode 100644 index a17671bc..00000000 --- a/docs/src/pvisor/design/cli.md +++ /dev/null @@ -1,9 +0,0 @@ -# pVisor CLI design - -The `pvisor` binary is a thin front end over Run, OverlayFS, OverlayNet, Gateway, and replay services. Every command resolves through the shared `RunConfig`/`RunSpec` model, keeping TOML, delegated containers, and host execution consistent. - -`run` executes an Agent. Any first argument that is not a reserved command or help/version flag is rewritten as `pvisor run`, so `pvisor -- codex` equals `pvisor run -- codex`. `replay` is an independent trajectory workflow and does not implicitly enable Gateway or pChronicle capture. `env` manages named reusable stages (`create`, `start`, `stop`, `exec`, `shell`, `list`, `status`, `inspect`, `apply`, `drop`, `delete`). Lifecycle selectors accept a Run id, record directory, `run.json`, upper/merged path, or workspace. - -`--spec` accepts TOML `RunConfig` or prepared JSON `RunSpec`. Explicit CLI scalars replace TOML scalars; repeated list options replace the complete list; the command after `--` replaces `run.command`. Executor selection can be inferred from `--container-image` or `--rootfs`. - -`review`, `checkpoint`, `fork`, `apply`, and `drop` are separate transactional operations. Checkpoints are stopped-consistent; `apply` is dependency-closed and records batches in `apply-ledger.json`; live Runs refuse mutation. Reset operations create a new environment generation so stale metadata cannot overwrite a new stage. diff --git a/docs/src/pvisor/design/cli.zh.md b/docs/src/pvisor/design/cli.zh.md deleted file mode 100644 index c28529b9..00000000 --- a/docs/src/pvisor/design/cli.zh.md +++ /dev/null @@ -1,9 +0,0 @@ -# pVisor CLI 设计 - -`pvisor` 是 Run、OverlayFS、OverlayNet、Gateway 与 replay 服务的统一前端。所有命令都解析为共用的 `RunConfig`/`RunSpec`,确保 TOML、容器委托和 host 执行语义一致。 - -`run` 执行 Agent。首个参数不是保留命令或帮助/版本选项时会自动改写为 `pvisor run`,因此 `pvisor -- codex` 等价于 `pvisor run -- codex`。`replay` 是独立轨迹流程,不会隐式开启 Gateway 或 pChronicle capture。`env` 管理具名可复用 stage,提供 `create`、`start`、`stop`、`exec`、`shell`、`list`、`status`、`inspect`、`apply`、`drop`、`delete`。生命周期选择器支持 Run id、记录目录、`run.json`、upper/merged 路径或工作区。 - -`--spec` 接受 TOML `RunConfig` 或准备好的 JSON `RunSpec`。显式 CLI 标量覆盖 TOML,重复列表选项替换整个列表,`--` 后命令替换 `run.command`;提供 `--container-image` 或 `--rootfs` 时可推断 executor。 - -`review`、`checkpoint`、`fork`、`apply`、`drop` 是独立事务操作。Checkpoint 保证停止一致;`apply` 按依赖闭包提交并记录 `apply-ledger.json`;live Run 拒绝变更。重置会创建新的 environment generation,避免旧 metadata 覆盖新 stage。 diff --git a/docs/src/theme/Root.js b/docs/src/theme/Root.js new file mode 100644 index 00000000..c0630df3 --- /dev/null +++ b/docs/src/theme/Root.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function Root({children}) { + return children; +} diff --git a/docs/src/zh/assets/diagrams/agentvisor/README.txt b/docs/src/zh/assets/diagrams/agentvisor/README.txt new file mode 100644 index 00000000..625f9244 --- /dev/null +++ b/docs/src/zh/assets/diagrams/agentvisor/README.txt @@ -0,0 +1,13 @@ +AgentVisor category diagrams + +These SVG files illustrate the industry category independently of any product +or repository implementation. + +- agentvisor-stack.svg: where the category sits in the infrastructure stack. +- effect-governance.svg: the lifecycle of an externally meaningful effect. +- execution-continuum.svg: semantic continuity from a personal device to a + secure fleet. + +The SVG files are source assets. Keep terminology aligned with +docs/src/design/agentvisor.md and avoid product names, implementation status, +or repository-specific protocols in this directory. diff --git a/docs/src/zh/assets/diagrams/agentvisor/agentvisor-stack.svg b/docs/src/zh/assets/diagrams/agentvisor/agentvisor-stack.svg new file mode 100644 index 00000000..768eac65 --- /dev/null +++ b/docs/src/zh/assets/diagrams/agentvisor/agentvisor-stack.svg @@ -0,0 +1,141 @@ + + The AgentVisor category in the Agent infrastructure stack + Multiple Agents share a pool of compute, filesystem, network, model, tool, and credential resources through an AgentVisor. Each Agent Run receives an isolated virtual execution environment with its own identity, state, authority, effects, and failure boundary. + + + + + + + + + + + + + + + + + + + + + + + The AgentVisor category + The hypervisor for Agent execution + + + + Independent Agent Runs + Agent A · Agent B · Agent C · different frameworks and goals + + + request an Agent virtual execution environment + + + + AgentVisor + maps shared resources into isolated Agent virtual execution environments + + + + Agent environment A + identity · workspace · authority + Isolated state and effect boundary + + + + Agent environment B + identity · workspace · authority + Isolated state and effect boundary + + + + Agent environment C + identity · workspace · authority + Isolated state and effect boundary + + + + Resource multiplexing + compute · storage · network + Shared pool, bounded consumption + + + + Lifecycle + placement + create · place · suspend · migrate + Stable Run across physical substrates + + + + Continuity + evidence + checkpoint · lineage · outcomes + State and accountability follow the Run + + + + + Identity + human · workload + organization + Policy + intent and constraints + + + + + + Evidence + audit · lineage + attestation + History + durable accountable facts + + + + + capability-aware Attempt placement + + + + Host sandbox + local process boundary + + + Container + shared-kernel isolation + + + MicroVM + dedicated guest kernel + + + Confidential + attested environment + + + Fleet + scheduled remote provider + + + + + + Models · tools · files · data · networks · services · people · physical systems + + Multiple Agents share the infrastructure pool while identity, state, authority, effects, and failures remain isolated. + diff --git a/docs/src/zh/assets/diagrams/agentvisor/effect-governance.svg b/docs/src/zh/assets/diagrams/agentvisor/effect-governance.svg new file mode 100644 index 00000000..8d23ad99 --- /dev/null +++ b/docs/src/zh/assets/diagrams/agentvisor/effect-governance.svg @@ -0,0 +1,108 @@ + + The AgentVisor effect governance loop + An Agent action moves through intent, admission, execution, observation, containment, and a decision to promote, reject, or compensate. Evidence closes the loop. Reversible, transactional, compensatable, and irreversible effects require different controls. + + + + + + + + + + + + + + + + + + + The effect governance loop + Autonomy is useful only when consequences have identity, state, policy, and evidence + + + + + + + + + + Intent + Agent proposes + an action + + + Admit + authority + context + + + Execute + allow · deny + or transform + + + Observe + capture actual + outcome + + + Contain + isolate or hold + when possible + + + + + + Resolve the consequence + promote · reject · expire + rollback · compensate · escalate + The decision depends on reversibility + + + + + + Evidence + accountability + intent · decision · mechanism + outcome · lineage · terminal state + Durable facts close the loop + + + + future admission learns from evidence + + Different effects require different controls + + + Reversible + stage · review · promote · discard + + + Transactional + reserve · validate · commit atomically + + + Compensatable + commit + durable counter-action + + + Irreversible + strong admission · minimal authority + + + Observation proves that something happened. It does not, by itself, make the consequence controllable or reversible. + diff --git a/docs/src/zh/assets/diagrams/agentvisor/execution-continuum.svg b/docs/src/zh/assets/diagrams/agentvisor/execution-continuum.svg new file mode 100644 index 00000000..7e29c352 --- /dev/null +++ b/docs/src/zh/assets/diagrams/agentvisor/execution-continuum.svg @@ -0,0 +1,114 @@ + + The AgentVisor execution continuum + A stable Agent Run identity, delegated authority, semantic checkpoint, effect frontier, lineage, and evidence can continue from a personal device through a team environment to a secure fleet, while the physical execution substrate and operational controls change. + + + + + + + + + + + + + + + + One Agent Run across an execution continuum + Semantic portability preserves authority and accountability while infrastructure changes + + + + What remains stable + + Run identity + intent + + Delegated authority + + Semantic checkpoint + + Effect frontier + + Lineage + + Enforcement + outcome evidence + + + + + promote artifacts and checkpoints + schedule with stronger guarantees + + + + Personal device + Low friction · same-owner trust + + Local AgentVisor + Autonomy inside; controlled promotion outside + + Process + sandbox + + Container + local OCI + + MicroVM + local VM + + + + + Team environment + Shared policy · review · artifacts + + Organizational AgentVisor + Identity, budgets, promotion, and common evidence + + Workstation + managed local + + Team pool + shared compute + + + + + Secure fleet + Multi-tenant · attested · reconciled + + Fleet AgentVisor + Fenced ownership, placement, and node evidence + + MicroVM + tenant pool + + Confidential + attested + + Remote + specialized + + + + + Portable artifacts and accountable history + content digests · checkpoints · effect records · evidence bundles · causal lineage + + + + + + Local-to-fleet is semantic continuity first. Live process-memory or VM migration is an optional provider capability, not the category definition. + diff --git a/docs/src/zh/assets/diagrams/persisting/README.txt b/docs/src/zh/assets/diagrams/persisting/README.txt new file mode 100644 index 00000000..4076d94f --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/README.txt @@ -0,0 +1,5 @@ +These SVGs explain the end-to-end Persisting product story. + +Keep the narrative ordered around the stable Run model: +execute one Run, govern effects, orchestrate many Runs, preserve history. +Product-specific implementation details belong in subsystem diagrams. diff --git a/docs/src/zh/assets/diagrams/persisting/dataset-catalog.svg b/docs/src/zh/assets/diagrams/persisting/dataset-catalog.svg new file mode 100644 index 00000000..c5ef4c6e --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/dataset-catalog.svg @@ -0,0 +1,18 @@ + + pChronicle Snapshot query pathCLI or server configuration produces Dataset mounts and an immutable Snapshot. The table provider first evaluates source predicates, skips unmatched sources, lazily resolves matched sources once, and constructs an empty, direct, or union execution plan. + + Snapshot: prune first, resolve lazilyA Snapshot fixes membership and source versions; physical data opens only when selected + CLI / Server confignames · roots · format hints + DatasetMount[]normalized mount identity + Catalog snapshotimmutable membershipfixed source version descriptors + Dataset schemasources + stable tablesregistered in DataFusion + CatalogTableProviderevaluate Dataset + _file_ predicatebefore constructing physical scans + matched + LazySource.resolveOnceCell single-flightcache result or error + + Native source providerStoryline · events · fileprojection + filter + limit + + Physical execution plan0 EmptyExec · 1 direct planN sources → UnionExec + unmatched + Skip the sourceno parse · no remote open · no scan + diff --git a/docs/src/zh/assets/diagrams/persisting/gateway-dataflow.svg b/docs/src/zh/assets/diagrams/persisting/gateway-dataflow.svg new file mode 100644 index 00000000..8833a5e6 --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/gateway-dataflow.svg @@ -0,0 +1,17 @@ + + Gateway event dataflowThe HTTP capture proxy emits events to a non-blocking event flow. The flow appends canonical events to Lance and independently triggers handlers. Handlers reduce events into Storyline and write AgenticMD, ATIF, and other derived formats. Lance can replay events through the same handlers. + + Gateway dataflowRecord canonical events first; build human and exchange views through independent handlers + Capture proxyHTTP · SSE · protocol adapterforward without waiting on views + emit + Event flowordered append · bounded fan-outcallback never blocks + record + events.lancecanonical source of truthappend + replay + trigger + Handlersinterpret · reduce · retryfailure does not block HTTP + + Storyline hubsession + call normalizationhuman-readable semantics + + ViewsAgenticMDATIF · others + replay + diff --git a/docs/src/zh/assets/diagrams/persisting/gateway-request.svg b/docs/src/zh/assets/diagrams/persisting/gateway-request.svg new file mode 100644 index 00000000..081d2ba5 --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/gateway-request.svg @@ -0,0 +1,10 @@ + + Gateway request capture sequenceAn Agent sends a request through the capture proxy. The proxy emits the request event and forwards upstream. Streaming drafts update handlers while SSE continues to the Agent. On cancellation Lance records cancel; on completion Lance records the final response and handlers finalize derived views. + + One captured conversation requestThe response path does not wait for derived-format persistence + AgentCapture proxyEvent flowevents.lanceHandlersUpstream + + REQUESTconversation requestemit request eventappend canonical requesttrigger Storyline / Markdownforward upstream + STREAMstreaming responseoptional draftlive view upsertforward SSE + TERMINALcancel or response completeappend terminal factfinalize views on completion + diff --git a/docs/src/zh/assets/diagrams/persisting/libkrun-executor.svg b/docs/src/zh/assets/diagrams/persisting/libkrun-executor.svg new file mode 100644 index 00000000..31d90686 --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/libkrun-executor.svg @@ -0,0 +1,22 @@ + + pVisor libkrun execution path + The host Run controller prepares an OCI or explicit root filesystem and a separate workspace, passes a RunnerSpec to the self-executed pVisor runner and libkrun, then mounts the merged root through virtio-fs into a minimal Linux guest that runs the Agent. + + pVisor libkrun execution pathThe VM replaces the executor; pVisor retains Run ownership and finalization + HOST PVISOR + Run controllerRunId · AttemptId · lease + OCI registry/cacheverified image layersor explicit rootfs + Rootfs OverlayFSimmutable lowerper-Run temporary upper + Host workspaceseparate durable mount + VmExecutorRunnerSpec + GuestSpecCPU · RAM · cwd · env + self-exec pVisor runnerLinux confinement or macOS HVF · watchdog · cancellation + + LIBKRUN VMM + libkrunvCPU · RAM · init + virtio-fsguest root + workspace + + MINIMAL LINUX GUEST + embedded initmount · env · exec + Agentguest process tree + exit · cancel · watchdog → Run controller + diff --git a/docs/src/zh/assets/diagrams/persisting/pchronicle-product.svg b/docs/src/zh/assets/diagrams/persisting/pchronicle-product.svg new file mode 100644 index 00000000..1dfd7652 --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/pchronicle-product.svg @@ -0,0 +1,105 @@ + + pChronicle product boundary + Canonical runtime event Sources and pinned local or S3 external trajectory Sources from external evaluators and Agent frameworks enter pChronicle through separate branches and converge at a Snapshot and normalized Dataset views. Supported external files include ATIF, ACTF, OpenAI Messages, and Storyline Sources; they do not become canonical runtime events. CLI import is a separate inbound path that accepts ATIF, ACTF, and OpenAI Messages into a new Dataset. Outbound surfaces provide query and analysis, export including Storyline, revisions, and a read-only Warehouse API and Web interface. + + + + + + + + + + + + + + + + pChronicle product boundary + Dataset-first trajectory data · direct Sources · directional read and exchange surfaces + + + ingest / write + + query / export / read + + + + Canonical event Sources + Gateway · pVisor lifecycle · native writers + + + + + Pinned external Sources + External evaluators · Agent frameworks + local/S3 ATIF · ACTF · OpenAI Messages + Storyline Sources · direct normalization + + + + + CLI import → new Dataset + ATIF · ACTF · OpenAI Messages + + + + + + + + + Snapshot + pin Source versions + preserve Source identity + normalize Dataset views + external files remain + non-event Sources + + + + + + + pChronicle Core + discover · pin Snapshot + normalize Sources · query + persist canonical runtime events + export · revision lineage + + + + + + + + + CLI query + query · analysis + + + + + Export + revisions + ATIF · ACTF · OpenAI + Storyline · revision lineage + + + + + Read-only Warehouse + API · Web + + diff --git a/docs/src/zh/assets/diagrams/persisting/pchronicle-web.svg b/docs/src/zh/assets/diagrams/persisting/pchronicle-web.svg new file mode 100644 index 00000000..74f7ebc7 --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/pchronicle-web.svg @@ -0,0 +1,23 @@ + + pChronicle Web build and runtimeDioxus components are bundled into static assets and embedded in the native server. At runtime the browser talks to the Axum REST API, which holds immutable catalog state, source routing, and a read-only query engine over local and object-store sources. + + pChronicle Web: build once, serve read-onlyThe Web application is a consumer of pChronicle, not another source of truth + BUILD AND PACKAGE + Dioxus componentspchronicle-web + dx bundle --releasepre-compressed bundle + web-assets/publicWASM · JS · CSS · HTML + server build.rsgenerated or fallback assets + native binaryassets embedded with include_dir + + LOOPBACK RUNTIME + Dioxus applicationDataset · Runs · timelineevents · tools · filters + + Axum /apiread-only RESTexplicit refresh + + AppStatemount configimmutable catalog snapshotgeneration-scoped routing + + Dataset sourceslocal · S3 · object prefixesevents · ATIF · ACTF · Storyline + Query engineDataset schemassource pruning · read-only SQL + + ViewsRunsevents · spans + diff --git a/docs/src/zh/assets/diagrams/persisting/run-lifecycle.svg b/docs/src/zh/assets/diagrams/persisting/run-lifecycle.svg new file mode 100644 index 00000000..8a7e953c --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/run-lifecycle.svg @@ -0,0 +1,47 @@ + + Agent Run lifecycle + A Run moves from created to admitted and running. Running can checkpoint and resume, complete, fail, or cancel. Admitted Runs can also cancel. + + + + + + + Agent Run lifecycle + Run state is monotonic; checkpointed is resumable, not terminal + + + + + createdidentity persisted + + + admittedcapabilities checked + + + runningactive Attempt + + + + checkpointedresume into running + + + + + completed + + + + + + failed + + + + + cancelling + + + cancelled + + diff --git a/docs/src/zh/assets/diagrams/persisting/system-products.svg b/docs/src/zh/assets/diagrams/persisting/system-products.svg new file mode 100644 index 00000000..e979ebfc --- /dev/null +++ b/docs/src/zh/assets/diagrams/persisting/system-products.svg @@ -0,0 +1,105 @@ + + Persisting workflows and optional integration + pVisor runs one Agent with a reviewable execution boundary, while pChronicle queries trajectory Datasets. Execution and history are independent starting points that can be connected by configured capture. + + + + + + + + + + + + + + + + + + + + + + + + Persisting product paths and optional integration + pVisor governs execution; pChronicle preserves queryable history + + Inputs + + + Agent command / task + + + + Pinned external Sources + + + + + + + + EXECUTION PATH + pVisor: controlled execution + + + pVisor: one governed Run per Agent + review, apply, or drop staged changes + + + Host · OCI container · libkrun VM + provider boundary and Evidence recorded with the Run + + + + + HISTORY PATH + pChronicle: trajectory Datasets + + + local/S3 files · Storyline Sources · @alias + + + Snapshot · normalize · query · analyze · exchange + + + + + OPTIONAL CAPTURE + Gateway trajectory events + pVisor lifecycle records + recorded execution context + + + configured capture + + + + + Shared principle + keep reusable state durable; keep completed work inspectable + + diff --git a/docs/src/zh/assets/diagrams/pvisor/README.txt b/docs/src/zh/assets/diagrams/pvisor/README.txt new file mode 100644 index 00000000..b9deac53 --- /dev/null +++ b/docs/src/zh/assets/diagrams/pvisor/README.txt @@ -0,0 +1,12 @@ +pVisor documentation diagrams + +These SVG files are source assets, not generated build output. They are kept +inside the Docusaurus website assets directory so the website and repository README can reference +the same versioned diagrams. + +- agentvisor-architecture.svg: product ownership and the boundary between + pVisor, pChronicle, and execution providers. + +Keep status labels honest when the implementation changes. Product-specific +claims belong here; industry-level category diagrams live in the sibling +`agentvisor` directory. diff --git a/docs/src/zh/assets/diagrams/pvisor/agentvisor-architecture.svg b/docs/src/zh/assets/diagrams/pvisor/agentvisor-architecture.svg new file mode 100644 index 00000000..5620ed35 --- /dev/null +++ b/docs/src/zh/assets/diagrams/pvisor/agentvisor-architecture.svg @@ -0,0 +1,135 @@ + + pVisor AgentVisor architecture + An Agent sends one Run contract into pVisor. pVisor governs lifecycle, capabilities, Effects, checkpoints, lineage, Evidence, and runtime drivers. orchestration orchestrates many Runs, while host, container, VM, and future fleet providers execute Attempts. Configured pChronicle capture receives Gateway trajectory events, pVisor lifecycle records, and their event-carried Evidence; the full Run Bundle and its Artifact, lineage, Effect, and broader Evidence inventory remain local. + + + + + + + + + + + + + + + + + + + + + + + pVisor is an AgentVisor + One governed Agent Run across local and clustered execution providers + + + + + + Autonomous Agent + CLI · coding Agent · evaluation worker + + + RunSpec + capability intent + + + + pVisor + AgentVisor control and containment layer + + + + Lifecycle + Run · Attempt · cancel · terminal + Stable identity above process + + + + Capabilities + read · write · network · tools + Evidence per requested dimension + + + + Effects + observe · stage · apply · drop + Control what becomes real + + + + Checkpoint + quiesce · snapshot · fork · lineage + Logical Agent + workspace state + + + + Evidence + Run Bundle · events · metrics + What ran, changed, and enforced + + + + Drivers + AgentCtl · Gateway · Overlay* + One policy context per Attempt + + + + + orchestration + plan · lease · schedule + retry · reconcile + Many Runs + + + + + + pChronicle + Configured event handoff + Dataset · history + Event-carried facts only + + + Gateway trajectory events + pVisor lifecycle records + carried Evidence + + + Attempt placement + + + + Safe host + Linux · macOS + + + Container + Docker · Podman + + + libkrun VM + KVM · HVF + + + Fleet provider + Product gate + + + AgentVisor defines Agent semantics; execution providers define process, container, VM, and node mechanics. + diff --git a/docs/src/zh/assets/screenshots/pchronicle/analysis-sql.jpg b/docs/src/zh/assets/screenshots/pchronicle/analysis-sql.jpg new file mode 100644 index 00000000..bf1ddd0a Binary files /dev/null and b/docs/src/zh/assets/screenshots/pchronicle/analysis-sql.jpg differ diff --git a/docs/src/zh/assets/screenshots/pchronicle/assistant-settings.jpg b/docs/src/zh/assets/screenshots/pchronicle/assistant-settings.jpg new file mode 100644 index 00000000..1c6338e1 Binary files /dev/null and b/docs/src/zh/assets/screenshots/pchronicle/assistant-settings.jpg differ diff --git a/docs/src/zh/assets/screenshots/pchronicle/data-overview.jpg b/docs/src/zh/assets/screenshots/pchronicle/data-overview.jpg new file mode 100644 index 00000000..a52d37aa Binary files /dev/null and b/docs/src/zh/assets/screenshots/pchronicle/data-overview.jpg differ diff --git a/docs/src/zh/assets/screenshots/pchronicle/run-detail.jpg b/docs/src/zh/assets/screenshots/pchronicle/run-detail.jpg new file mode 100644 index 00000000..7844afae Binary files /dev/null and b/docs/src/zh/assets/screenshots/pchronicle/run-detail.jpg differ diff --git a/docs/src/zh/assets/screenshots/pchronicle/runs-browser.jpg b/docs/src/zh/assets/screenshots/pchronicle/runs-browser.jpg new file mode 100644 index 00000000..2a925e1f Binary files /dev/null and b/docs/src/zh/assets/screenshots/pchronicle/runs-browser.jpg differ diff --git a/docs/src/zh/assets/screenshots/pchronicle/storage-layout.jpg b/docs/src/zh/assets/screenshots/pchronicle/storage-layout.jpg new file mode 100644 index 00000000..e8c06308 Binary files /dev/null and b/docs/src/zh/assets/screenshots/pchronicle/storage-layout.jpg differ diff --git a/docs/src/zh/assets/stylesheets/home.css b/docs/src/zh/assets/stylesheets/home.css new file mode 100644 index 00000000..65a5f7cb --- /dev/null +++ b/docs/src/zh/assets/stylesheets/home.css @@ -0,0 +1,837 @@ +/* Persisting homepage. + Layout and visual system for the docs landing page (overrides/home.html). + Tokens are scheme-aware: the hero has separately tuned light and dark + recipes rather than one inverted palette. */ + +:root { + /* Keep Material's indigo/pink relationship; Persisting's teal and blue + accents remain inside the page content. */ + --md-primary-fg-color: #3f51b5; + --md-primary-fg-color--light: #7986cb; + --md-primary-fg-color--dark: #303f9f; + --md-accent-fg-color: #ff4081; + + /* Semantic palette: teal marks execution, blue marks history. */ + --ph-exec: #0d9488; + --ph-exec-bright: #2dd4bf; + --ph-hist: #3b82f6; + --ph-hist-bright: #60a5fa; + + --ph-ink: #0f172a; + --ph-muted: #5a677d; + --ph-line: rgba(100, 116, 139, 0.22); + --ph-panel: rgba(148, 163, 184, 0.07); + --ph-card: #ffffff; + + /* Hero, light recipe. */ + --ph-hero-bg: + linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(245, 247, 255, 0.96)); + --ph-hero-ink: #0b1220; + --ph-hero-dim: #46566d; + --ph-hero-eyebrow: #0f766e; + --ph-hero-rule: rgba(15, 23, 42, 0.1); + --ph-btn-fg: #0b1220; + --ph-btn-line: rgba(63, 81, 181, 0.28); + --ph-btn-hover: rgba(15, 23, 42, 0.05); + --ph-shadow: 0 8px 24px rgba(63, 81, 181, 0.14); + --ph-shadow-sm: 0 4px 14px rgba(63, 81, 181, 0.12); + + /* Terminal cards stay dark in both schemes: a shell is a shell. */ + --ph-term-bg: #0b1322; + --ph-term-line: #1e293b; + --ph-term-fg: #cbd5e1; + --ph-term-prompt: #2dd4bf; +} + +[data-md-color-scheme="slate"] { + --ph-ink: #e6edf6; + --ph-muted: #9fb0c6; + --ph-line: rgba(148, 163, 184, 0.2); + --ph-panel: rgba(148, 163, 184, 0.06); + --ph-card: rgba(148, 163, 184, 0.05); + + /* Hero, dark recipe. */ + --ph-hero-bg: + radial-gradient(ellipse 70% 55% at 78% 10%, rgba(45, 212, 191, 0.2), transparent 60%), + radial-gradient(ellipse 65% 55% at 10% 88%, rgba(59, 130, 246, 0.18), transparent 58%), + linear-gradient(168deg, #060d18, #0d1a2c 55%, #0c2a2c); + --ph-hero-ink: #f8fafc; + --ph-hero-dim: #b6c6da; + --ph-hero-eyebrow: #2dd4bf; + --ph-hero-rule: rgba(226, 232, 240, 0.14); + --ph-btn-fg: #f1f5f9; + --ph-btn-line: rgba(226, 232, 240, 0.3); + --ph-btn-hover: rgba(226, 232, 240, 0.09); + --ph-shadow: 0 26px 70px rgba(0, 0, 0, 0.5); + --ph-shadow-sm: 0 12px 32px rgba(0, 0, 0, 0.4); +} + +body { + overflow-x: hidden; +} + +.ph { + color: var(--ph-ink); +} + +.ph-shell { + width: min(1280px, calc(100% - 56px)); + margin: 0 auto; +} + +/* The landing page is a full-width surface. Material's regular content grid + remains in place for documentation pages, but must not squeeze the hero + into the reading column. */ +body:has(.ph) .md-tabs:has(.ph), +body:has(.ph) .md-tabs:has(.ph) .ph { + max-width: none; +} + +body:has(.ph) .md-tabs:has(.ph) { + width: 100%; +} + +/* ---------------------------------------------------------------- hero -- */ + +.ph-hero { + position: relative; + overflow: hidden; + padding: 94px 0 104px; + background: var(--ph-hero-bg); + color: var(--ph-hero-ink); +} + +.ph-hero-copy { + max-width: 780px; + margin: 0 auto; + text-align: center; +} + +.ph-hero .ph-shell { + display: block; +} + +.ph-eyebrow, +.ph-kicker { + margin: 0 0 16px; + color: var(--ph-hero-eyebrow); + font-size: 0.74rem; + font-weight: 750; + letter-spacing: 0.17em; +} + +.ph-wordmark { + margin: 0; + color: var(--ph-hero-ink); + font-size: clamp(3.4rem, 8.5vw, 6.2rem); + font-weight: 780; + letter-spacing: -0.05em; + line-height: 0.96; +} + +.ph-positioning { + margin: 22px 0 0; + color: var(--ph-hero-ink); + font-size: clamp(1.3rem, 2.6vw, 1.95rem); + font-weight: 650; + letter-spacing: -0.022em; + line-height: 1.28; +} + +.ph-hero-copy .ph-positioning + .ph-positioning { + margin-top: 16px; + font-size: clamp(1.05rem, 1.7vw, 1.25rem); + font-weight: 450; + line-height: 1.65; +} + +.ph-lede { + max-width: 640px; + margin: 16px auto 0; + color: var(--ph-hero-dim); + font-size: clamp(1.02rem, 1.7vw, 1.2rem); + line-height: 1.66; +} + +.ph-actions { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 11px; + margin-top: 34px; +} + +.ph-btn { + display: inline-flex; + align-items: center; + padding: 0.72rem 1.2rem; + border: 1px solid var(--ph-btn-line); + border-radius: 8px; + color: var(--ph-btn-fg); + font-size: 0.84rem; + font-weight: 680; + line-height: 1.2; + text-decoration: none; + transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease; +} + +.ph-btn:hover { + border-color: currentcolor; + background: var(--ph-btn-hover); + color: var(--ph-btn-fg); +} + +.ph-btn--primary { + border-color: var(--md-primary-fg-color); + background: var(--md-primary-fg-color); + color: #fff; +} + +.ph-btn--primary:hover { + border-color: var(--md-primary-fg-color--dark); + background: var(--md-primary-fg-color--dark); + color: #fff; +} + +.ph-btn--quiet { + border-color: transparent; + text-decoration: underline; + text-underline-offset: 4px; +} + +/* Dual visual: execution on the left, queryable history on the right. */ + +.ph-stage { + display: grid; + grid-template-columns: minmax(0, 1fr) 62px minmax(0, 1.12fr); + align-items: center; + margin-top: 62px; +} + +.ph-hero-art { + position: relative; + width: 100vw; + min-height: 620px; + overflow: hidden; + border: 1px solid rgba(94, 234, 212, 0.25); + border-radius: 24px; + background: #07101d url('../diagrams/persisting/hero-cyberpunk.svg') center / cover no-repeat; + box-shadow: var(--ph-shadow); + max-width: none; + margin: 58px 0 0; + margin-left: calc(50% - 50vw); + border-radius: 0; + background-size: cover; + background-position: center; +} + +.ph-hero-art__label, +.ph-hero-art__caption { + position: absolute; + left: 24px; + right: 24px; + color: #a7f3d0; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.68rem; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.ph-hero-art__label { top: 22px; } +.ph-hero-art__caption { bottom: 22px; color: #bfdbfe; font-family: inherit; letter-spacing: 0; text-transform: none; line-height: 1.5; } + +.ph-panel { + margin: 0; + min-width: 0; +} + +.ph-panel figcaption { + margin-top: 14px; + font-size: 0.76rem; + font-weight: 700; + letter-spacing: 0.11em; + text-transform: uppercase; +} + +.ph-panel--exec figcaption { + color: var(--ph-exec); +} + +.ph-panel--hist figcaption { + color: var(--ph-hist); +} + +[data-md-color-scheme="slate"] .ph-panel--exec figcaption { + color: var(--ph-exec-bright); +} + +[data-md-color-scheme="slate"] .ph-panel--hist figcaption { + color: var(--ph-hist-bright); +} + +/* The beam carries the eye from execution to history. */ +.ph-beam { + position: relative; + display: block; + height: 2px; + background: linear-gradient(90deg, var(--ph-exec-bright), var(--ph-hist)); + border-radius: 2px; +} + +.ph-beam::after { + content: ""; + position: absolute; + top: 50%; + right: -1px; + width: 9px; + height: 9px; + border-top: 2px solid var(--ph-hist); + border-right: 2px solid var(--ph-hist); + transform: translateY(-50%) rotate(45deg); +} + +/* Terminal card. */ + +.ph-term { + overflow: hidden; + padding: 16px 0 18px; + border: 1px solid var(--ph-term-line); + border-radius: 14px; + background: var(--ph-term-bg); + box-shadow: var(--ph-shadow); +} + +.ph-term-dots { + display: block; + margin: 0 16px 14px; +} + +/* One element, three dots: the base circle plus two shadow copies. */ +.ph-term-dots::before { + content: ""; + display: block; + width: 9px; + height: 9px; + border-radius: 50%; + background: #334155; + box-shadow: 15px 0 0 #334155, 30px 0 0 #334155; +} + +.ph-term pre { + margin: 0; + padding: 0 18px; + overflow-x: auto; + background: none; +} + +.ph-term code { + color: var(--ph-term-fg); + font-size: 0.79rem; + line-height: 1.72; +} + +.ph-l { + display: block; + white-space: pre; +} + +.ph-p { + margin-right: 0.5em; + color: var(--ph-term-prompt); + font-weight: 700; +} + +.ph-term--sm { + box-shadow: var(--ph-shadow-sm); +} + +.ph-term--sm code { + font-size: 0.74rem; + line-height: 1.85; +} + +/* Screenshot in browser chrome, so a light UI does not read as pasted-in. */ + +.ph-window { + overflow: hidden; + padding-top: 16px; + border: 1px solid var(--ph-term-line); + border-radius: 14px; + background: #131c2c; + box-shadow: var(--ph-shadow); +} + +.ph-window img { + display: block; + width: 100%; + height: auto; +} + +.ph-window--sm { + box-shadow: var(--ph-shadow-sm); +} + +/* --------------------------------------------------------------- stats -- */ + +.ph-stats { + border-bottom: 1px solid var(--ph-line); + background: var(--ph-panel); +} + +.ph-stats ul { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 24px; + margin: 0; + padding: 26px 0; + list-style: none; +} + +.ph-stats li { + display: flex; + align-items: baseline; + gap: 9px; + margin: 0; + color: var(--ph-muted); + font-size: 0.9rem; + line-height: 1.45; +} + +.ph-stats strong { + color: var(--ph-exec); + font-size: 1.65rem; + font-weight: 760; + letter-spacing: -0.03em; + line-height: 1; +} + +/* ------------------------------------------------------------ sections -- */ + +.ph-section { + padding: 88px 0; +} + +.ph-section h2 { + max-width: 840px; + margin: 0; + color: var(--ph-ink); + font-size: clamp(1.9rem, 3.6vw, 2.9rem); + font-weight: 700; + letter-spacing: -0.032em; + line-height: 1.16; +} + +.ph-section .ph-kicker { + color: var(--ph-exec); +} + +.ph-lead { + max-width: 700px; + margin: 18px 0 0; + color: var(--ph-muted); + font-size: 1.1rem; + line-height: 1.72; +} + +.ph-note { + margin: 0; + color: var(--ph-muted); + font-size: 0.93rem; + line-height: 1.65; +} + +.ph-section--contrast { + border-block: 1px solid var(--ph-line); + background: var(--ph-panel); +} + +/* Throughline: colour shifts from execution to history across the steps. */ + +.ph-flow { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 20px; + margin: 48px 0 26px; + padding: 0; + list-style: none; +} + +.ph-step { + position: relative; + margin: 0; + padding: 26px 24px 24px; + border: 1px solid var(--ph-line); + border-radius: 16px; + background: var(--ph-card); +} + +.ph-step::before { + content: ""; + position: absolute; + inset: -1px -1px auto; + height: 3px; + border-radius: 16px 16px 0 0; +} + +.ph-step--1::before { + background: var(--ph-exec-bright); +} + +.ph-step--2::before { + background: linear-gradient(90deg, var(--ph-exec-bright), var(--ph-hist)); +} + +.ph-step--3::before { + background: var(--ph-hist); +} + +.ph-step-tag { + font-size: 0.72rem; + font-weight: 760; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +.ph-step--1 .ph-step-tag { + color: var(--ph-exec); +} + +.ph-step--2 .ph-step-tag { + color: #1d8fa6; +} + +.ph-step--3 .ph-step-tag { + color: var(--ph-hist); +} + +.ph-step h3 { + margin: 12px 0 10px; + font-size: 1.14rem; + font-weight: 680; + line-height: 1.35; +} + +.ph-step p { + margin: 0 0 18px; + color: var(--ph-muted); + font-size: 0.96rem; + line-height: 1.68; +} + +/* Material-style feature grid: short, scannable capabilities before the + deeper workflow sections. */ +.ph-capabilities { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin-top: 42px; + overflow: hidden; + border: 1px solid var(--ph-line); + border-radius: 8px; + background: var(--ph-line); +} + +.ph-capabilities article { + min-height: 150px; + padding: 26px 24px; + background: var(--ph-card); +} + +.ph-capabilities h3 { + margin: 0 0 10px; + color: var(--ph-ink); + font-size: 1.02rem; + font-weight: 700; +} + +.ph-capabilities p { + margin: 0; + color: var(--ph-muted); + font-size: 0.92rem; + line-height: 1.6; +} + +/* Wrap rather than scroll: a clipped command reads as broken on a landing page. */ +.ph-step code { + display: block; + padding: 9px 12px; + border-radius: 8px; + background: var(--ph-term-bg); + color: var(--ph-term-fg); + font-size: 0.76rem; + line-height: 1.6; + white-space: pre-wrap; + overflow-wrap: anywhere; +} + +/* Depth panels. */ + +.ph-depth { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 22px; + margin-top: 48px; +} + +.ph-depth-card { + display: flex; + flex-direction: column; + padding: 28px; + border: 1px solid var(--ph-line); + border-radius: 18px; + background: var(--ph-card); +} + +.ph-tag { + font-size: 0.72rem; + font-weight: 760; + letter-spacing: 0.15em; +} + +.ph-depth-card--exec .ph-tag { + color: var(--ph-exec); +} + +.ph-depth-card--hist .ph-tag { + color: var(--ph-hist); +} + +.ph-depth-card > p { + margin: 16px 0 22px; + color: var(--ph-muted); + font-size: 1rem; + line-height: 1.7; +} + +.ph-depth-card > a { + margin-top: 22px; + font-size: 0.94rem; + font-weight: 660; + text-decoration: none; +} + +.ph-depth-card--exec > a { + color: var(--ph-exec); +} + +.ph-depth-card--hist > a { + color: var(--ph-hist); +} + +.ph-depth-card > a:hover { + text-decoration: underline; +} + +/* Quick start. */ + +.ph-start { + display: grid; + grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.4fr); + gap: 26px; + margin-top: 46px; +} + +.ph-start h3 { + margin: 0 0 12px; + font-size: 0.98rem; + font-weight: 700; +} + +.ph-start-paths { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 26px; +} + +.ph-start pre { + margin: 0; + padding: 18px 20px; + overflow-x: auto; + border: 1px solid var(--ph-term-line); + border-radius: 12px; + background: var(--ph-term-bg); +} + +.ph-start code { + color: var(--ph-term-fg); + font-size: 0.79rem; + line-height: 1.9; +} + +.ph-start .ph-note { + margin-top: 14px; + font-size: 0.88rem; +} + +/* Link grid. */ + +.ph-links { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 16px; + margin-top: 44px; +} + +.ph-links a { + display: flex; + min-height: 142px; + flex-direction: column; + justify-content: space-between; + padding: 24px; + border: 1px solid var(--ph-line); + border-radius: 14px; + background: var(--ph-card); + color: inherit; + text-decoration: none; + transition: border-color 150ms ease, transform 150ms ease, box-shadow 150ms ease; +} + +.ph-links a:hover { + transform: translateY(-3px); + border-color: var(--ph-exec); + box-shadow: var(--ph-shadow-sm); +} + +.ph-links strong { + font-size: 1.02rem; + font-weight: 680; +} + +.ph-links span { + color: var(--ph-muted); + font-size: 0.9rem; + line-height: 1.55; +} + +/* Closing statement. */ + +.ph-close { + padding: 84px 0; + background: linear-gradient(150deg, #0a1526, #0f2a2c); + color: #dbe6f2; + text-align: center; +} + +.ph-close h2 { + margin: 0 auto; + max-width: 780px; + color: #f8fafc; + font-size: clamp(1.75rem, 3.2vw, 2.5rem); + font-weight: 700; + letter-spacing: -0.03em; + line-height: 1.2; +} + +.ph-close p { + max-width: 780px; + margin: 22px auto 0; + color: #a8bad0; + font-size: 1.05rem; + line-height: 1.75; +} + +/* --------------------------------------------------------- adaptation -- */ + +@media screen and (min-width: 76.25em) { + .ph ~ .md-main, + body:has(.ph) .md-sidebar--primary { + display: none; + } +} + +@media (max-width: 1020px) { + .ph-stats ul { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .ph-links { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 920px) { + .ph-hero .ph-shell { + grid-template-columns: 1fr; + } + + .ph-hero-art { + min-height: 460px; + } + + /* Stack the dual visual; the beam turns vertical. */ + .ph-stage { + grid-template-columns: 1fr; + gap: 8px; + justify-items: stretch; + } + + .ph-beam { + width: 2px; + height: 46px; + justify-self: center; + background: linear-gradient(180deg, var(--ph-exec-bright), var(--ph-hist)); + } + + .ph-beam::after { + top: auto; + right: 50%; + bottom: -1px; + transform: translateX(50%) rotate(135deg); + } + + .ph-flow, + .ph-capabilities, + .ph-depth, + .ph-start, + .ph-start-paths { + grid-template-columns: 1fr; + } +} + +@media (max-width: 620px) { + .ph-shell { + width: min(100% - 30px, 1180px); + } + + .ph-hero { + padding: 60px 0 68px; + } + + .ph-hero-art { + min-height: 390px; + } + + .ph-section { + padding: 62px 0; + } + + .ph-close { + padding: 62px 0; + } + + .ph-stats ul { + grid-template-columns: 1fr; + gap: 16px; + padding: 22px 0; + } + + .ph-links { + grid-template-columns: 1fr; + } + + .ph-links a { + min-height: 0; + gap: 8px; + } +} + +@media (prefers-reduced-motion: reduce) { + .ph-btn, + .ph-links a { + transition: none; + } + + .ph-links a:hover { + transform: none; + } +} diff --git a/docs/src/zh/index.md b/docs/src/zh/index.md new file mode 100644 index 00000000..b8f86d99 --- /dev/null +++ b/docs/src/zh/index.md @@ -0,0 +1,28 @@ +--- +title: 从这里开始 +sidebar_label: 从这里开始 +--- + +# 从这里开始 + +Persisting 提供两条独立的产品路径,请按当前任务选择入口: + +- [使用 pVisor 安全运行 Agent](pvisor/get-started.md):暂存 workspace 修改,检查 Run Bundle,只应用你批准的内容。 +- [使用 pChronicle 探索持久历史](pchronicle/get-started.md):打开 Dataset,执行只读查询,并追踪 Source lineage。 +- [理解产品边界](overview.md):了解执行与历史如何连接,同时保持边界清晰。 + +如果你正在评估 Persisting,先阅读[选择工作流](overview.md),再进入对应的产品快速开始。 + +## 完成第一次 walkthrough 后你会得到什么 + +- **pVisor** walkthrough 会以停止的 Run、可读取的 Run Bundle,以及明确的 apply 或 drop + 决策结束。只有你选择 apply,项目才会收到 staged Effect。 +- **pChronicle** walkthrough 会以一次只读 Dataset 查询结束,并明确区分正在读取的 Dataset、 + Source 和 Snapshot。 + +开始时不需要同时使用两个产品。只有在需要把执行证据与持久轨迹历史关联起来时,才配置 capture 交接。 + +## 开始前准备 + +先阅读[安装指南](installation.md)安装 CLI。如果你有本地项目和 Agent 命令,从 pVisor 开始; +如果已经有轨迹数据,或只想体验临时 onboarding Dataset,从 pChronicle 开始。 diff --git a/docs/src/zh/installation.md b/docs/src/zh/installation.md new file mode 100644 index 00000000..905c8d47 --- /dev/null +++ b/docs/src/zh/installation.md @@ -0,0 +1,99 @@ +# 安装指南 + +Persisting 提供两条公开命令行路径: + +- `pvisor` 在可审查的执行边界中运行 Agent。 +- `pchronicle` 打开、查询、交换和服务轨迹 Dataset。 + +默认安装包含公开 CLI 和 Dataset 工作流所需的全部能力。 + +## 1. 安装工具 + +```bash +pip install persisting +``` + +确认命令可用: + +```bash +pvisor --version +pchronicle --help +``` + +wheel 会把匹配版本的 Python 包和公开 CLI 入口安装到当前 Python 环境。项目有其他 +Python 依赖时,建议使用虚拟环境: + +```bash +python3 -m venv .venv +source .venv/bin/activate +python -m pip install --upgrade pip +pip install persisting +``` + +:::tip 可以从任意一个产品开始 +探索 pChronicle 不要求先运行 pVisor。如果你想先运行 Agent,继续阅读[运行第一个 Agent](pvisor/get-started.md); +如果已经有轨迹数据,继续阅读[探索第一个 Dataset](pchronicle/get-started.md)。 +::: + +## 2. 检查平台要求 + +CLI 支持 macOS 和 Linux,要求 Python 3.10 或更新版本。普通 host Run 不需要文件系统扩展。 +在 macOS 上使用 host-process 的 `pvisor run --safe` 前,先安装 macFUSE: + +```bash +brew install --cask macfuse +``` + +macOS 提示时允许 macFUSE system extension。如果挂载能力不可用,`--safe` 会 fail closed, +不会退化为直接写入项目目录。libkrun VM executor 不需要 macFUSE。 + +## 3. 需要时从源码安装 + +需要 `main` 最新构建时,可以使用 nightly wheel: + +```bash +curl -fsSL https://raw.githubusercontent.com/DeepLink-org/Persisting/main/scripts/install-nightly.sh | bash +``` + +本地开发时,从 checkout 安装 Python 包: + +```bash +git clone https://github.com/DeepLink-org/Persisting.git +cd Persisting +pip install -e . +``` + +也可以从源码构建 CLI 组件: + +```bash +just install-cli +``` + +只有在明确测试特定 pVisor 二进制时才设置 `PERSISTING_PVISOR_BIN`。排查 Provider 行为时, +应尽量让 Python 包和 CLI 来自同一 revision。 + +## 4. 需要时启用 VM 或 OCI 执行 + +默认本地工作流不要求安装 Docker 或 Podman。使用 VM executor 运行 OCI 镜像时,可以显式指定: + +```bash +pvisor run --image ubuntu:latest -- COMMAND +``` + +未指定时 VM 也默认使用 `ubuntu:latest`。`--image-store DIR` 修改本地内容寻址缓存, +`--overlayfs-target` 选择 guest workspace,`--vm-rootfs DIR` 指向预先准备的 Linux rootfs。 +Linux 使用 KVM;Apple Silicon macOS 使用 HVF。从源码在 macOS 构建 VM 支持还需要 Zig: + +```bash +brew install zig +``` + +把这些选项当作独立的平台步骤。先完成 staged host workflow,再用已有 Run Bundle 对比不同 +执行环境的边界。 + +## 5. 选择下一步 + +- [运行第一个 Agent](pvisor/get-started.md) —— 暂存、审查并选择性应用修改。 +- [探索第一个 Dataset](pchronicle/get-started.md) —— 在准备真实 Source 前查询临时数据。 +- [选择工作流](overview.md) —— 按当前任务决定使用哪个产品。 +- [执行环境](pvisor/guides/execution.md) —— 比较 host、OCI 与 VM 的边界。 diff --git a/docs/src/zh/overview.md b/docs/src/zh/overview.md new file mode 100644 index 00000000..27e08394 --- /dev/null +++ b/docs/src/zh/overview.md @@ -0,0 +1,74 @@ +# 从你当前的问题开始 + +Persisting 有两个独立入口。先选择与你当前任务相符的入口,再沿着短路径完成一个有用结果。 + +## 我想运行 Agent,并审查它产生的修改 + +从 **pVisor** 开始。它为单个 Agent 提供 Run 独占 workspace,记录执行边界,并把文件修改 +留在 stage 中,直到你决定哪些内容进入真实项目。 + +1. [安装命令行工具](installation.md)。 +2. [运行第一个 Agent](pvisor/get-started.md)。 +3. [审查并选择性应用修改](pvisor/guides/review-apply.md)。 +4. [选择 host、OCI 或 VM 执行环境](pvisor/guides/execution.md)。 + +完成后,你应该得到一个已结束的 Run、一份可读的 Run Bundle,以及一个已经 apply 或 drop 的 +stage。 + +```bash +pvisor run --stage ./runs/task-001 -- codex +pvisor review last +pvisor apply last --path src +``` + +## 我已经有 Agent 轨迹数据 + +从 **pChronicle** 开始。它可以检查本地或对象存储中的数据,也可以导入支持的外部格式。第一 +个 walkthrough 会创建临时示例数据,因此无需先准备 Dataset 就能学习查询流程。 + +1. [探索第一个 Dataset](pchronicle/get-started.md)。 +2. [发现并查询自己的数据](pchronicle/guides/discover-and-query.md)。 +3. [导入或导出支持的格式](pchronicle/guides/exchange.md)。 +4. [在本地提供 Dataset 服务](pchronicle/guides/serve.md)。 + +完成后,你应该能执行只读查询,看到规范化视图,并明确所查看数据的 Source lineage。 + +```bash +pchronicle onboard query +pchronicle query ./trajectory-data \ + --sql 'SELECT source, COUNT(*) FROM dataset.steps GROUP BY source' +``` + +## 我想把执行和历史连接起来 + +等两个独立工作流都能运行后,再连接它们。配置 pVisor capture,把选定的 Gateway 轨迹事件和 +lifecycle record 发布到 pChronicle。这个交接是显式且有限的:它不会搬运私有 Run Bundle,也 +不会补造原始 Source 没有提供的 Evidence。 + +1. [捕获 Agent 轨迹](pvisor/guides/capture.md)。 +2. [理解 event 与 sidecar 契约](rfcs/0007-events-contract-pchronicle-sidecar.md)。 +3. [阅读从执行到历史的架构](system-design/architecture.md)。 + +```text +pVisor Run ── configured capture ──> canonical event Source ──> Dataset views +external trajectory Source ──────────────────────────────────> Dataset views +``` + +## 我需要先理解边界,再运行 Agent + +按这个顺序阅读核心概念: + +1. [Run、Attempt 与 Effect](pvisor/concepts/run-model.md) —— 稳定对象。 +2. [Capability 与 Evidence](pvisor/concepts/capabilities-and-evidence.md) —— Run 能够声明什么。 +3. [执行环境](pvisor/guides/execution.md) —— Provider 选择如何改变边界。 +4. [安全与 Evidence](system-design/security-evidence.md) —— 哪些内容会持久化,哪些仍留在本地。 + +整套文档遵循同一条规则:命令成功退出,不代表所有请求的 capability 都已 enforcement。 +Run Bundle 会记录实际生效的机制与限制。 + +## 继续阅读 + +- [pVisor 命令模型](pvisor/design/cli.md) +- [pVisor Case 目录](pvisor/reference/cases.md) +- [pChronicle 核心概念](pchronicle/concepts/index.md) +- [系统设计](system-design/index.md) diff --git a/docs/src/pchronicle/concepts/dataset-and-source.zh.md b/docs/src/zh/pchronicle/concepts/dataset-and-source.md similarity index 100% rename from docs/src/pchronicle/concepts/dataset-and-source.zh.md rename to docs/src/zh/pchronicle/concepts/dataset-and-source.md diff --git a/docs/src/pchronicle/concepts/facts-and-projections.zh.md b/docs/src/zh/pchronicle/concepts/facts-and-projections.md similarity index 100% rename from docs/src/pchronicle/concepts/facts-and-projections.zh.md rename to docs/src/zh/pchronicle/concepts/facts-and-projections.md diff --git a/docs/src/zh/pchronicle/concepts/index.md b/docs/src/zh/pchronicle/concepts/index.md new file mode 100644 index 00000000..36d69d01 --- /dev/null +++ b/docs/src/zh/pchronicle/concepts/index.md @@ -0,0 +1,21 @@ +# pChronicle 核心概念 + +pChronicle 围绕 **Dataset** 构建,Dataset 就是 path。查询历史或集成存储前,先理解这些概念。 + +:::note 什么时候阅读这里 +完成第一次查询后,如果你需要解释结果来自哪里、在调查期间固定 Snapshot,或区分 canonical +record 与派生视图,就从这里开始。 +::: + +请按以下顺序阅读: + +1. [Dataset、Source 与 Snapshot](dataset-and-source.md) 解释 path 如何寻址、固定版本并保持 + 一致读取。 +2. [记录数据、查询视图与派生版本](facts-and-projections.md) 区分 canonical fact 与用于查看、 + 交换的视图。 + +存储机制与当前实现属于 [pChronicle Design](../design/index.md)。接下来可以进入 +[常见工作流](../guides/index.md) 或 [命令行参考](../reference/cli.md)。 + +读完本节后,你应该能用 Dataset、Source 与 Snapshot 描述一个结果,而不是把查询输出当成 +无法追溯来源的文件。 diff --git a/docs/src/pchronicle/design/architecture.zh.md b/docs/src/zh/pchronicle/design/architecture.md similarity index 100% rename from docs/src/pchronicle/design/architecture.zh.md rename to docs/src/zh/pchronicle/design/architecture.md diff --git a/docs/src/pchronicle/design/catalog.zh.md b/docs/src/zh/pchronicle/design/catalog.md similarity index 100% rename from docs/src/pchronicle/design/catalog.zh.md rename to docs/src/zh/pchronicle/design/catalog.md diff --git a/docs/src/pchronicle/design/index.zh.md b/docs/src/zh/pchronicle/design/index.md similarity index 100% rename from docs/src/pchronicle/design/index.zh.md rename to docs/src/zh/pchronicle/design/index.md diff --git a/docs/src/pchronicle/design/storyline-lance.zh.md b/docs/src/zh/pchronicle/design/storyline-lance.md similarity index 100% rename from docs/src/pchronicle/design/storyline-lance.zh.md rename to docs/src/zh/pchronicle/design/storyline-lance.md diff --git a/docs/src/pchronicle/design/trajectory-storage.zh.md b/docs/src/zh/pchronicle/design/trajectory-storage.md similarity index 100% rename from docs/src/pchronicle/design/trajectory-storage.zh.md rename to docs/src/zh/pchronicle/design/trajectory-storage.md diff --git a/docs/src/pchronicle/get-started.zh.md b/docs/src/zh/pchronicle/get-started.md similarity index 82% rename from docs/src/pchronicle/get-started.zh.md rename to docs/src/zh/pchronicle/get-started.md index 5e974e6a..26533ca7 100644 --- a/docs/src/pchronicle/get-started.zh.md +++ b/docs/src/zh/pchronicle/get-started.md @@ -17,7 +17,9 @@ pchronicle onboard query 两条命令都不要求源码 checkout,也不要求已有 Dataset。 -## 2. 浏览自己的 Dataset +## 2. 浏览已有的 Dataset + +onboarding 创建的 Dataset 是临时数据,Walkthrough 结束后会被清理。要进行持久查询,请把下面的命令替换为你已有的 Dataset 路径;如果还没有数据,完成 onboarding 查询后继续阅读[发现并查询自己的 Dataset](guides/discover-and-query.md)即可。 Dataset 可以是本地路径、对象存储 URI 前缀,或 `@prod` 这样的用户 alias: @@ -56,7 +58,7 @@ pchronicle query ./trajectory-data \ - [发现并查询自己的 Dataset](guides/discover-and-query.md) - [导入或导出 Run](guides/exchange.md) -- [查看统一产品术语](reference/terminology.zh.md) +- [查看统一产品术语](reference/terminology.md) - [使用 alias 并查阅完整命令行](reference/cli.md) - [使用 pVisor 采集新 Run](../pvisor/guides/capture.md) - [理解 pChronicle 核心概念](concepts/index.md) diff --git a/docs/src/pchronicle/guides/discover-and-query.zh.md b/docs/src/zh/pchronicle/guides/discover-and-query.md similarity index 87% rename from docs/src/pchronicle/guides/discover-and-query.zh.md rename to docs/src/zh/pchronicle/guides/discover-and-query.md index 4ad85b0f..daecf98b 100644 --- a/docs/src/pchronicle/guides/discover-and-query.zh.md +++ b/docs/src/zh/pchronicle/guides/discover-and-query.md @@ -3,6 +3,10 @@ 当你已有本地路径、对象存储 URI 或 alias,希望先理解其中的 Run 数据再编写报告时,使用这个 工作流。 +:::tip 完成后你会得到什么 +你会知道 Dataset 包含哪些 Source、有哪些可用 relation,以及如何可复现地回答一个受资源限制的只读问题。 +::: + ## 1. 检查 Dataset ```bash @@ -24,6 +28,8 @@ pchronicle ls ./dataset --errors report pchronicle ls ./dataset --errors strict ``` +探索陌生数据时使用 `report`。在自动化任务中,如果不完整 Dataset 应该让任务失败而不是产生部分结果,再切换到 `strict`。 + ## 2. 从内建分析开始 ```bash diff --git a/docs/src/pchronicle/guides/exchange.zh.md b/docs/src/zh/pchronicle/guides/exchange.md similarity index 100% rename from docs/src/pchronicle/guides/exchange.zh.md rename to docs/src/zh/pchronicle/guides/exchange.md diff --git a/docs/src/pchronicle/guides/index.zh.md b/docs/src/zh/pchronicle/guides/index.md similarity index 100% rename from docs/src/pchronicle/guides/index.zh.md rename to docs/src/zh/pchronicle/guides/index.md diff --git a/docs/src/pchronicle/guides/serve-gateway.zh.md b/docs/src/zh/pchronicle/guides/serve-gateway.md similarity index 100% rename from docs/src/pchronicle/guides/serve-gateway.zh.md rename to docs/src/zh/pchronicle/guides/serve-gateway.md diff --git a/docs/src/pchronicle/guides/serve.zh.md b/docs/src/zh/pchronicle/guides/serve.md similarity index 100% rename from docs/src/pchronicle/guides/serve.zh.md rename to docs/src/zh/pchronicle/guides/serve.md diff --git a/docs/src/zh/pchronicle/guides/troubleshooting.md b/docs/src/zh/pchronicle/guides/troubleshooting.md new file mode 100644 index 00000000..9fc6f73c --- /dev/null +++ b/docs/src/zh/pchronicle/guides/troubleshooting.md @@ -0,0 +1,75 @@ +# 排查一个 Dataset + +每次排查 pChronicle 结果时都按相同顺序进行:先确认路径,再查看可见内容,最后缩小查询。 +这样可以区分 Dataset 缺失、结果为空和资源上限,而不是把它们看成同一个错误。 + +## 先确认 Dataset + +排查时先使用具体路径。alias 会增加一次解析步骤: + +```bash +pchronicle alias list +pchronicle status ./trajectory-data --format json +pchronicle ls ./trajectory-data --format json +``` + +如果 alias 失败,先解析 alias,再排查存储凭据或 SQL: + +```bash +pchronicle alias get-url prod +pchronicle status @prod --format json +``` + +Alias 只指向 Dataset,不会复制或移动底层数据。 + +## Dataset 能打开但看起来为空 + +在编写更复杂的过滤器前先看汇总: + +```bash +pchronicle analysis overview ./trajectory-data +pchronicle find ./trajectory-data --match "" --format json +``` + +空结果可能表示路径包含受支持格式但没有匹配记录,也可能是过滤器作用在错误的实体上,或 +Dataset 中的文件不是 pChronicle 可以识别的格式。overview 和 JSON metadata 会说明可见 +Source 与搜索模式。 + +## 查询没有返回行 + +先执行有上限的 count,再确认规范化表名: + +```bash +pchronicle query ./trajectory-data \ + --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' +pchronicle query ./trajectory-data \ + --sql 'SELECT source, COUNT(*) AS steps FROM dataset.steps GROUP BY source' +``` + +先用 `find` 定位 identity 或文本,再编写 join。Snapshot 会固定一次读取视图;如果两次命令 +之间数据发生变化,请记录 JSON 输出中的 Snapshot identifier,并在后续查询中复用。 + +## 查询触发资源上限 + +资源上限是公共查询契约的一部分。先缩小问题,再提高限制: + +```bash +pchronicle query ./trajectory-data \ + --sql 'SELECT source, COUNT(*) FROM dataset.steps GROUP BY source' \ + --max-output-rows 20 --timeout 10s +``` + +CI 中使用 `--file` 和明确的输出限制。需要更大预算时,应在调用工作流中说明原因,而不是 +静默移除保护。 + +## Source 格式不受支持 + +先查看[支持的格式](../reference/formats/index.md),再使用 exchange 指南导入为 pChronicle +可以规范化的 Dataset。导入不会补造缺失的 lineage 或 Evidence;需要追溯时,请保留原始 +Source 与规范化视图。 + +## 提交 issue 前 + +请提供 pChronicle 版本、Dataset 路径或 alias 名称(不要包含凭据)、`status --format json` 输出、 +完整查询和资源限制。对象存储还应说明 Provider 类型及 region 或 endpoint,但不要提供 access key +或签名 URL。 diff --git a/docs/src/pchronicle/guides/ui.zh.md b/docs/src/zh/pchronicle/guides/ui.md similarity index 98% rename from docs/src/pchronicle/guides/ui.zh.md rename to docs/src/zh/pchronicle/guides/ui.md index f4a83aef..eb3edf4d 100644 --- a/docs/src/pchronicle/guides/ui.zh.md +++ b/docs/src/zh/pchronicle/guides/ui.md @@ -7,7 +7,7 @@ Lance 存储。下面的截图和示例由这个命令直接生成: ./target/release/pchronicle serve tmp/test/ data/ --listen 127.0.0.1:9980 ``` -启动成功后访问 。这条命令挂载两个 Dataset;因为没有显式指定名称, +启动成功后访问 [http://127.0.0.1:9980/](http://127.0.0.1:9980/)。这条命令挂载两个 Dataset;因为没有显式指定名称, 界面使用路径末段,将它们显示为 `test` 和 `data`。需要让 SQL schema 和界面名称长期稳定时, 建议明确命名: diff --git a/docs/src/pchronicle/index.zh.md b/docs/src/zh/pchronicle/index.md similarity index 54% rename from docs/src/pchronicle/index.zh.md rename to docs/src/zh/pchronicle/index.md index 36fa41a2..12d1d387 100644 --- a/docs/src/pchronicle/index.zh.md +++ b/docs/src/zh/pchronicle/index.md @@ -6,6 +6,11 @@ Persisting 产生的运行记录,也可以直接读取受支持的外部格式 在 Persisting“从模型状态到 Agent 历史”的主线中,pChronicle 是 Agent 历史的持久存储与查询引擎。 它可以作为本地工具使用,也可以平台化部署在多条 path 前面。 +:::tip 你将完成什么 +第一次快速开始会创建临时数据,将它打开为 Dataset,运行一次只读摘要,再回答一个 SQL 问题。 +你不需要先准备生产存储,就能熟悉查询模型。 +::: + ## 你只需要面对 Dataset **Dataset 就是 path**:本地目录或文件,或对象存储 URI 前缀。pChronicle 发现并规范化该 @@ -37,26 +42,37 @@ pchronicle query ./trajectory-data \ --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' ``` -## 按任务选择命令 +## 选择下一步 + +第一次学习命令行时,从[探索第一个 Dataset](get-started.md)开始。这条路径会创建临时数据, +让你先完成一次只读查询,再接入真实 Source。 + +如果已经知道问题,可以直接进入对应路径: -| 我想要…… | 从这里开始 | -| --- | --- | -| 浏览 Dataset | `pchronicle ls DATASET` 或 `pchronicle status DATASET` | -| 运行常用分析 | `pchronicle analysis overview DATASET` | -| 用 SQL 提出自定义问题 | `pchronicle query DATASET --sql SQL` | -| 给 Dataset 设置短名称 | `pchronicle alias add NAME DATASET` | -| 导入或导出运行记录 | `pchronicle import` 或 `pchronicle export` | -| 使用 Codex 或 Claude 分析 | `pchronicle agent codex DATASET` | -| 打开本地只读 UI 和 API | [`pchronicle serve DATASET`](guides/ui.md) | +- **浏览 Dataset:** `pchronicle ls DATASET` 或 `pchronicle status DATASET` +- **运行常用分析:** `pchronicle analysis overview DATASET` +- **用 SQL 提问:** `pchronicle query DATASET --sql SQL` +- **给 Dataset 命名:** `pchronicle alias add NAME DATASET` +- **导入或导出记录:** [交换数据](guides/exchange.md) +- **使用 Agent 分析:** `pchronicle agent codex DATASET` +- **打开本地 UI 与 API:** [提供 Dataset 服务](guides/ui.md) pChronicle 读取并组织运行历史,不执行或调度 Agent。要在受控工作区中运行 Agent,请从 [pVisor](../pvisor/index.md)开始。 +## 推荐阅读顺序 + +1. [探索第一个 Dataset](get-started.md),先完成一次只读查询。 +2. 准备检查真实数据时,阅读[发现并查询](guides/discover-and-query.md)。 +3. 涉及受支持的外部格式时,阅读[交换数据](guides/exchange.md)。 +4. 其他工具需要本地访问时,阅读[提供 Dataset 服务](guides/serve.md)。 +5. 需要精确选项、预算或输出格式时,再查阅[命令行参考](reference/cli.md)。 + ## 继续阅读 - [探索第一个 Dataset](get-started.md) - [完成常见工作流](guides/index.md) - [查看完整命令行手册](reference/cli.md) -- [使用统一产品术语](reference/terminology.zh.md) +- [使用统一产品术语](reference/terminology.md) - [理解数据模型](concepts/index.md) - [了解存储与 Snapshot 设计](design/index.md) diff --git a/docs/src/pchronicle/reference/agenticmd.zh.md b/docs/src/zh/pchronicle/reference/agenticmd.md similarity index 100% rename from docs/src/pchronicle/reference/agenticmd.zh.md rename to docs/src/zh/pchronicle/reference/agenticmd.md diff --git a/docs/src/zh/pchronicle/reference/cases-platform.md b/docs/src/zh/pchronicle/reference/cases-platform.md new file mode 100644 index 00000000..93c99960 --- /dev/null +++ b/docs/src/zh/pchronicle/reference/cases-platform.md @@ -0,0 +1,92 @@ +# pChronicle 集群平台与 Catalog Server 场景 + +本文覆盖平台化部署。Catalog 配置只管理用户、Dataset 和授权;Warehouse 的服务参数仍由 `pchronicle serve` 提供。 + +## P01:从空配置创建 Catalog 用户 + +```bash +pchronicle serve catalog user create \ + --catalog-config ./catalog.toml alice +``` + +如果文件不存在,命令创建配置文件、生成用户 AK/SK,并只在本次输出 secret。 + +## P02:登记 Dataset + +```bash +pchronicle serve catalog dataset create \ + --catalog-config ./catalog.toml \ + prod s3://bucket/prod \ + --endpoint http://127.0.0.1:9000 \ + --region us-west-2 \ + --ak BACKEND_AK \ + --sk BACKEND_SK +``` + +该命令只登记 Dataset,不创建或删除后端数据。 + +## P03:授权用户 + +```bash +pchronicle serve catalog grant \ + --catalog-config ./catalog.toml \ + alice prod \ + --permission read \ + --permission query \ + --permission analyze +``` + +预期:配置中出现独立的 `[[grants]]` 记录。 + +## P04:启动 Catalog Server + +```bash +pchronicle serve \ + --catalog-config ./catalog.toml \ + --listen 127.0.0.1:8081 +``` + +父进程负责用户认证、Dataset 列表和 ticket;查询数据面在授权 mounts 的 worker 中执行。 + +## P05:访问授权 Dataset + +```bash +pchronicle alias add team catalog://127.0.0.1:8081 \ + --ak USER_AK --sk USER_SK +pchronicle query @team/prod \ + --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' +``` + +预期:授权用户可以查询 `prod`;未授权用户或未知 Dataset 返回相同的 404 资源错误。 + +## P06:撤销授权 + +```bash +pchronicle serve catalog revoke \ + --catalog-config ./catalog.toml \ + alice prod --permission query +``` + +预期:后续查询被拒绝,但 `read` 和其它仍保留的权限不受影响。 + +## P07:RustFS Warehouse 回归 + +准备 RustFS,并设置: + +```bash +export PCHRONICLE_RUSTFS_ENDPOINT=http://127.0.0.1:9000 +export PCHRONICLE_RUSTFS_ACCESS_KEY=rustfsadmin +export PCHRONICLE_RUSTFS_SECRET_KEY=rustfsadmin +export PCHRONICLE_RUSTFS_BUCKET=pchronicle-cases +``` + +然后运行 RustFS 回归测试,验证 Dataset 写入、Catalog discovery、SQL 查询、Explorer 和 refresh 行为。 + +平台验收重点: + +- Catalog 文件可从空文件开始构建; +- 用户、Dataset 和 grants 修改是确定性的; +- Dataset 后端凭据只在授权 ticket 中使用; +- Worker 只收到当前用户被授权的 mounts; +- Catalog refresh 不影响已完成查询的 snapshot; +- RustFS 上的 Warehouse 行为与本地 Dataset 一致。 diff --git a/docs/src/zh/pchronicle/reference/cases-self.md b/docs/src/zh/pchronicle/reference/cases-self.md new file mode 100644 index 00000000..c4138aeb --- /dev/null +++ b/docs/src/zh/pchronicle/reference/cases-self.md @@ -0,0 +1,65 @@ +# pChronicle 单机与自助使用场景 + +本文覆盖不依赖 Catalog Server 的基础工作流。每个案例都可以在一台开发机上独立执行,Dataset 可以是本地目录或对象存储 URI。 + +## 准备 + +```bash +mkdir -p /tmp/pchronicle-cases +cd /tmp/pchronicle-cases +pchronicle onboard +``` + +## S01:浏览本地 Dataset + +```bash +pchronicle ls ./trajectory-data +pchronicle status ./trajectory-data +``` + +预期:命令列出 Dataset 中的 runs、steps 和 tool calls;空 Dataset 返回明确的空结果。 + +## S02:执行 SQL 查询 + +```bash +pchronicle query ./trajectory-data \ + --sql 'SELECT COUNT(*) AS runs FROM dataset.runs' +``` + +预期:查询成功并返回确定的 runs 数量。 + +## S03:运行内建分析 + +```bash +pchronicle analysis overview ./trajectory-data +``` + +预期:输出运行数、步骤数、工具调用数和时间范围。 + +## S04:导入和导出 + +```bash +pchronicle import input.jsonl --output ./trajectory-data +pchronicle export ./trajectory-data --output output.jsonl +``` + +预期:导出内容可以再次导入,记录的 ID 和事件顺序保持一致。 + +## S05:本地 Warehouse + +```bash +pchronicle serve ./trajectory-data --listen 127.0.0.1:8081 +``` + +预期:Web UI、`/api/query/tables`、`/api/catalog` 和 Explorer API 可用;未启用 Catalog 时不需要用户凭据。 + +## S06:对象存储 Dataset + +```bash +export AWS_ENDPOINT_URL_S3=http://127.0.0.1:9000 +export AWS_ACCESS_KEY_ID=rustfsadmin +export AWS_SECRET_ACCESS_KEY=rustfsadmin +pchronicle ls s3://bucket/trajectory +``` + +预期:pChronicle 通过 S3 兼容接口发现并查询 Dataset。endpoint 和凭据不会写入 Dataset URI。 diff --git a/docs/src/pchronicle/reference/cli.zh.md b/docs/src/zh/pchronicle/reference/cli.md similarity index 91% rename from docs/src/pchronicle/reference/cli.zh.md rename to docs/src/zh/pchronicle/reference/cli.md index 8cded779..d317417c 100644 --- a/docs/src/pchronicle/reference/cli.zh.md +++ b/docs/src/zh/pchronicle/reference/cli.md @@ -6,6 +6,24 @@ `pchronicle` 用于浏览、查询、交换和服务 Agent Run Dataset。它既适合人在终端中探索, 也适合 shell、CI 和 Agent 发起受资源上限保护的只读分析。 +## 按任务查找命令 + +- **先体验产品:** `pchronicle onboard query` 使用临时示例数据,不需要 Dataset 路径。 +- **检查 Dataset:** 先用 `ls` 和 `analysis overview`,再编写 SQL。 +- **定位 Run 或文本:** 使用 `find --run-id`、`--session-id` 或 `--match`。 +- **提出可复现问题:** 使用 `query --sql` 或 `query --file`,并显式设置输出与资源上限。 +- **提供历史服务:** 先完成只读查询,再阅读[服务指南](../guides/serve.md)使用 `serve`。 + +第一次使用可以复制: + +```bash +pchronicle onboard query +pchronicle ls ./trajectory-data +pchronicle query ./trajectory-data --sql 'SELECT COUNT(*) FROM dataset.runs' +``` + +后两条命令要求你已有 Dataset;如果还没有数据,完成 `onboard query` 后继续阅读[Dataset 入门](../get-started.md)。 + 如果你第一次使用 pChronicle,可以从这里开始: ```bash @@ -412,7 +430,7 @@ pchronicle serve \ 未指定服务 flag 时,只读 Web/API 默认监听 `127.0.0.1:0`。多个 Dataset 使用 `NAME=DATASET` mount;Control 模式要求名为 `default` 的 mount。`--catalog-config FILE` -以 Directory 方式服务,父进程不打开 libraries;配合 +以 Directory 方式服务,父进程不打开 Datasets;配合 `alias add NAME catalog://127.0.0.1:PORT --ak --sk`。 `pchronicle serve catalog issue|grant|revoke` 只改该文件、不启动 HTTP;`issue` 把用户 sk 只打印一次。改用户或授权后必须重启 serve。`catalog` 是 `serve` 的保留子命令,挂载同名 @@ -428,6 +446,25 @@ source 的最新 canonical manifest,正在进行中的 trace 不需要等待 p `--gateway-state`。所有 listener 只允许 loopback;服务准备完成后,stdout 输出一行版本化 readiness JSON,endpoint 和诊断写 stderr。 +#### Catalog 管理 + +Catalog 配置只包含用户、Dataset 和授权关系。配置文件不存在时,管理命令会自动创建。 + +```text +pchronicle serve catalog user create --catalog-config FILE NAME +pchronicle serve catalog user list --catalog-config FILE +pchronicle serve catalog user remove --catalog-config FILE NAME +pchronicle serve catalog dataset create --catalog-config FILE NAME URI [OPTIONS] +pchronicle serve catalog dataset list --catalog-config FILE +pchronicle serve catalog dataset show --catalog-config FILE NAME +pchronicle serve catalog dataset remove --catalog-config FILE NAME +pchronicle serve catalog grant --catalog-config FILE USER DATASET --permission PERMISSION... +pchronicle serve catalog revoke --catalog-config FILE USER DATASET --permission PERMISSION... +pchronicle serve catalog grants --catalog-config FILE +``` + +`user create` 生成 AK/SK 并只显示一次 secret;`dataset create` 只登记 URI 和存储凭据,不删除或创建后端数据;`grant`/`revoke` 管理 `read`、`query`、`analyze`、`write`、`admin` 权限。 + ### 公共输出与退出状态 stdout 只包含命令结果、导出内容或 readiness JSON;stderr 包含 Dataset 版本 metadata、warning、 diff --git a/docs/src/pchronicle/reference/formats/index.zh.md b/docs/src/zh/pchronicle/reference/formats/index.md similarity index 100% rename from docs/src/pchronicle/reference/formats/index.zh.md rename to docs/src/zh/pchronicle/reference/formats/index.md diff --git a/docs/src/pchronicle/reference/index.zh.md b/docs/src/zh/pchronicle/reference/index.md similarity index 90% rename from docs/src/pchronicle/reference/index.zh.md rename to docs/src/zh/pchronicle/reference/index.md index a9aab035..cd1b8b46 100644 --- a/docs/src/pchronicle/reference/index.zh.md +++ b/docs/src/zh/pchronicle/reference/index.md @@ -1,7 +1,7 @@ # pChronicle Reference - [`pchronicle` 命令行设计与使用指南](cli.md) -- [产品术语](terminology.zh.md) +- [产品术语](terminology.md) - [Query Model](query-model.md) - [AgenticMD 格式](agenticmd.md) - [运行数据格式与 RFC](formats/index.md) diff --git a/docs/src/pchronicle/reference/query-model.zh.md b/docs/src/zh/pchronicle/reference/query-model.md similarity index 100% rename from docs/src/pchronicle/reference/query-model.zh.md rename to docs/src/zh/pchronicle/reference/query-model.md diff --git a/docs/src/pchronicle/reference/terminology.zh.md b/docs/src/zh/pchronicle/reference/terminology.md similarity index 100% rename from docs/src/pchronicle/reference/terminology.zh.md rename to docs/src/zh/pchronicle/reference/terminology.md diff --git a/docs/src/project/engineering.zh.md b/docs/src/zh/project/engineering.md similarity index 87% rename from docs/src/project/engineering.zh.md rename to docs/src/zh/project/engineering.md index 1e23da09..73b0229a 100644 --- a/docs/src/project/engineering.zh.md +++ b/docs/src/zh/project/engineering.md @@ -12,16 +12,16 @@ | `just test` | 通过 `cargo nextest` 跑工作区 Rust 测试,再跑 Python 套件 | | `just test ` | 单个 crate 或 Cargo package(例如 `pvisor` 或 `persisting-pvisor`) | | `just docs-sync` | 安装锁定的文档环境 | -| `just docs-serve` | 本地 MkDocs 预览,带自动重载 | -| `just docs-serve-dirty` | 自动重载卡住时用 `--dirtyreload` 预览 | +| `just docs-serve` | 本地 Docusaurus 预览,文件修改时自动刷新 | +| `just docs-serve-dirty` | 自动重载卡住时重新启动 Docusaurus 预览 | | `just docs-build` | 构建静态文档站点 | -| `just docs-links` | 严格 MkDocs 构建,死链即失败 | -| `just examples` | 全部产品示例套件(pVisor、pChronicle 与 pPilot) | +| `just docs-links` | Docusaurus 生产构建,并检查断链 | +| `just examples` | pVisor 与 pChronicle 产品示例套件 | | `just gate` | 格式化、lint 以及完整 Rust 测试工作区 | | `just dev` | 限定范围的 runtime crate 检查;不是完整工作区矩阵 | `just test` 使用 debug nextest profile 以便更快迭代。传入 Cargo package 名 -或短 crate 别名(`pvisor`、`ppilot`、`pchronicle`、`pchronicle-cli`、 +或短 crate 别名(`pvisor`、`pchronicle`、`pchronicle-cli`、 `agentctl`、`capture`)。无参数形式还会跑 `just test-py`。 ## 当前笔记 @@ -68,6 +68,6 @@ Sanitizer 构建故意不进入 `just dev` / CI 的默认路径:它们会重 只适合聚焦的调试会话。 支持的行为请从 [pVisor 指南](../pvisor/guides/index.md)、 -[pPilot 编排](../ppilot/guides/orchestrate.md) 或 +批量 Run 编排 或 [pChronicle 指南](../pchronicle/guides/index.md) 开始,实现理由见 [系统架构](../system-design/index.md)。 diff --git a/docs/src/project/examples.zh.md b/docs/src/zh/project/examples.md similarity index 91% rename from docs/src/project/examples.zh.md rename to docs/src/zh/project/examples.md index 743bea1f..2eb6ce58 100644 --- a/docs/src/project/examples.zh.md +++ b/docs/src/zh/project/examples.md @@ -8,7 +8,6 @@ just examples just examples-pvisor just examples-pchronicle -just examples-ppilot ``` ## pVisor @@ -20,7 +19,7 @@ just examples-ppilot | `03-network-isolation` | 显式代理策略及其边界 | | `04-gateway-llm-control` | 内嵌 Gateway 路由与捕获 | -## pPilot +## orchestration layer | 示例 | 可复现结论 | |---|---| @@ -46,9 +45,9 @@ Python 3 和 `jq` 等常见 POSIX 工具;pVisor 文件系统示例另需 macFU `just examples-pvisor-portable` 运行不需要 FUSE 的 03/04。 建议从 `pvisor/01-filesystem-isolation` 开始,再进入 changeset management;需要多 Run -生产时运行 pPilot 示例;准备从执行进入历史时,再运行 pChronicle 示例。 +生产时运行 orchestration layer 示例;准备从执行进入历史时,再运行 pChronicle 示例。 任务解释见 [pVisor Guides](../pvisor/guides/index.md),多 Run 工作流见 -[pPilot 编排](../ppilot/guides/orchestrate.md),Dataset 工作流见 +批量 Run 工作流见 [pChronicle Guides](../pchronicle/guides/index.md)。示例用于验证产品路径;精确命令语法仍以 各产品 Reference 为准。 diff --git a/docs/src/project/index.zh.md b/docs/src/zh/project/index.md similarity index 76% rename from docs/src/project/index.zh.md rename to docs/src/zh/project/index.md index 614a038c..ea75ca3e 100644 --- a/docs/src/project/index.zh.md +++ b/docs/src/zh/project/index.md @@ -1,7 +1,7 @@ # Project Persisting 的公共定位横跨模型状态与 Agent 历史。这一节记录交付状态、稳定决策、贡献者 -工作流,以及不在当前 pVisor、pPilot 与 pChronicle 主路径中的独立系统。 +工作流,以及不在当前 pVisor 与 pChronicle 主路径中的独立系统。 ## 架构 @@ -25,8 +25,8 @@ Persisting 的公共定位横跨模型状态与 Agent 历史。这一节记录 Queue 及其 Python API 独立于 Agent 执行主路径: -- [Queue 指南](../guide/queue.md) -- [Queue API](../api/queue.md) -- [自定义 Queue backend](../guide/custom-backends.md) +- Queue 指南 +- Queue API remains outside the default product documentation +- 自定义 Queue backend 保持在默认产品文档范围之外 历史 Queue 时代的设计笔记保留在仓库的 `docs/archive/` 目录中,不进入发布站点。 diff --git a/docs/src/project/releasing.zh.md b/docs/src/zh/project/releasing.md similarity index 100% rename from docs/src/project/releasing.zh.md rename to docs/src/zh/project/releasing.md diff --git a/docs/src/pvisor/concepts/agentvisor.zh.md b/docs/src/zh/pvisor/concepts/agentvisor.md similarity index 100% rename from docs/src/pvisor/concepts/agentvisor.zh.md rename to docs/src/zh/pvisor/concepts/agentvisor.md diff --git a/docs/src/pvisor/concepts/capabilities-and-evidence.zh.md b/docs/src/zh/pvisor/concepts/capabilities-and-evidence.md similarity index 100% rename from docs/src/pvisor/concepts/capabilities-and-evidence.zh.md rename to docs/src/zh/pvisor/concepts/capabilities-and-evidence.md diff --git a/docs/src/zh/pvisor/concepts/index.md b/docs/src/zh/pvisor/concepts/index.md new file mode 100644 index 00000000..1310fe35 --- /dev/null +++ b/docs/src/zh/pvisor/concepts/index.md @@ -0,0 +1,22 @@ +# pVisor 核心概念 + +pVisor 围绕 **Agent Run** 构建,而不是围绕进程、Container 或虚拟机。比较 Provider 或 +解释 Run Bundle 前,先理解这些概念。 + +:::note 什么时候阅读这里 +完成第一次 Run 后,如果你需要知道实际隔离了什么、哪些修改仍在 stage 中,或为什么不同执行 +Provider 的保证不同,就从这里开始。 +::: + +请按以下顺序阅读: + +1. [什么是 AgentVisor?](agentvisor.md) 解释产品类别,以及 Agent 与运行时之间的边界。 +2. [Run、Attempt 与 Effect](run-model.md) 定义可以跨进程和 Provider 保留的稳定对象。 +3. [Capability 与 Evidence](capabilities-and-evidence.md) 解释请求如何变成实际机制,以及如何 + 写入 Run Bundle。 + +品类文章不绑定具体实现;Run 和 capability 文章定义 pVisor 稳定的用户模型;平台机制与 +当前缺口属于 [pVisor Design](../design/index.md)。 + +读完本节后,你应该能查看 Run Bundle,并区分请求的 capability 与实际生效的 capability。 +准备做 Provider 或 policy 决策时,继续阅读[实用指南](../guides/index.md)。 diff --git a/docs/src/pvisor/concepts/run-model.zh.md b/docs/src/zh/pvisor/concepts/run-model.md similarity index 100% rename from docs/src/pvisor/concepts/run-model.zh.md rename to docs/src/zh/pvisor/concepts/run-model.md diff --git a/docs/src/zh/pvisor/design/cli.md b/docs/src/zh/pvisor/design/cli.md new file mode 100644 index 00000000..01eb1a64 --- /dev/null +++ b/docs/src/zh/pvisor/design/cli.md @@ -0,0 +1,87 @@ +# pVisor 命令模型 + +`pvisor` 是单个受治理 Agent Run 的公共入口。命令接口围绕四类责任组织:启动 Run、查看 +记录、决定 staged change 的去向,以及管理可复用环境。命令行与 `RunConfig` 描述同一个 +模型;配置文件必须显式传入,不会被当作隐式项目策略。 + +## 使用 `run` 启动 + +短写法与完整写法等价: + +```bash +pvisor -- codex +pvisor run --stage ./runs/task-001 -- codex +``` + +需要保留文件修改以便审查时使用 `--stage`。不指定 stage 时,pVisor 仍会记录 Run,但不会 +产生可供 apply 的持久 workspace changeset。选中的 host、container 或 VM Provider 会在 +Run Bundle 中分别记录实际 capability 与限制。 + +常用控制按目的分组: + +| 目的 | 选项 | 结果 | +| --- | --- | --- | +| Workspace | `--stage`、`--overlayfs-path`、`--overlayfs-compose` | 创建 COW 视图并保留 changeset | +| Runtime | `--executor host\|container\|vm`、`--rootfs`、`--container-image` | 选择执行 Provider 与 rootfs | +| Network | `--overlaynet-deny-all`、`--overlaynet-allow`、`--overlaynet-limit` | 请求 deny、allowlist 或限速策略 | +| Gateway | `--gateway-mode`、`--gateway-route`、`--gateway-level` | 配置路由,并按需捕获模型流量 | +| Limits | `--timeout`、`--memory`、`--max-processes`、`--max-open-files` | 在 Provider 支持时限制 Attempt | +| Configuration | `--spec`、`--name`、`--pass-env` | 提供 RunSpec、身份和显式环境变量 | + +Provider 选择不会改变 Run 契约,只会改变各 capability 维度的 enforcement 机制;最终 +Evidence 会分维度记录。 + +## 查看并决定 + +完成后的 Run 仍然是一个记录,staged effect 必须显式接受或丢弃: + +```bash +pvisor review last +pvisor inspect last -- git status --short +pvisor apply last --path src +pvisor apply last --include 'tests/**' --exclude 'tests/generated/**' +pvisor apply last --all +# 或:pvisor drop last +``` + +`review` 解释 Run Bundle 与 staged change;`inspect` 在 Run 视图中执行只读命令;`apply` +提交选定路径并保留其余内容;`drop` 丢弃 stage。两者都不会修改正在运行的 Run。重置会 +创建新的 stage generation,避免旧 metadata 覆盖新的决定。 + +## Checkpoint 与 Fork + +Checkpoint 保证停止一致的 filesystem 与 AgentCtl safe point,但不保存进程内存: + +```bash +pvisor checkpoint last --name before-experiment +pvisor fork last --checkpoint before-experiment -- codex +``` + +Checkpoint 会等待参与的 AgentCtl session 进入 quiesce,记录 upper layer 与 lineage,然后 +恢复 Run。 + +## 可复用环境 + +`env` 为具名 stage 提供跨命令的稳定生命周期: + +```bash +pvisor env create dev --target ./project +pvisor env exec dev -- make test +pvisor env shell dev +pvisor env inspect dev -- git status --short +pvisor env apply dev --path src +pvisor env drop dev +pvisor env delete dev --force +``` + +Environment 是持久 stage,不是常驻 VM。`start` 与 `stop` 控制是否接受新的 session; +`apply` 与 `drop` 完成决定后会推进 stage generation。 + +## 配置优先级 + +`--spec` 接受 TOML `RunConfig` 或准备好的 JSON `RunSpec`。显式 scalar 选项覆盖文件值; +重复的 list 选项替换整个列表;`--` 后的命令替换 `run.command`。`--container-image` 与 +`--rootfs` 可以推断匹配的 executor;自动化场景仍建议显式指定 `--executor`。 + +公共工作流保持简单:启动 Run,检查 Evidence,然后明确决定 staged effect 的去向。Provider +行为见[执行环境](../guides/execution.md),完整选项见 [CLI 参考](../reference/cli.md)。 diff --git a/docs/src/pvisor/design/gateway.zh.md b/docs/src/zh/pvisor/design/gateway.md similarity index 100% rename from docs/src/pvisor/design/gateway.zh.md rename to docs/src/zh/pvisor/design/gateway.md diff --git a/docs/src/pvisor/design/index.zh.md b/docs/src/zh/pvisor/design/index.md similarity index 88% rename from docs/src/pvisor/design/index.zh.md rename to docs/src/zh/pvisor/design/index.md index b3a295cf..d89c0f7d 100644 --- a/docs/src/pvisor/design/index.zh.md +++ b/docs/src/zh/pvisor/design/index.md @@ -7,7 +7,7 @@ | Provider 组合与安全属性 | [隔离架构](isolation.md) | | VM 透明截获与规划中的 host 截获 | [OverlayNet](overlaynet.md) | | 模型路由、capture 与 event emission | [Gateway](gateway.md) | -| 产品命令模型与生命周期语义 | [CLI 设计](cli.zh.md) | +| 产品命令模型与生命周期语义 | [CLI 设计](cli.md) | 跨产品的 Run 与历史 ownership 见 [System Design](../../system-design/index.md)。面向用户的 行为以 [pVisor 使用指南](../guides/index.md)为准,而不是以设计文档中的 roadmap 为准。 diff --git a/docs/src/pvisor/design/isolation.zh.md b/docs/src/zh/pvisor/design/isolation.md similarity index 100% rename from docs/src/pvisor/design/isolation.zh.md rename to docs/src/zh/pvisor/design/isolation.md diff --git a/docs/src/pvisor/design/overlaynet.zh.md b/docs/src/zh/pvisor/design/overlaynet.md similarity index 100% rename from docs/src/pvisor/design/overlaynet.zh.md rename to docs/src/zh/pvisor/design/overlaynet.md diff --git a/docs/src/pvisor/get-started.zh.md b/docs/src/zh/pvisor/get-started.md similarity index 97% rename from docs/src/pvisor/get-started.zh.md rename to docs/src/zh/pvisor/get-started.md index df49754a..0bed4b3f 100644 --- a/docs/src/pvisor/get-started.zh.md +++ b/docs/src/zh/pvisor/get-started.md @@ -8,7 +8,7 @@ Wheel 会同时安装 Persisting 当前的命令行入口: ```bash -pip install persisting[lance] +pip install persisting ``` 也可以安装当前 nightly build: @@ -37,7 +37,7 @@ pchronicle --help 进入项目目录: ```bash -pvisor -- codex +pvisor run --stage ./runs/task-001 -- codex ``` 也可以把 `codex` 换成其他 Agent 命令。`--stage ./runs/task-001` 为 workspace 写入创建 Run 独占 stage, diff --git a/docs/src/pvisor/guides/capture.zh.md b/docs/src/zh/pvisor/guides/capture.md similarity index 100% rename from docs/src/pvisor/guides/capture.zh.md rename to docs/src/zh/pvisor/guides/capture.md diff --git a/docs/src/pvisor/guides/execution.zh.md b/docs/src/zh/pvisor/guides/execution.md similarity index 100% rename from docs/src/pvisor/guides/execution.zh.md rename to docs/src/zh/pvisor/guides/execution.md diff --git a/docs/src/pvisor/guides/index.zh.md b/docs/src/zh/pvisor/guides/index.md similarity index 69% rename from docs/src/pvisor/guides/index.zh.md rename to docs/src/zh/pvisor/guides/index.md index 6be86991..7578381c 100644 --- a/docs/src/pvisor/guides/index.zh.md +++ b/docs/src/zh/pvisor/guides/index.md @@ -2,6 +2,11 @@ 先沿着一个 Run 的生命周期阅读,需要时再把执行连接到持久历史。 +:::note 先按结果选择 +下面每篇指南都围绕一个具体任务展开。先选择当前最需要的结果,并在操作过程中保留 Run Bundle; +它是当前平台实际安装了哪些控制机制的权威记录。 +::: + 1. [选择执行环境](execution.md)。 2. [审查并选择性应用 filesystem Effect](review-apply.md)。 3. [控制网络访问](network.md)。 diff --git a/docs/src/pvisor/guides/network.zh.md b/docs/src/zh/pvisor/guides/network.md similarity index 100% rename from docs/src/pvisor/guides/network.zh.md rename to docs/src/zh/pvisor/guides/network.md diff --git a/docs/src/pvisor/guides/review-apply.zh.md b/docs/src/zh/pvisor/guides/review-apply.md similarity index 81% rename from docs/src/pvisor/guides/review-apply.zh.md rename to docs/src/zh/pvisor/guides/review-apply.md index 2d96da2c..349c614e 100644 --- a/docs/src/pvisor/guides/review-apply.zh.md +++ b/docs/src/zh/pvisor/guides/review-apply.md @@ -4,6 +4,11 @@ Agent 可以在 staged workspace 内自由工作,但不会自动获得修改 结束后,由你决定哪些 Effect 可以跨过这条边界。这个工作流应用文件系统 [Effect 模型](../concepts/run-model.md)。 +:::note 开始前 +你需要一个项目目录和一个可以运行 Agent 的命令。如果还没有完成第一次运行,请先完成[运行第一个 Agent](../get-started.md)。 +下面的流程假设你希望手动决定 staged 修改何时进入基础项目。 +::: + ## 使用 manual stage 运行 最短命令是: @@ -63,6 +68,11 @@ pvisor apply last --all pvisor drop last ``` +:::tip 验证结果 +每次批量 apply 后,都要对比 staged view 与基础项目。`apply` 成功只表示选中的、依赖闭包完整的批次已经跨过边界, +不表示所有剩余 Effect 都已应用。 +::: + ## 从已接受状态继续 开始下一条工作线之前创建 checkpoint: diff --git a/docs/src/pvisor/guides/sandbox-replay.zh.md b/docs/src/zh/pvisor/guides/sandbox-replay.md similarity index 100% rename from docs/src/pvisor/guides/sandbox-replay.zh.md rename to docs/src/zh/pvisor/guides/sandbox-replay.md diff --git a/docs/src/zh/pvisor/guides/troubleshooting.md b/docs/src/zh/pvisor/guides/troubleshooting.md new file mode 100644 index 00000000..61098310 --- /dev/null +++ b/docs/src/zh/pvisor/guides/troubleshooting.md @@ -0,0 +1,69 @@ +# 排查一次 Run + +Run 没有按预期工作时,先查看 Run Bundle,不要立即用更强的参数重复命令。 +Bundle 会记录请求的边界、实际安装的机制,以及限制 Run 能够声称的警告。 + +## 先做三个只读检查 + +在启动 Agent 的项目目录中执行: + +```bash +pvisor status last +pvisor inspect last -- git status --short +pvisor review last +``` + +`status` 告诉你 Run 仍在运行还是已经停止;`inspect` 在 Run view 中执行只读命令, +可以区分 staged 修改与真实项目中的修改;`review` 展示持久化 Run Bundle 和 Evidence, +帮助你在 apply 或 drop 之前做决定。 + +## Agent 直接修改了项目 + +先检查启动命令是否使用 stage: + +```bash +pvisor run --stage ./runs/task-001 -- AGENT_COMMAND +``` + +不使用 stage 时,host executor 仍可能提供 safe-best-effort 控制,但不会产生可以审查和 +选择性 apply 的 staged filesystem Effect。如果本来就需要 stage,请检查记录的 stage 路径和 +executor warning,再重新执行。 + +## 请求的 capability 没有被强制执行 + +把请求参数理解为意图,而不是证据。打开 Run Bundle,查看实际 capability record 与对应机制。 +不同操作系统和 executor 的支持范围不同;例如 cooperative network proxy 不能保证所有 +ambient connection 都被阻断。 + +继续阅读[Capabilities 与 Evidence](../concepts/capabilities-and-evidence.md)和[执行环境](execution.md)。 + +## stage 为空或出现了错误文件 + +先检查命令工作目录和 stage 路径: + +```bash +pvisor inspect last -- pwd +pvisor inspect last -- git status --short +``` + +Agent 修改的是 Run-owned view。写入该 view 之外的路径可能被记录为 external Effect,也可能 +无法被 executor 提供。保持 stage 位于预期项目边界内,不要只按文件名比较生成的 Run 目录与项目根目录。 + +## capture 或 Dataset 输出缺失 + +执行审查和轨迹捕获是两个独立决策。先确认 Run 已完成且 Bundle 可读,再使用 pChronicle 检查 +capture 配置和目标 Dataset: + +```bash +pchronicle ls ./trajectory-data +pchronicle analysis overview ./trajectory-data +``` + +如果 Dataset 不存在,阅读[捕获 Agent 轨迹](capture.md),确认目标路径后再启动新的 Run。 +本地 Run Bundle 不会自动变成 pChronicle Dataset。 + +## 提交 issue 前 + +请提供 pVisor 版本、操作系统、executor、完整命令,以及相关的 `status` 和 `review` 输出, +并移除凭据和私有 workspace 内容。最有帮助的问题描述会说明请求了什么 capability、Bundle +记录了什么机制,以及实际结果在哪里不同。 diff --git a/docs/src/pvisor/index.zh.md b/docs/src/zh/pvisor/index.md similarity index 51% rename from docs/src/pvisor/index.zh.md rename to docs/src/zh/pvisor/index.md index f561977f..fc114fe5 100644 --- a/docs/src/pvisor/index.zh.md +++ b/docs/src/zh/pvisor/index.md @@ -5,6 +5,11 @@ 在 Persisting“从模型状态到 Agent 历史”的主线中,pVisor 负责一个 Run 的执行边界与可审查记录。 +:::tip 你将完成什么 +完成第一次快速开始后,你会得到一个由 Run 拥有的 stage、一份解释实际控制机制的 Run Bundle, +以及一次明确的选择:应用或丢弃产生的 filesystem Effect。 +::: + pVisor 不替代 Agent 自己的推理循环。你可以继续使用已有的 Agent CLI、脚本和 framework。 ## 运行、审查、决定 @@ -12,7 +17,7 @@ pVisor 不替代 Agent 自己的推理循环。你可以继续使用已有的 Ag 在项目目录中运行: ```bash -pvisor -- codex +pvisor run --stage ./runs/task-001 -- codex pvisor review last pvisor apply last --path src ``` @@ -29,20 +34,32 @@ pvisor drop last 具体的文件系统和网络边界取决于平台与 executor。pVisor 会记录实际生效的控制机制,不会把一个 Run 描述得比它实际拥有的隔离程度更高。 -## 按任务继续 +## 选择下一步 + +第一次使用时,从[运行第一个 Agent](get-started.md)开始。这条路径会以一份已审查的 stage +结束,并介绍其余文档使用的核心术语。 + +如果已经知道目标,可以直接进入对应路径: -| 我想要…… | 从这里开始 | -| --- | --- | -| 完成一个 staged Agent Run | [运行第一个 Agent](get-started.md) | -| 审查并选择性接受变更 | [审查和应用](guides/review-apply.md) | -| 选择 host、container 或 VM | [执行布局](guides/execution.md) | -| 控制网络访问 | [网络策略](guides/network.md) | -| 采集轨迹数据 | [采集轨迹](guides/capture.md) | -| 查找精确命令语法 | [命令行参考](reference/cli.md) | +- **保留或丢弃修改:** [审查和应用](guides/review-apply.md) +- **比较 host、container 与 VM:** [执行布局](guides/execution.md) +- **限制网络访问:** [网络策略](guides/network.md) +- **发布轨迹 event:** [采集轨迹](guides/capture.md) +- **查找精确选项:** [命令行参考](reference/cli.md) pVisor 的本地 run—review—apply 闭环可以独立工作。pChronicle 是可选项:当你希望在 Run 结束后保留并查询轨迹 Dataset 时再使用它。 +## 推荐阅读顺序 + +第一次使用时按下面的顺序阅读: + +1. [运行第一个 Agent](get-started.md),完成一次完整成功闭环。 +2. 需要更细地控制修改时,阅读[审查和应用](guides/review-apply.md)。 +3. 执行 Provider 会影响边界时,阅读[执行布局](guides/execution.md)。 +4. 需要解释 Run Bundle 时,阅读[Capability 与 Evidence](concepts/capabilities-and-evidence.md)。 +5. 只有需要精确选项或输出字段时,再查阅[命令行参考](reference/cli.md)。 + ## 继续阅读 - [运行第一个 Agent](get-started.md) diff --git a/docs/src/pvisor/reference/cases.zh.md b/docs/src/zh/pvisor/reference/cases.md similarity index 100% rename from docs/src/pvisor/reference/cases.zh.md rename to docs/src/zh/pvisor/reference/cases.md diff --git a/docs/src/pvisor/reference/cli.zh.md b/docs/src/zh/pvisor/reference/cli.md similarity index 95% rename from docs/src/pvisor/reference/cli.zh.md rename to docs/src/zh/pvisor/reference/cli.md index 954b0cae..3a5d039d 100644 --- a/docs/src/pvisor/reference/cli.zh.md +++ b/docs/src/zh/pvisor/reference/cli.md @@ -4,6 +4,25 @@ Host、OCI VM 和透明 host-rootfs VM 的完整命令示例见 [使用 pVisor 运行工作负载](../guides/execution.md)。 +## 按任务查找命令 + +- **运行 Agent:** 从[`pvisor run`](../get-started.md)开始,再用 `review`、 + `inspect` 和 `apply` 决定哪些修改进入项目。 +- **理解执行边界:** 使用 `status` 和 `inspect`,然后阅读[执行指南](../guides/execution.md)。 +- **保留工作区:** 用 `env create` 和 `env exec` 管理可复用的 staged environment, + 用 `env apply` 或 `env drop` 收尾。 +- **继续轨迹:** 只有在已有受支持轨迹时才使用 `replay`,先阅读[回放指南](../guides/sandbox-replay.md)。 + +第一次使用时,先复制最小闭环: + +```bash +pvisor run --stage ./runs/task-001 -- codex +pvisor review last +pvisor apply last --path src +``` + +下面的参考按 Run 生命周期组织;每组参数都配有验证下一步。 + ```text pvisor ├── run execute one Agent Run diff --git a/docs/src/pvisor/reference/index.zh.md b/docs/src/zh/pvisor/reference/index.md similarity index 74% rename from docs/src/pvisor/reference/index.zh.md rename to docs/src/zh/pvisor/reference/index.md index 8596fcca..d6fdfe66 100644 --- a/docs/src/pvisor/reference/index.zh.md +++ b/docs/src/zh/pvisor/reference/index.md @@ -1,6 +1,7 @@ # pVisor Reference - [`pvisor` 命令参考](cli.md) +- [Case catalog](cases.md) — 可执行的 Provider 边界验证场景 命令参考描述当前公共 surface。概念见 [pVisor Concepts](../concepts/index.md),机制与已知 缺口见 [pVisor Design](../design/index.md)。 diff --git a/docs/src/zh/rfcs/0001-storyline-format.md b/docs/src/zh/rfcs/0001-storyline-format.md new file mode 100644 index 00000000..3db28742 --- /dev/null +++ b/docs/src/zh/rfcs/0001-storyline-format.md @@ -0,0 +1,271 @@ +# RFC-0001: Storyline Format + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Format** | `storyline` | +| **Date** | 2026-07-30 | +| **Component** | pChronicle (`persisting-pchronicle`) | +| **Implements** | `crates/persisting-pchronicle/src/formats/storyline.rs` | +| **Related** | [RFC-0002 Events](0002-events-format.md) · [RFC-0004 ACTF](0004-actf-format.md) · [RFC-0008 ATIF](0008-atif-format.md) · [RFC-0009 OpenAI Messages](0009-openai-messages-format.md) | + +--- + +## 摘要 + +**Storyline** 是 pChronicle 的**枢纽 interchange**:以 Harbor **ATIF-v1.7** 的 Trajectory / Step 折叠语义为基准,加上少量 hub 便利字段(短名 wire、性能顶栏、可选子会话外链)。 + +捕获侧:`HTTP → events 流`(可 **记录** 到 `events.lance`,也可 **触发** handler);handler 经 storyline 做格式转换与落盘。外围格式(`agenticmd` / `openai_msg` / `atif` / `actf`)**只与 storyline 互转**。 + +Storyline **不是**事实源。Canonical 事实仍是 `events.lance`。 + +```text +events ──┐ +agenticmd ┼──► storyline ──► … +openai_msg┤ +atif ─────┘ +``` + +--- + +## 设计原则 + +1. **ATIF-first**:根对象 ≈ Trajectory,`turns[]` ≈ `steps[]`;能 1:1 的字段保持同义。 +2. **Hub-only**:A→B MUST 经 storyline。 +3. **少叙事**:不引入 Capture Call / 相位 / event 回链等运行时读模型;那些留在 events。 +4. **Not SoT**:回放与审计以 events 为准。 + +相对 ATIF 仅保留这些增量: + +| 增量 | 说明 | +|---|---| +| 短名 wire(`src`/`msg`/`ts`/…) | JSON 更短;长名仅作字段概念说明 | +| `latency_ms` / `ttft_ms` | 常从 `metrics` 提升到 turn 顶栏 | +| `tool_calls[].duration_ms` | 常从 tool_call.`extra` 提升 | +| `agent.id` | ATIF 仅有 `name` 时 `id = name` | +| `session` Required | ATIF `session_id` 在 v1.7 可为可选 | +| 可选 `parent` / `children` | ATIF `subagent_trajectories` 的外链表达(默认不内嵌整树) | +| Required `schema_version` | 当前只接受 `storyline/v1`;未知版本 fail closed | +| 可选 `origin` | 记录来源格式、来源 schema 与文档身份,不冒充 Storyline 自身版本 | +| `unknown_fields` | 仅保存 Storyline 不认识的源格式 key/value,按来源和 JSON Pointer 隔离 | +| 可选 `/task`、`/started_at`、`/finished_at` | 评测/预算、文档级时间;不升 `schema_version` | +| 可选 `turns[].env`、`turns[].finished_at` | 相对 `/task/env` 的运行时 delta 与 turn 结束时间 | +| 可选 `/prompt`、`turns[].prompt` | ACTF `system_prompt` / `user_content`;文档基线 + turn 整段覆盖 | +| 可选 `tool_calls[].kind`、`tool_calls[].response` | 工具事件类型与执行状态;`result` 仍是输出体 | + +--- + +## 格式映射的权威边界 + +本 RFC 只定义 Storyline wire schema。外围格式到 Storyline 的字段映射由对应格式 RFC +负责,设计文档和实现说明不得另行维护一份竞争性映射表: + +- [RFC-0004 § ACTF → Storyline JSON Pointer 映射](0004-actf-format.md#actf-storyline-json-pointer-mapping) +- [RFC-0008 § ATIF → Storyline JSON Pointer 映射](0008-atif-format.md#atif-storyline-json-pointer-mapping) +- [RFC-0009 § OpenAI Messages → Storyline JSON Pointer 映射](0009-openai-messages-format.md#openai-storyline-json-pointer-mapping) + +同源恢复使用 `unknown_fields` 保留 Storyline 不认识的源字段。跨外围格式转换只保证输出 +目标格式能够表达的 Storyline 语义;不能由目标格式表达的外来 residual 使用受控 +`_storyline` envelope 携带。 + +--- + +## Wire schema + +编码:UTF-8 JSON。根对象 MUST 包含 `schema_version: "storyline/v1"`、`session`、 +`agent` 和 `turns`。所有拥有字段的对象都拒绝未声明 key;扩展只能进入显式 +`extra` 或受限 `unknown_fields`。 + +### Wire 短名 + +JSON 序列化和解码都使用短名;长名仅用于说明字段概念,不作为兼容输入。 + +| 短名 | 字段概念 | 位置 | +|---|---|---| +| `run` | `run_id` | root | +| `trajectory` | `trajectory_id` | root | +| `session` | `session_id` / `story_id` | root | +| `children` | `child_session_ids` / `child_story_ids` | root | +| `ver` | `version` | agent | +| `model` | `model_name` | agent / turn | +| `tools` | `tool_definitions` | agent | +| `psid` | `parent_session_id` / `parent_story_id` | parent | +| `scid` | `spawn_call_id` | parent | +| `ptid` | `spawn_id` | parent | +| `rel` | `relation` | parent | +| `ts` | `timestamp` | turn | +| `src` | `source` | turn | +| `msg` | `message` | turn | +| `reason` | `reasoning_content` | turn | +| `effort` | `reasoning_effort` | turn | +| `nllm` | `llm_call_count` | turn | +| `copied` | `is_copied_context` | turn | +| `tcid` | `tool_call_id` | tool_calls[] | +| `fn` | `function_name` | tool_calls[] | +| `args` | `arguments` | tool_calls[] | + +保持全名:`agent` / `task` / `env` / `llm` / `result` / `response` / `prompt` / `started_at` / `finished_at` / `final_metrics` / `continued_trajectory_ref` / `tool_calls` / `observation` / `metrics` / `extra` / `meta` / `latency_ms` / `ttft_ms` / `duration_ms`,以及 `id` / `name` / `notes` / `kind` / `turns` / `parent`。`tool_calls[].kind` 与 `turns[].kind` 同名不同槽。 + +### 根对象 + +| Wire | Type | Status | +|---|---|---| +| `schema_version` | string | Required,固定 `storyline/v1` | +| `origin` | object | Optional;来源格式、schema 与文档身份 | +| `session` | string | Required;非空 | +| `agent` | object | Required | +| `turns` | array | Required | +| `run` | string | Optional;run-scoped identity | +| `trajectory` | string | Optional;非空 | +| `attempt_id` | string | Optional;源格式 attempt identity | +| `notes` | string | Optional | +| `task` | object | Optional;`env` / `llm` / `result`,至少一项非空 | +| `prompt` | object | Optional;`{system, user}` 文档基线;至少一个非空字符串 | +| `started_at` | string \| number | Optional;与 turn `ts` 同一时间编码 | +| `finished_at` | string \| number | Optional;与 turn `ts` 同一时间编码 | +| `final_metrics` | any | Optional | +| `continued_trajectory_ref` | string | Optional | +| `extra` | any | Optional;Storyline 业务扩展 | +| `meta` | any | Optional;文档级元数据 | +| `unknown_fields` | object | Optional;源格式 residual,见下 | +| `unknown_key_counts` | object | Optional;必须与 `unknown_fields` 一致 | +| `children` | string[] | Optional;子 Storyline identity 外链 | +| `parent` | object | Optional;父 Storyline 外链 | + +### `origin` + +| Wire | Type | Status | +|---|---|---| +| `format` | string | Required;非空 | +| `schema_version` | string | Optional;非空 | +| `document_id` | string | Optional;非空 | + +### `agent` + +| Wire | Type | Status | +|---|---|---| +| `id` | string | Required;非空 | +| `name` | string | Optional | +| `ver` | string | Optional | +| `model` | string | Optional | +| `tools` | any | Optional | +| `extra` | any | Optional | + +### `parent`(可选外链) + +对应 ATIF 内嵌 `subagent_trajectories` 的轻量替代;**不是**必填叙事层。 + +| Wire | Type | Status | Description | +|---|---|---|---| +| `psid` | string | Required | 父 `session` | +| `scid` | string | Optional | 父侧触发 id(若有) | +| `ptid` | integer | Optional | 父侧 turn `id` | +| `rel` | string | Optional | 默认 `"spawn"` | + +完整子轨迹 SHOULD 作独立 `storyline.json`;导出单文件 ATIF 时转换器 MAY 再内嵌。 + +### `turns[]` + +| Wire | Type | Status | +|---|---|---| +| `id` | integer | Required;文档内唯一 | +| `src` | string | Required;非空 | +| `msg` | any | Required | +| `ts` | string \| number | Optional;RFC3339 或可精确表示为纳秒的 Unix epoch 秒数 | +| `model` | string | Optional | +| `effort` | any | Optional | +| `reason` | string | Optional | +| `tool_calls` | array | Optional | +| `observation` | any | Optional | +| `metrics` | any | Optional | +| `nllm` | integer | Optional | +| `copied` | boolean | Optional | +| `extra` | any | Optional | +| `kind` | string | Optional;省略时由 `src` 与 `tool_calls` 推导;不读取 tool `kind` | +| `latency_ms` | integer | Optional | +| `ttft_ms` | integer | Optional | +| `env` | object | Optional;相对 `/task/env` 的浅合并 delta,不相对前一 turn | +| `prompt` | object | Optional;相对文档 `/prompt` 的整段覆盖,不相对前一 turn | +| `finished_at` | string \| number | Optional;turn 结束时间 | + +`task.env` 与 `turns[].env` 形状相同:`name` / `endpoint` / `id` / `event_type` / `request_id` 为可选字符串;`state` 为开放 JSON object。重建某 turn 的有效 env 时,先取 `/task/env` 再浅合并该 turn 的 `env`(`state` 也浅合并)。落盘保持未合并形态。 + +`task.llm` 目前只有可选正整数 `k`。`task.result` 承载通用评测:`correct` / `final_answer` / `ground_truth` / `status` / `score` / `max_score` / `error` / `artifacts`。ACTF 私货(`task_correct`、`category`、`attempts_tried`、`solved_at`、`retry_count`、`retry_counts`)不是强类型 hub 字段;读写旧 Storyline JSON 时这些键进入 `task.result` extra(与 typed 字段同级 flatten),不得静默丢弃。RFC-0004 的 JSON Pointer 不变,ACTF 转换层从 extra 还原。空字符串、空 object、`null` 视为缺省。 + +`prompt` 与 `turns[].prompt` 形状相同:可选字符串 `system` / `user`。有效 prompt 取该 turn 的 `/prompt`,缺省则用文档 `/prompt`;turn 一旦出现 `/prompt` 就整段替换,缺省键视为空字符串,不从文档继承。`copied == true` 的 turn 不得写 `prompt`。文档 `/prompt` 不能是空对象。turn 上唯一允许的双空对象是显式 `{"system":"","user":""}`,用来清空文档基线。 + +### `tool_calls[]` + +| Wire | Type | Status | +|---|---|---| +| `tcid` | string | Required;全文档唯一且非空 | +| `fn` | string | Required;非空 | +| `args` | any | Required | +| `result` | any | Optional | +| `duration_ms` | integer | Optional | +| `extra` | any | Optional | +| `kind` | string | Optional;工具事件类型(≠ turn `kind`);空字符串视为缺省 | +| `response` | object | Optional;`status` 字符串与/或 `exit_code` 整数 | + +### `unknown_fields` 与 `unknown_key_counts` + +`unknown_fields` 只保存外围格式中无法映射到 Storyline 已知字段的值: + +```text +/unknown_fields/sources/{source}/source_document_id = string +/unknown_fields/sources/{source}/fields/{E(P)} = any +``` + +`P` 是源文档中的完整 RFC 6901 JSON Pointer;`E(P)` 是把整个 `P` 作为 `fields` +对象 key 后执行一次 RFC 6901 token 转义。`unknown_key_counts` 按 source 和规范化 pointer +记录出现次数,必须能由 `unknown_fields` 确定性重算。已知业务扩展写入 `extra`,文档级元数据写入 +`meta`,不得混入 `unknown_fields`。 + +--- + +## 校验(Normative) + +MUST 拒绝:缺失或无法识别的 `schema_version`;空 `session` / 空 `agent.id`;重复的 +`turns[].id`;全局重复或空的 `tool_calls[].tcid`;空 `fn`;既非 RFC3339 字符串、也非 +可精确表示为纳秒的 Unix epoch 秒数的 `ts`;未声明的 +拥有字段;不匹配的 `unknown_key_counts`。 + +`turns` 数组顺序具有语义,MUST 原样保留;`id` 只用于身份和关联,不用于排序。 +导出 ATIF 时 `step_id = turns[].id`;未知 `extra` 透传。 + +--- + +## 枢纽 API + +```text +into_storyline(format, input) → StorylineDocument +from_storyline(format, story) → serialized +convert(from, to, input) ≡ from_storyline(to, into_storyline(from, input)) +``` + +`events` 为 Lance-only:字符串 convert API 对 `ChronicleFormat::Events` 报错;内存用 `events_to_storyline` / `storyline_to_events`。 + +--- + +## 文件与探测 + +| 约定 | 值 | +|---|---| +| 文件名 | `storyline.json` / `{session}.storyline.json` | +| 内容 | `schema_version: "storyline/v1"` + `session` + `turns` | + +实现:`into_storyline` / `from_storyline` / `convert`。 + +--- + +## History + +| Date | Notes | +|---|---| +| 2026-07-30 | 初稿与迭代(hub、短名、去 `calls[]`、性能字段、`session`) | +| 2026-07-30 | 收敛为 ATIF-first:去掉 Capture Call/Normal 过度叙事;`continued_trajectory_ref` 对齐 ATIF;`parent.scid` 可选 | +| 2026-08-20 | 固定 `storyline/v1`,增加 `origin` 与统一 unknown fields;Lance v2 保留数组顺序、出现语义和原始 observation | +| 2026-08-21 | Storyline schema 与外围格式映射分离;映射由各格式 RFC 独立负责 | +| 2026-08-22 | 增加可选 `/task`、文档/turn 时间、turn `env`、tool `kind`/`response`;`schema_version` 仍为 `storyline/v1` | +| 2026-08-22 | 增加可选文档 `/prompt` 与 turn `/prompt`(`{system, user}`);`msg` 仍是助手正文 | +| 2026-08-23 | `task.result` 强类型只保留通用评测;ACTF 私货进 extra,旧 JSON 同级键不得静默丢弃 | diff --git a/docs/src/zh/rfcs/0002-events-format.md b/docs/src/zh/rfcs/0002-events-format.md new file mode 100644 index 00000000..203d045f --- /dev/null +++ b/docs/src/zh/rfcs/0002-events-format.md @@ -0,0 +1,585 @@ +# RFC-0002: Events Format(`events`) + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Schema / format name** | `events`(逻辑文档);物理存储常为 `events.lance` | +| **Date** | 2026-07-30 | +| **Component** | `persisting-events` + Gateway + pChronicle | +| **Implements** | `persisting-events::EventRecord` · `persisting-pchronicle` `formats/events.rs` / `EventRow` | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [RFC-0007 Events/Sidecar 边界](0007-events-contract-pchronicle-sidecar.md) · [Capture 管线](../pvisor/design/gateway.md) · [轨迹存储](../pchronicle/design/trajectory-storage.md) | + +--- + +## 摘要 + +> **Ownership amendment:** [RFC-0007](0007-events-contract-pchronicle-sidecar.md) +> 将存储无关的 `EventRecord` 契约迁至 `persisting-events`。本 RFC 继续规定 events 的 +> wire 内容与物理表示;pChronicle 继续独占 `EventRow` 和持久化实现。 + +**`events`** 是 Persisting 轨迹的 **canonical 事实流(SoT)**:按时间(`seq`)追加的底层记录,**优先刻画原始 HTTP(或等价传输层)交换**,而不是已经折叠好的对话轮次。 + +设计取向: + +> 先保住「线上真实发生过什么」(方法、URL、头、正文、状态、时序),再由上层(Storyline / Markdown / ATIF)去解释「这对人意味着什么」。 + +因此: + +| 层 | 角色 | 可否有损 | +|---|---|---| +| **`events`** | 原始交换日志(HTTP-first) | **SoT,目标可回放** | +| **`storyline`** | Normal / 互操作枢纽 | 从 events 投影时有损;自身存储必须无损 | +| `agenticmd` / `openai_msg` / `atif` / `actf` | 外围视图 / 训练交换 | 同源 Storyline 往返必须无损;跨格式仅承诺目标可表达语义 | + +`events` 进出其它 chronicle 格式时仍 **只经 storyline**;但 **回放、重放、审计、协议级恢复 MUST 读 events**,MUST NOT 依赖 storyline roundtrip。 + +本 RFC 规定: + +1. HTTP-first 的定位与分层职责; +2. 逻辑事件 `EventRecord`、信封 `EventsDocument`、Lance `EventRow`; +3. `payload` 的 wire 字段约定(request / response); +4. 与 Storyline 的投影关系(摘要字段只是加速,不是真相)。 + +--- + +## 动机 + +Agent 轨迹若只存「user/assistant 文本 + tool_calls」,会丢掉: + +- 真实 URL / method / status / header(鉴权、路由、provider 切换); +- 原始 body(含协议特有字段、tool schema、多模态 parts); +- 流式分片、重试、取消、非 2xx、内部探测流量; +- 足以 **原样重放 HTTP** 或 **换协议解析器重解** 的材料。 + +Persisting Gateway 的主入口是代理流量。`events` 应对齐这一现实:**一行事件 ≈ 一次可定位的 HTTP 方向记录**(request 或 response),外加关联键(`session_id` / `call_id` / `trace_id`)。 + +对话摘要(`user_content` / `assistant_content`)可以写进 payload 作为 **可选索引/加速字段**,但: + +- MUST NOT 取代 `http.request_body` / `http.response_body`(或等价 wire 字段)成为唯一正文; +- 当摘要与 wire body 冲突时,**以 wire body 为准**。 + +--- + +## 设计目标 + +| 目标 | 说明 | +|---|---| +| **HTTP-first SoT** | 默认按原始请求/响应保存,使回放与再解析成为一等能力 | +| **Replayable** | 在凭证策略允许的前提下,应能从 events 重建「对同一 endpoint 再发一次等价请求」所需信息 | +| **Re-derivable views** | Storyline / Markdown / ATIF 视为可从 events **重新投影**的视图 | +| **Correlation envelope** | 顶栏保留 `session_id` / `call_id` / `trace_id` 等关联键,不把故事语义塞进 wire | +| **Append-only** | `seq` 单调;不原地改写既有 wire payload | +| **Hub via storyline** | 与其它外围格式互转 MUST 经 storyline;无损路径仍是读 events | + +非目标: + +- 不把 events 做成 ATIF step / Storyline Turn 的镜像; +- 不要求每条事件都是「对人友好的一句对话」; +- 不在本 RFC 规定 TLS 密钥、cookie 明文等敏感材料的强制落盘策略(见安全节)。 + +--- + +## 分层:原始交换 vs 故事投影 + +```text + ┌─────────────────────────────┐ + proxy / import → │ events 流(HTTP wire) │ + └──────────────┬──────────────┘ + │ + ┌──────────────┼──────────────┐ + ▼ ▼ + 记录 append 触发 handlers + │ │ + ▼ ▼ + events.lance storyline(hub) + (SoT / replay) │ + ┌─────────────┼─────────────┐ + ▼ ▼ ▼ + agenticmd openai_msg atif + └──────── 落盘 / 物化 ──────┘ +``` + +| 问题 | 应落在 | +|---|---| +| 「当时请求的 path / body 是什么?」 | **events** | +| 「这一轮对用户说了什么?」 | storyline / agenticmd | +| 「能否拿去 SFT?」 | atif / openai_msg(经 storyline) | +| 「能否按 call_id 重放 upstream?」 | **events** | + +与既有 Capture 表述的关系:协议差异可以在 **进入 Story 读模型之前**消化;但 **进入 events 之前不应过度消化**——解析器可以后置、可升级,原始字节/JSON body 应尽量留下。 + +--- + +## 术语 + +| 术语 | 含义 | +|---|---| +| **Wire record** | 一次 HTTP(或同类)方向的原始交换描述:method/url/headers/body/status/timing… | +| **EventRecord** | 逻辑事件 = 关联信封 + `kind` + wire-oriented `payload` | +| **EventRow** | Lance 列存行:索引列 + `payload_json` | +| **Summary fields** | `user_content` / `assistant_content` / `model` 等可选派生字段 | +| **Replay** | 用 wire 字段重建并再次发出(或模拟)等价交换 | + +--- + +## Schema:逻辑事件 `EventRecord` + +编码:UTF-8 JSON object。`EventRecord` 由存储无关的 `persisting-events` 唯一定义; +Gateway、pVisor 与 pChronicle 直接使用同一类型。pChronicle 独占由该逻辑记录派生的 +物理 row schema 与存储实现。 +一行事件 MUST 包含 `seq`、`source`、`kind`、`payload`。 + +### 关联信封(顶栏) + +| Field | Type | Status | Description | +|---|---|---|---| +| `event_id` | string | Required for new writes | append 边界生成的稳定事件身份 | +| `run_id` | string | Required for new writes | 事件所属逻辑 Run;旧 capture row 读取时可缺省 | +| `attempt_id` | string | Optional | 生命周期事件所属 Attempt | +| `storyline_id` / `turn_id` | string | Optional | narrative 维度,与 Attempt 正交 | +| `timestamp_unix_ms` | integer | Required for new writes | 机器可比较的观测时间;与 `timestamp` 表示同一时刻 | +| `producer` | string | Required for new writes | 产生该记录的组件 | +| `seq` | integer | Required | dataset / 会话内单调序号 | +| `source` | string | Required | 如 `persisting-proxy`、`persisting-gateway` | +| `kind` | string | Required | 见 kind 节;HTTP 方向优先 | +| `timestamp` | string | Required for new writes | RFC3339 UTC(事件观测时间;与 `timestamp_unix_ms` 毫秒级一致) | +| `session_id` | string | Optional | ≈ Storyline `story_id` | +| `agent_id` | string | Optional | | +| `call_id` | string | Optional | 一次调用关联键(request/response 配对) | +| `trace_id` | string | Optional | | +| `parent_call_id` | string | Optional | 调用树 | +| `parent_uuid` | string | Optional | | +| `subagent_id` / `parent_agent_id` / `branch` | string | Optional | 子代理 / 分支 | + +顶栏 **SHOULD NOT** 承载完整对话文本;正文在 `payload` 的 wire 字段中。 + +新写入事件必须同时提供 `timestamp` 与 `timestamp_unix_ms`。Gateway capture sink 和 +pVisor runtime 是 producer 侧的共同兜底;admission 仅为旧记录或兼容导入补齐缺失值。 +事件顺序仍由 `source + seq` 定义,时间戳用于关联和展示。 + +### `payload`:HTTP-first wire 对象 + +推荐统一放在 `payload.http`(或顶层扁平兼容键,见兼容节)。**完整回放**所需字段: + +#### Request 方向(`kind` = `http.request` 或兼容 `llm.request`) + +| Field | Type | Status | Description | +|---|---|---|---| +| `http.method` | string | Required | `GET` / `POST` / … | +| `http.url` | string | Required | 完整 URL 或 path+query;与 `host` 可拆分 | +| `http.path` | string | Recommended | 规范化 path(便于索引) | +| `http.query` | object / string | Optional | | +| `http.headers` | object \| array | **Required**(记录时) | **完整请求头**(可脱敏);与 body 同为回放必需 | +| `http.request_body` | string \| object \| null | Recommended | **原始请求体**(JSON 对象或 base64/utf8 字符串) | +| `http.body_encoding` | string | Optional | `json` \| `utf8` \| `base64` \| `sse-wire` … | +| `http.content_type` | string | Optional | | +| `timing.started_at` | string | Optional | | +| `timing.duration_ms` | number | Optional | | + +#### Response 方向(`kind` = `http.response` / `http.response.stream` 或兼容 `llm.response*`) + +| Field | Type | Status | Description | +|---|---|---|---| +| `http.status` | integer | Required | HTTP 状态码 | +| `http.headers` | object \| array | **Required**(记录时) | **完整响应头**(可脱敏) | +| `http.response_body` | string \| object \| null | Recommended | **原始响应体**或流式拼接线 | +| `http.body_encoding` | string | Optional | 含 `sse` / `sse-wire` | +| `http.truncated` | boolean | Optional | 是否流式 | +| `timing.ttft_ms` / `timing.duration_ms` | number | Optional | | + + +#### 连接与客户端(长连接 / 对端身份) + +HTTP-first 回放不仅需要单次 request/response,还需要知道 **连接是否复用** 以及 **谁连上来**。记录时 MUST 尽量写入: + +| Field | Type | Status | Description | +|---|---|---|---| +| `connection.http_version` | string | Recommended | 如 `HTTP/1.1`、`HTTP/2.0` | +| `connection.persistent` | boolean | Recommended | 是否按协议/头判定为 keep-alive / 长连接 | +| `connection.connection_header` | string | Optional | 原始 `Connection` 头(如 `keep-alive` / `close`) | +| `connection.keep_alive` | string | Optional | 原始 `Keep-Alive` 头(超时/max 等) | +| `connection.upgrade` | string | Optional | `Upgrade`(如 `websocket`) | +| `client.peer` | string | **Required**(代理路径) | 客户端 `ip:port`(`ConnectInfo`) | +| `client.peer_ip` | string | Recommended | | +| `client.peer_port` | integer | Recommended | | +| `client.pid` | integer | Optional | 本机 peer 反查进程 PID(best-effort) | +| `client.command` | string | Optional | 进程命令行 | +| `client.machine_fp` | string | Optional | 机器指纹 | +| `client.user_agent` | string | Optional | 从请求头抽取,便于无 PID 时对照 | + +判定 `persistent` 的建议规则: + +1. 若 `Connection: close` → `false`; +2. 若 `Connection` 含 `keep-alive` → `true`; +3. 否则:`HTTP/1.1+` 默认 `true`,`HTTP/1.0` 默认 `false`; +4. `Upgrade: websocket` 等升级连接单独用 `upgrade` 标明,不假装成普通 keep-alive 复用。 + +说明: + +- 会话级 `session-meta.yaml`(`SessionClientMeta`)可继续存在;**事件级**仍 MUST 冗余写入 `client.*`,以便单条 event 可自描述回放。 +- hop-by-hop 头(`Connection` / `Keep-Alive`)转发上游前可能被剥离,但 **events 记录 MUST 保留客户端原始值**。 +- 上游侧长连接信息可从 response `headers` 的 `Connection`/`Keep-Alive` 再读;可另写 `connection.upstream_*`(Optional)。 + +#### 可选摘要 / 索引(非 SoT) + +| Field | Type | Status | Description | +|---|---|---|---| +| `model` | string | Optional | 从 body/header 抽取,便于 Lance 列 | +| `protocol` | string | Optional | 如 `chat.completions`、`anthropic.messages` | +| `provider` | string | Optional | | +| `user_content` | string | Optional | 可见 user 摘要;冲突时以 request_body 为准 | +| `assistant_content` | string | Optional | 可见 assistant 摘要;冲突时以 response_body 为准 | +| `usage` | object | Optional | token 等;能从 body 再解析则视为缓存 | +| `_tlv` | object | Optional | 自 Markdown compact 注入 | + +**Normative**: + +1. 记录 HTTP 交换时,实现 MUST **同时**持久化: + - **headers**(`payload.http.headers` 或兼容扁平键 `payload.headers`); + - **body**(在 `capture_level` 允许完整 body 时:`request_body` / `response_body` 或等价 `body`); + - **连接与客户端**:`connection.*`(至少能推导 `persistent`)与 `client.peer`(代理路径必填)。 +2. headers 与 body 同为回放材料:缺 headers 的事件与缺 body 一样,MUST 视为 **degraded**(`payload.degraded = true`),MUST NOT 宣称可完整 HTTP 回放。 +3. 敏感头(`Authorization` / `Cookie` / `Set-Cookie` / `X-Api-Key` 等)MUST 按红线脱敏或外置,并设置 `headers_redacted: true`;脱敏后仍 MUST 保留头名字面量(值为占位符),以便知道当时发过哪些头。 +4. Storyline / 训练格式导出 MUST 容忍从 wire body + headers 再解析;MUST NOT 假定摘要字段永远存在。 + +### 内存批 `EventsDocument`(非正式文件格式) + +| Field | Type | Status | Description | +|---|---|---|---| +| `format` | string | Required | `"events"` | +| `events` | array | Required | `EventRecord[]` | +| `session_id` / `agent_id` | string | Optional | 文档级默认 | + +### 物理行 `EventRow`(Lance) + +| Column | 说明 | +|---|---| +| `seq` / `timestamp` / `kind` / `source` | 索引 | +| `session_id` / `agent_id` / `call_id` / `trace_id` / `parent_call_id` | 关联过滤 | +| `model` | 可选反规范化 | +| `payload_json` | **完整 EventRecord JSON(含 wire)** | + +身份冲突采用 admission-first 合同:写入坐标不一致不会拒绝事实。`payload_json` 保留 +producer 原始声明;物理 `session_id` / `agent_id` 用于路由、过滤并在 replay 时覆盖同名 +声明。Storyline 投影对剩余冲突按物理 append order 采用最后一个非空值。该规则不需要 +读前写、去重表或额外索引。 + +--- + +## `kind` 约定 + +### 推荐(HTTP-first) + +| kind | 含义 | +|---|---| +| `http.request` | 一次 outbound/inbound HTTP 请求观测 | +| `http.response` | 对应响应(非流或已聚合) | +| `http.response.stream` | 流式响应片段或草稿聚合 | +| `http.cancel` | 取消 / 中断 | +| `session.started` / `session.ended` | 会话生命周期(可无 http 块) | +| `note` | 运维注解 | + +### LLM producer kinds + +| 现有 kind | 视为 | +|---|---| +| `llm.request` | 带 LLM 协议理解的 HTTP 请求(payload 仍应尽量含 path/body) | +| `llm.response` | `http.response` | +| `llm.response.stream` | `http.response.stream` | + +通用 HTTP producer 使用 `http.*`,Gateway LLM producer 可以使用 `llm.*`。 +`llm.*` **不**意味着可以只存对话摘要,仍按 HTTP-first 要求保存 wire。 + +--- + +## 回放与恢复(Replay) + +从一对共享 `call_id` 的 request/response 事件,消费者 SHOULD 能恢复: + +1. **HTTP 重放**:method + url + headers′ + body → 得到新的 response(headers′ 经红线剥离); +2. **协议再解析**:换用新的 Anthropic/OpenAI/… 解析器从 body 重建 messages / tool_calls; +3. **视图重建**:重新投影 Storyline / Markdown / ATIF; +4. **时序重建**:按 `seq` / timestamp 恢复并发与流式顺序。 + +无法回放的常见原因(实现 MUST 在文档/元数据中可诊断): + +- body 因 `capture_level` 被省略(`degraded`); +- 敏感头被剥离且无替代凭证注入通道; +- 仅存 SSE 摘要未存 wire 帧; +- 只从 storyline 合成的「假 events」(无原始 wire)。 + +--- + +## 安全与红线 + +HTTP-first **不**等于无条件落盘密钥。 + +| 类别 | 默认建议 | +|---|---| +| `Authorization` / API key / cookie | 红线:哈希、删除或外置 secret store;回放时再注入 | +| 用户内容 / 工具结果 | 按产品保留策略 | +| 多模态像素 | 可旁路对象存储;events 内留引用与 hash | + +`payload.http.headers_redacted: true`(可选)表示头已经过红线处理。 + +--- + +## Wire 形态与探测 + +| 形态 | 地位 | +|---|---| +| **Lance `events.lance/`** | **唯一一等存储 / 采集格式(SoT)** | +| JSONL / JSON / `EventsDocument` 序列化 | **非正式**:仅调试导出或测试夹具;**不是** chronicle 互操作格式 | + +pChronicle:`into_storyline` / `convert` **不接受** events 的字符串输入;从 Lance 加载为内存 `EventRecord` 后再 `events_to_storyline`。 + +探测: + +| 方式 | 规则 | +|---|---| +| 路径 | 仅 `events.lance`(或 basename 含 `event` 的 `.lance`) | +| 内容 | **不**把 EventRecord 形 JSON 判定为 `events` | + +别名:`events` / `lance` / `bin` / `events.lance`。 + + +--- + +## 与 Storyline 的关系 + +```text +events (HTTP wire) ──interpret──► storyline ──synthesize──► events′ (often degraded) +``` + +| 方向 | 期望 | +|---|---| +| events → storyline | 从 wire(及可选摘要)折叠 Turn/Call;填写 `event_seqs` | +| storyline → events′ | 合成最小交换;**通常 degraded**,除非 storyline 显式携带完整 wire(不默认) | + +规范性: + +1. 互转其它外围格式 MUST 经 storyline。 +2. 宣称「可回放」时 MUST 基于非 degraded 的原始 events。 +3. 折叠器 SHOULD 优先解析 `http.request_body` / `http.response_body`,摘要字段仅作快路径。 + +--- + +## 兼容现有 Capture payload + +今日实现常见扁平键(仍合法): + +| 现有键 | HTTP-first 对应 | +|---|---| +| `headers` | `http.headers`(**记录 MUST**) | +| `path` | `http.path` / `http.url` | +| `body` | request 的 `http.request_body` 或 response 的 `http.response_body` | +| `status` | `http.status` | +| `model` / `protocol` / `provider` | 摘要/索引 | +| `user_content` / `assistant_content` | 摘要 | + +读路径 MUST 接受扁平键;写路径 SHOULD 逐步迁移到 `payload.http.*`,或同时写两套直到迁移完成。 + +--- + +## 示例 A:HTTP-first 请求事件 + +```json +{ + "seq": 0, + "source": "persisting-proxy", + "kind": "http.request", + "timestamp": "2026-01-01T00:00:00Z", + "session_id": "sess-1", + "agent_id": "agent-a", + "trace_id": "tr-1", + "call_id": "c1", + "payload": { + "http": { + "method": "POST", + "url": "https://api.openai.com/v1/chat/completions", + "path": "/v1/chat/completions", + "headers": { + "content-type": "application/json", + "authorization": "", + "connection": "keep-alive", + "keep-alive": "timeout=60, max=1000", + "user-agent": "claude-cli/1.0" + }, + "headers_redacted": true, + "content_type": "application/json", + "body_encoding": "json", + "request_body": { + "model": "gpt-4o", + "messages": [{ "role": "user", "content": "ping" }] + } + }, + "connection": { + "http_version": "HTTP/1.1", + "persistent": true, + "connection_header": "keep-alive", + "keep_alive": "timeout=60, max=1000" + }, + "client": { + "peer": "127.0.0.1:54321", + "peer_ip": "127.0.0.1", + "peer_port": 54321, + "pid": 4242, + "command": "claude --print", + "user_agent": "claude-cli/1.0" + }, + "model": "gpt-4o", + "protocol": "chat.completions", + "user_content": "ping" + } +} +``` + +--- + +## 示例 B:Storyline → Events 映射(合成多为 degraded) + +key = events 字段,value = 在 Storyline 上求值的 JSONPath。 +**注意**:从 storyline 合成的 body 通常只是对话投影,不是原始 HTTP wire;应设 `payload.degraded = true`,除非另有 wire 旁路。 + +```json +{ + "format": "events", + "session_id": "$.story_id", + "agent_id": "$.agent.id", + "events": [ + { + "seq": null, + "source": null, + "kind": null, + "timestamp": "$.turns[0].timestamp", + "session_id": "$.story_id", + "agent_id": "$.agent.id", + "call_id": "$.turns[0].calls[0].call_id", + "trace_id": "$.turns[0].calls[0].trace_id", + "parent_call_id": "$.turns[0].calls[0].parent_call_id", + "payload": { + "degraded": null, + "http": { + "method": null, + "url": null, + "path": null, + "headers": null, + "request_body": "$.turns[0].calls[0].messages", + "body_encoding": null + }, + "model": "$.turns[0].calls[0].model", + "protocol": "$.turns[0].calls[0].protocol", + "user_content": "$.turns[0].user.text" + } + }, + { + "seq": null, + "source": null, + "kind": null, + "timestamp": "$.turns[0].timestamp", + "session_id": "$.story_id", + "agent_id": "$.agent.id", + "call_id": "$.turns[0].calls[0].call_id", + "trace_id": "$.turns[0].calls[0].trace_id", + "parent_call_id": "$.turns[0].calls[0].parent_call_id", + "payload": { + "degraded": null, + "http": { + "status": null, + "headers": null, + "response_body": "$.turns[0].assistant.content", + "body_encoding": null, + "truncated": null + }, + "model": "$.turns[0].calls[0].model", + "assistant_content": "$.turns[0].assistant.text", + "usage": "$.turns[0].calls[0].metrics" + } + } + ] +} +``` + +合成:`kind` ← `http.request` / `http.response`;`degraded` ← `true`(默认);`seq`/`source` 由写入器分配。 + +口语对照: + +| events 字段 | Storyline 路径 | +|---|---| +| `events.0.call_id` | `turns.0.calls.0.call_id` | +| `events.0.payload.http.request_body` | `turns.0.calls.0.messages` | +| `events.1.payload.http.response_body` | `turns.0.assistant.content` | +| `events.0.payload.http.method` / `url` / `headers` | (无)→ null / 合成默认 | + +--- + +## 示例 C:Events → Storyline(从 wire 再解析) + +按 `call_id` 分组后,优先: + +| Storyline 字段 | 来源 | +|---|---| +| `calls[0].event_seqs` | `$[*].seq` | +| `calls[0].call_id` | `$[0].call_id` | +| `calls[0].protocol` | `$[0].payload.protocol` 或从 path 推断 | +| `calls[0].messages` | 解析 `$[?(@.kind=~/request/)].payload.http.request_body`(兼容 `.body`) | +| `user.text` | 摘要 `user_content` **或** 从 request_body 提取 | +| `assistant.text` | 摘要 `assistant_content` **或** 从 response_body / SSE 提取 | +| `calls[0].model` | `payload.model` 或 body.model | + +--- + +## 校验规则(Normative) + +实现 MUST: + +1. 拒绝缺少 `seq` / `source` / `kind` / `payload` 的事件; +2. 保持 `seq` 单调追加; +3. 与其它外围格式互转走 storyline hub; +4. 记录 HTTP 事件时持久化 **headers + body**(或显式标记 `degraded`);缺一不可宣称可回放。 + +实现 SHOULD: + +1. 为同一 HTTP 交换的 request/response 共享 `call_id`; +1b. 代理路径写入 `client.peer` 与 `connection.persistent`(及原始 Connection/Keep-Alive); +2. 写 `http.*` kind,同时读兼容 `llm.*`; +3. 从 events 投影 storyline 时填充 `event_seqs`; +4. 对红线头做可检测的脱敏标记。 + +--- + +## 与现有文档的关系 + +| 文档 | 关系 | +|---|---| +| [轨迹存储](../pchronicle/design/trajectory-storage.md) | Lance SoT;本 RFC 强调 SoT 内容应是 HTTP wire | +| [Gateway 管线](../pvisor/design/gateway.md) | 生产 events;Story 边界在 **之后** 解释 | +| [RFC-0001 Storyline](0001-storyline-format.md) | 有损 Normal 视图 / hub | +| [轨迹 Markdown 格式](../pchronicle/reference/agenticmd.md) | 人读投影,不是 SoT | + +实现现状:`EventRecord` 已具备 `path`/`body`/`status` 等扁平键;本 RFC 将其 **提升为明确的 HTTP-first 契约**,并引入 `http.*` kind 与 `payload.http` 嵌套作为演进目标。 + +--- + +## 已裁定的演进约束 + +1. 新 writer 使用嵌套 `payload.http`;reader 在磁盘迁移期继续接受历史扁平键。 +2. SSE 原始帧写为按 `seq` 排序的 `http.stream.frame` 事件,携带相对时间与原始字节;聚合文本只是投影。 +3. `seq` 由 producer 在 session 内单调分配,不是唯一键;at-least-once 重试可产生重复行。 +4. WebSocket、gRPC 等非 HTTP 传输使用独立 `transport.*` kind,不伪装成 HTTP。 +5. 默认 `capture_level` 为 `dialogue`。缺少完整 wire 的记录必须标记 `degraded`;只有 `full` capture 可声明 wire-replayable。 +6. Gateway 为客户端和 upstream 连接分配稳定 `connection.id`,用于关联 keep-alive 上的多次交换。 + +--- + +## Changelog + +| Version | Date | Notes | +|---|---|---| +| Draft | 2026-07-30 | 初稿:EventRecord / EventRow / wire、与 Storyline hub | +| Draft | 2026-07-30 | **定位修正为 HTTP-first SoT**:原始请求/响应可回放;摘要字段降为可选;引入 `http.*` kind 与 `payload.http` | +| Draft | 2026-07-30 | **headers 与 body 同为记录 MUST**;缺 headers 亦为 degraded | +| Draft | 2026-07-30 | 增补 **长连接 `connection.*` + 客户端 `client.*`(peer/pid/command)** 记录要求 | +| Draft | 2026-07-30 | **events 仅 Lance**:JSON/JSONL 降为调试导出,非一等 wire | +| Accepted amendment | 2026-08-16 | RFC-0007 将 `EventRecord` ownership 迁至 `persisting-events`;pChronicle 保留物理 schema 与持久化 ownership | +| Accepted | 2026-08-09 | 裁定 payload、SSE、seq、非 HTTP、capture 默认值与 connection identity;保持 at-least-once append-only。 | diff --git a/docs/src/zh/rfcs/0003-pchronicle-ownership.md b/docs/src/zh/rfcs/0003-pchronicle-ownership.md new file mode 100644 index 00000000..72675a4c --- /dev/null +++ b/docs/src/zh/rfcs/0003-pchronicle-ownership.md @@ -0,0 +1,114 @@ +# RFC-0003: pChronicle 轨迹存储层所有权 + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Date** | 2026-07-31 | +| **Component** | `persisting-pchronicle` | +| **Amended by** | [RFC-0007 Events/Sidecar 边界](0007-events-contract-pchronicle-sidecar.md) | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [RFC-0002 Events](0002-events-format.md) · [轨迹存储](../pchronicle/design/trajectory-storage.md) | + +## 摘要 + +`persisting-pchronicle` 是 Persisting 唯一的 **Agent 轨迹结构化存储与检索层**。轨迹的物理 schema、目录布局、物理落盘、读取、回放、格式转换和派生视图 MUST 收敛到 pChronicle。存储无关的逻辑事件信封由 `persisting-events` 定义,具体修订见 RFC-0007。 + +Gateway 和 CLI 可以分别生产事件和适配输入,但 MUST NOT 定义第二套通用轨迹存储实现。 + +## 决策 + +### 1. Canonical 记录 + +`persisting-events::EventRecord` 是 crate 边界和 Gateway 采集管线共同使用的 canonical 逻辑记录。 +provider/SSE payload 解释可作为 Gateway 扩展行为存在,但不得形成第二套可序列化轨迹类型。 + +`EventRow` 是 `events.lance` 的稳定物理行。其 Arrow schema、行转换、序号和 session 分区语义由 pChronicle 独占维护。 + +### 2. 物理层 + +| 层 | API / 实现 | 语义 | +|---|---|---| +| canonical event log | `RawEventLanceStore` | typed append、replay、stats;同一 run 按 `session_id` 分区 | +| 人读/调试视图 | `materialize_lance_to_markdown`, AgenticMD 文件 helpers | 从 canonical events 单向生成,可随时删除和重建 | +| 发现 | `expand_story_locations` | 发现 canonical Run/Story 分区;Markdown 不参与存储层选择 | +| 数据维护 | `RawEventLanceStore::maintain` | 显式离线 compaction、session 索引和 vacuum;事实层不支持 truncate/overwrite | +| Storyline 三表 | `StorylineLanceStore`, `StorylineDataSource` | 原子提交并查询 `runs` / `steps` / `tool_calls` | + +`events.lance` 是事实源。AgenticMD 和 Storyline 三表均可重建,不可被当作协议级审计或回放的事实源;ATIF 是互操作文档格式,不是独立存储模型。append、replay、stats 不得回退到 AgenticMD。 + +canonical event 写路径 MUST 是 at-least-once append-only:不得在 append 前扫描旧行或 +`event_id`,不得将 ID 唯一性、重试去重、truncate 或 overwrite 作为存储语义。一个微批 +只允许执行规范化、Arrow 编码、一次私有 Lance segment append 和一次 fencing manifest +CAS。索引、compaction 与 vacuum 必须由显式维护路径执行。 + +### 3. 格式层 + +pChronicle MUST 统一拥有除公共事件信封以外的轨迹格式与转换实现: + +- `EventRow` 以及 `storyline`、`agenticmd`、`openai_msg`、`atif`、`actf` 的 Rust 数据结构; +- `EventRecord` 到物理 row 与外围格式的映射; +- 格式识别、校验及转换; +- event 与物理行、Markdown block、Storyline turn 之间的映射; +- AgenticMD 的宽松解析、可视化生成、preamble 更新和调试索引; + +外围格式间的转换 MUST 经 Storyline hub。需要保真回放的路径 MUST 直接读取 events,不得依赖有损的 Storyline roundtrip。 + +### 4. 组件职责 + +| 组件 | MUST | MUST NOT | +|---|---|---| +| Gateway | 作为 OverlayNet sink 解释并转发 Agent/LLM 协议;维护采集顺序与调用生命周期;产出 `EventRecord`;实现与实时流状态有关的 live projection 策略 | 自有网络数据面或轨迹记录 schema;把 AgenticMD 当作可恢复事实源 | +| CLI / producer | 解析输入并产出公共事件;需要持久化时通过 pChronicle API 或 sidecar control 协议提交 | 自有 Markdown/ATIF parser、物理落盘协议或动态 ABI | +| pChronicle | 定义物理格式、存储、读取、转换和派生视图;消费公共 `EventRecord` | 依赖 Gateway 才能解释持久化数据;复制一套公共事件信封 | + +Gateway 的 live Markdown 行为可以保留 producer-specific 策略,例如流式 draft upsert;它必须同时写 canonical events。通用 batch materialize 归 pChronicle,不提供 AgenticMD → events 的隐式 compact。 + +### 5. 代码布局 + +- `persisting-pchronicle/src/operations/trajectory/` 是强类型轨迹操作适配。 +- `persisting-gateway/src/session/` 维护 session 身份、路由、client metadata、索引与 snapshot。 +- `persisting-gateway/src/projection/` 维护 Gateway 特有的可见文本解释、实时过滤、draft/upsert 和 reconcile。 +- `persisting-gateway/src/engine/` 维护采集 actor、WAL、顺序状态机和 egress;这里的 “engine” 是 Gateway 内部编排器,不是轨迹存储层。 +- `persisting-overlaynet` 是 pVisor 当前的轻量显式代理网络层,负责 CONNECT、absolute-URI forward、header 规则和网络访问策略执行;Gateway 作为 `OverlaySink` 在其上解释并转发 LLM 流量、产出轨迹事件。OverlayNet 不依赖 Gateway,可配置其他 sink。 + +## 一致性与故障语义 + +1. canonical append 成功后,派生投影失败不得回滚或伪装成 canonical 写入失败;应报告或记录 projection failure。 +2. 状态机只能在 canonical append 成功后提交。 +3. WAL 重启后序号 MUST 单调延续;replay 成功后 MUST ack 原 WAL entry。 +4. `seq` 由 producer 定义;存储不得读取 row count 分配全局序号。writer epoch 的可见性 + 必须由 manifest CAS 串行化。 +5. Storyline 三表替换 MUST 对读者呈现单一提交点;`CURRENT` 指向的不可变 generation 是权威快照。ATIF 输入 MUST 先转换为 Storyline,不得维护第二套 normalized schema。 + +Run lease epoch MUST 通过 `EventWriterFence` 进入 canonical event 提交协议。新 epoch MUST +先以 compare-and-swap 激活 manifest;reader MUST 只读取 manifest 固定的 segment version, +不得直接打开某个 segment 的 latest version。失效 writer 的后续 Lance version 不得进入 +可见快照。相同 epoch、不同 writer_id 的激活 MUST 被拒绝。 + +## 收敛结果 + +- 原 Engine 中的 Trajectory 适配、Lance、Markdown 和 Arrow row 实现全部迁入 pChronicle;Engine crate 删除。 +- Gateway、pVisor 与 pChronicle 直接使用 `persisting-events::EventRecord`;Gateway extension 仅承载实时 payload 解释。 +- Gateway 仅保留实时 payload 解释、live Markdown eligibility/upsert orchestration 与运行时 reconcile;格式解析、文件 I/O、frontmatter 契约与索引实现委托 pChronicle。 +- 只生产事件或调用 control 协议的组件依赖 `persisting-events`;需要存储、查询或格式转换的调用方依赖 pChronicle。 +- 旧 ATIF `sessions` / `steps` / `tool_calls`、`NormalizedStore`、内存联表视图及对应 Python 门面删除;ATIF 查询统一复用 Storyline 三表 schema。 +- append 边界直接传递 `EventRecord` 批次,不保留 RON/event-lines 字符串适配层。 + +新代码 SHOULD 按能力选择依赖:事件 producer 使用 `persisting-events`,存储和读取调用方 +使用 pChronicle。Gateway 与 pVisor 不得为了构造 `EventRecord` 依赖 pChronicle。 + +## 验收条件 + +- Workspace 不再包含 `persisting-engine` crate、动态库、C ABI 或 Engine RPC 信封。 +- append、replay、stats 等轨迹流程均由 pChronicle 提供。 +- CLI 不再实现 AgenticMD 到 event 的独立解析。 +- Gateway 不再定义与 `EventRecord` 同构的序列化 struct,也不再独立实现 AgenticMD 文档重写或索引。 +- pChronicle MUST 使用 Gateway 的真实 AgenticMD、request/response、provider snapshot 与 SSE fixture 验证 wire、Arrow、Lance 和投影兼容性。 +- ATIF 与 Lance 查询 MUST 注册相同的 `runs`、`steps`、`tool_calls` Arrow schema。 +- pChronicle 的物理后端、格式转换、WAL/投影相关边界行为有回归测试。 +- 文档和 crate metadata 均把 pChronicle 表述为结构化轨迹存储层。 + +## Amendment history + +| Date | RFC | Change | +|---|---|---| +| 2026-08-16 | [RFC-0007](0007-events-contract-pchronicle-sidecar.md) | 将公共 `EventRecord` 契约迁至 `persisting-events`;pChronicle 保留全部物理存储、格式转换与读取 ownership | diff --git a/docs/src/zh/rfcs/0004-actf-format.md b/docs/src/zh/rfcs/0004-actf-format.md new file mode 100644 index 00000000..418572d3 --- /dev/null +++ b/docs/src/zh/rfcs/0004-actf-format.md @@ -0,0 +1,290 @@ +# RFC-0004: ACTF v1.0 轨迹格式 + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Format** | `actf` | +| **Date** | 2026-08-07 | +| **Component** | `persisting-pchronicle` | +| **Source fixture** | `data/make-doom-for-mips_software-engineering.json` | +| **Implements** | `crates/persisting-pchronicle/src/formats/actf.rs` · `crates/persisting-pchronicle/src/convert/actf.rs` | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [RFC-0003 pChronicle Ownership](0003-pchronicle-ownership.md) · [RFC-0008 ATIF](0008-atif-format.md) · [RFC-0009 OpenAI Messages](0009-openai-messages-format.md) | + +## 摘要 + +ACTF v1.0 是以 benchmark task 为根、以编号 attempt 为分支、以结构化 agent step 为 +轨迹单元的 JSON 格式。pChronicle 将 `actf` 作为 Storyline hub 的外围格式;每个 +attempt 转换为一条 Storyline,并写入既有的 `runs.lance`、`steps.lance`、 +`tool_calls.lance` 三表。新字段作为这三张表上的可空 JSON/时间列投影,不引入第四张表。 + +## JSON 数据模型 + +以下字段由样本抽象为 ACTF v1.0 的稳定核心。所有对象允许未知字段,解析器必须将其作为 +opaque JSON 扩展保留。 + +```text +ActfDocument +├── task_id: string +├── category: string +├── k: uint +├── correct: bool +├── attempts_tried: uint +├── solved_at: string | null +└── attempts: map + +ActfAttempt +├── correct: bool +├── final_answer: any | null +├── ground_truth: string | object | any +├── status: string +├── score: any | null +├── error: string +├── artifacts / extra / analysis_result / meta: any +└── trajectory: ActfTrajectory + +ActfTrajectory +├── schema_version: "ACTF_v1.0" +├── started_at / finished_at: string +└── steps: ActfStep[] + +ActfStep +├── step_id: integer +├── assistant_content: { content, reasoning_content, tool_calls } +├── metric: { prompt_tokens_len, completion_tokens_len, +│ llm_infer_ms, env_action_ms, stop_reason } +├── system_prompt / user_content: string +├── tools: ActfToolCall[] +├── observation: ActfObservation[] +└── started_at / finished_at: string + +ActfToolCall = { type?: string, id?: string, name?: string, + arguments? | input? | command?, ...event-specific fields } +ActfObservation = { type?: string, id?: string, tool_use_id?: string, + ...event-specific fields } +``` + +token 数、`llm_infer_ms` 和 `env_action_ms` 可以是数值或 `null`,`stop_reason` 也可以 +显式为 `null`。`assistant_content.content` / `reasoning_content`、`system_prompt` / +`user_content`、attempt `error` / `status` 也可以是字符串或 `null`;`null` 与缺省、空字符串 +按同一语义规范化(空 `reasoning_content` 使 `/reason` 缺省;空 `error` 使 +`/task/result/error` 缺省;空 `status` 仍校验失败)。解析器必须接受两种表示,进入 +Storyline 后 missing/null 按同一语义默认值规范化。ACTF v1.0 已观察到两种工具事件: +`tool_use` 使用 `name/input` 与 `tool_use_id/content`,`command_execution` 使用 +`command/aggregated_output/exit_code/status`,并通过共同的 `id` 关联。事件专属字段作为 +opaque JSON 保留。 + +## 校验约束 + +- `task_id`、`category`、attempt id 必须非空,`k > 0`。attempt `status` 可为空。 +- `attempts` 必须非空;`attempts_tried` 等于实际 attempt 数且不得大于 `k`。 +- trajectory 的 `schema_version` 必须是 `ACTF_v1.0`,时间字段必须非空。失败 attempt + 允许把 `trajectory` 写成 OpenClaw 事件数组(`session` / `message` / `model_change` + 等),而不是 `{schema_version, steps, ...}` 对象。这是 **ACTF 专属有损入口**,不是 + 独立 `DocumentFormat`,探测仍认作 ACTF。导入时 `message.role=user|assistant|toolResult` + 收成 Storyline turns,`toolResult` 折回前一条 assistant 的 `tool_calls`。导出写回 + canonical ACTF trajectory **对象**(含 `schema_version` / `steps`),不还原为事件数组。 +- step id 必须为正数并严格递增。 +- 同一步内 tool call id 唯一(缺 `id` 时按 `step-{step_id}-tool-{index}` 合成后再比)。`tools` 与 `assistant_content.tool_calls` 都非空时必须相等;一侧为空时以非空一侧为工具来源。`type` / `id` 可选;`{name, arguments}` 与 OpenAI `{id,type,function:{name,arguments}}` 都合法。attempt `status` 可为空。 +- observation 的 `type` 可选;仅有 `content` 的环境输出合法。存在 `tool_use_id` 或 `id` 时,必须引用同一步的 tool call。 + +根级 `correct`、`solved_at` 与 attempt 结果之间不施加样本之外的推导约束;它们按输入 +原值保存。 + +## ACTF → Storyline JSON Pointer 映射 {#actf-storyline-json-pointer-mapping} + +本节是 ACTF 到 Storyline 字段映射的权威定义。指针遵循 RFC 6901。Storyline 强类型 hub 只保留通用评测字段(`correct` / `score` / `status` / `error` / `final_answer` / `ground_truth` / `artifacts` / `max_score`);表中的 ACTF 私货目标(`/task/result/task_correct`、`category`、`attempts_tried`、`solved_at`、`retry_count`、`retry_counts`)落在 `task.result` extra,JSON Pointer 不变。`{a}`、`{s}`、 +`{c}`、`{o}` 和 `{t}` 分别表示 attempt key、源 step 下标、tool call 下标、observation +result 下标和目标 turn 下标。代入实际 token 后即为普通 JSON Pointer。 + +映射分成四类,禁止把不同角色的槽写进同一格: + +| 类别 | 含义 | 每个源 pointer 的目标数 | +| --- | --- | --- | +| 权威字段 | ACTF 值进入一个 Storyline 领域字段;同源导出从该字段还原 | 恰好 1 | +| 派生身份 | 由一个或多个源值计算,不是字段拷贝 | 公式,见下 | +| 便利提升 | 在权威字段之外再复制到 hub 顶栏或别名 | 额外 0 或 1,不替代权威字段 | +| 残差 | Storyline 没有对应领域字段,按原 pointer 进入 `unknown_fields` | 1(残差槽) | + +`P` 表示左侧命中的完整源 pointer;`E(P)` 表示把整个 `P` 作为 `fields` 对象 key 后再做 +一次 RFC 6901 token 转义。 + +基数: + +```text +ACTF document 1 ──► N Storyline 文档(共用 /run = task_id) +ACTF attempt 1 ──► 1 Storyline 文档 +ACTF step 1 ──► 1 Storyline turn +ACTF tool 1 ──► 1 Storyline tool_call +``` + +`/turns/{t}` 与源 `steps[{s}]` 保持同一数组顺序。`tools` 是 tool-call 的权威来源; +`tools` 非空时是 tool-call 的权威来源;`tools` 为空则回退到 +`assistant_content.tool_calls`。两侧都非空时必须完全相等,不另写一套目标。 +OpenAI `function.name` / `function.arguments` 分别映射到 `/fn` 与 `/args`,`function` +视为已消费。 + +### 权威字段(1:1) + +| ACTF JSON Pointer | Storyline JSON Pointer | +| --- | --- | +| `/task_id` | `/run` | +| `/correct` | `/task/result/task_correct` | +| `/category` | `/task/result/category` | +| `/k` | `/task/llm/k` | +| `/attempts_tried` | `/task/result/attempts_tried` | +| `/solved_at` | `/task/result/solved_at` | +| `/retry_count` | `/task/result/retry_count` | +| `/retry_counts` | `/task/result/retry_counts` | +| `/attempts/{a}` 的 map key `{a}` | `/attempt_id` | +| `/attempts/{a}/correct` | `/task/result/correct` | +| `/attempts/{a}/score` | `/task/result/score` | +| `/attempts/{a}/max_score` | `/task/result/max_score` | +| `/attempts/{a}/status` | `/task/result/status` | +| `/attempts/{a}/extra` | `/extra` | +| `/attempts/{a}/meta` | `/meta` | +| `/attempts/{a}/final_answer` | `/task/result/final_answer` | +| `/attempts/{a}/ground_truth` | `/task/result/ground_truth` | +| `/attempts/{a}/error` | `/task/result/error` | +| `/attempts/{a}/artifacts` | `/task/result/artifacts` | +| `/attempts/{a}/analysis_result` | `/final_metrics/analysis_result` | +| `/attempts/{a}/trajectory/schema_version` | `/origin/schema_version` | +| `/attempts/{a}/trajectory/started_at` | `/started_at` | +| `/attempts/{a}/trajectory/finished_at` | `/finished_at` | +| `/attempts/{a}/trajectory/steps/{s}/step_id` | `/turns/{t}/id` | +| `/attempts/{a}/trajectory/steps/{s}/started_at` | `/turns/{t}/ts` | +| `/attempts/{a}/trajectory/steps/{s}/finished_at` | `/turns/{t}/finished_at` | +| `/attempts/{a}/trajectory/steps/{s}/assistant_content/content` | `/turns/{t}/msg` | +| `/attempts/{a}/trajectory/steps/{s}/system_prompt` | 文档 `/prompt/system` 或 `/turns/{t}/prompt/system`(见下) | +| `/attempts/{a}/trajectory/steps/{s}/user_content` | 文档 `/prompt/user` 或 `/turns/{t}/prompt/user`(见下) | +| `/attempts/{a}/trajectory/steps/{s}/assistant_content/reasoning_content` | `/turns/{t}/reason` | +| `/attempts/{a}/trajectory/steps/{s}/tools` | `/turns/{t}/tool_calls` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/id` | `/turns/{t}/tool_calls/{c}/tcid` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/name` | `/turns/{t}/tool_calls/{c}/fn` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/type` | `/turns/{t}/tool_calls/{c}/kind` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/input` | `/turns/{t}/tool_calls/{c}/args` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/command` | `/turns/{t}/tool_calls/{c}/args/command` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/aggregated_output` | `/turns/{t}/tool_calls/{c}/result` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/status` | `/turns/{t}/tool_calls/{c}/response/status` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/exit_code` | `/turns/{t}/tool_calls/{c}/response/exit_code` | +| `/attempts/{a}/trajectory/steps/{s}/metric` | `/turns/{t}/metrics` | +| `/attempts/{a}/trajectory/steps/{s}/observation` | `/turns/{t}/observation/results` | + +`system_prompt` / `user_content` 按 pair 去重。第一个至少一侧非空的 pair 写入文档 +`/prompt`(空字符串键省略)。后续 step:pair 与基线相同则已消费,turn 不写 +`/prompt`;不同则该 turn `/prompt` 写当前完整 pair(整段覆盖,不是浅合并)。基线之前的 +双空 step 写 `{"system":"","user":""}`。导出时 +`system_prompt` / `user_content` 取 `turn.prompt` 否则文档 `/prompt`,缺省为 `""`。 + +`/metric` 与 `/observation` 是整对象/整数组复制。因此 +`prompt_tokens_len`、`completion_tokens_len`、`llm_infer_ms`、`env_action_ms`、 +`stop_reason` 及未知 metric 键都在 `/metrics` 内;observation 元素的 `type`、 +`tool_use_id`、`id`、`content`、`aggregated_output` 及其余键都在对应 +`/observation/results/{o}` 对象内。这些子键不再单独占一行权威映射。 + +空 `tools` 使 `/tool_calls` 缺省(不是空数组)。空 `observation` 使 `/observation` +缺省。空字符串 `reasoning_content` 使 `/reason` 缺省。空 `error`、空 `artifacts`、 +`null` 的 `final_answer` / `solved_at` / `score` 使对应 `/task/result` 键缺省。 + +`name` 为空或缺失时 `/fn` 回退到同 call 的 `type`;`type` 的权威目标只是 `/kind`。 +`args` 按 `input` → `arguments` → `function.arguments` → `{"command": command}` → +剩余 tool 对象(不含 `type`/`id`/`status`/`exit_code`)选择;因此 `/args/name` 等扁平键只在既无 `input` +也无 `arguments` / `command` 时出现,不是 `name` 的权威目标。`name` / `input` / `arguments` / +`function` / `command` / `aggregated_output` / `type` / `status` / `exit_code` 只要在源对象上出现,就视为已消费,即使这次选择没有用到该键也不 +写入残差。缺 `id` 时 Storyline `/tcid` 为 `step-{step_id}-tool-{index}`。`assistant_content.tool_calls` 上的同一组键同样已消费,不另写残差。 + +### 派生身份(不是字段拷贝) + +Storyline 要求每份文档有非空 `/session`。ACTF 没有 session 字段。`/session` 由 +`task_id` 与 attempt key 计算,不得再写进权威映射表: + +```text +/session := + task_id 当 attempts 恰有 1 个 + "{task_id}#attempt-{a}" 当 attempts 多于 1 个 +``` + +残差文档键同样由 `task_id` 赋值,但它不是 Storyline 领域字段,只用来把同一 ACTF +文档拆出的 N 条 Storyline 在导出时合并: + +```text +/unknown_fields/sources/actf/source_document_id := task_id +``` + +`/origin/document_id` 对 ACTF 保持缺省。同源恢复用 `/run` 还原 `task_id`,用 +`/attempt_id` 还原 attempt map key,用上述 `source_document_id` 校验切片来自同一文档。 + +没有源 pointer 的常量: + +| Storyline | 值 | +| --- | --- | +| `/schema_version` | `"storyline/v1"` | +| `/origin/format` | `"actf"` | +| `/agent/id` | `"actf-agent"` | +| `/agent/name` | `"ACTF Agent"` | +| `/turns/{t}/src` | `"agent"` | +| `/turns/{t}/nllm` | `1` | +| `/turns/{t}/kind` | `"autonomous"`(该 step 的 `tools` 非空);否则缺省 | + +### 便利提升 + +权威字段已经保存完整值。下列复制只服务 Storyline hub 顶栏或 ATIF 对齐别名;缺失或 +条件不满足时不写,不得替代权威字段。 + +| 源(已在权威表中) | 额外写入 | 条件 | +| --- | --- | --- | +| `/task/result/task_correct` | `/final_metrics/task_correct` | 有值 | +| `/task/result/correct` | `/final_metrics/correct` | 有值 | +| `/task/result/status` | `/final_metrics/status` | 有值 | +| `/task/result/score` | `/final_metrics/score` | 有值 | +| `/task/result/max_score` | `/final_metrics/max_score` | 有值 | +| `/metrics/llm_infer_ms` | `/turns/{t}/latency_ms` | 值为 number | +| `/metrics/env_action_ms` | `/turns/{t}/tool_calls/0/duration_ms` | 值为 number,且该 step 恰有 1 个 tool call | +| `results/{o}/tool_use_id` | `results/{o}/source_call_id` | 非空;优先于 `id` | +| `results/{o}/id` | `results/{o}/source_call_id` | 非空,且没有 `tool_use_id` | +| `results/{o}/aggregated_output` | `results/{o}/content` | 有 `aggregated_output`;否则才用已有 `content` | + +### 残差 + +未进入权威字段的键按原 pointer 写入 +`/unknown_fields/sources/actf/fields/{E(P)}`。`task_id`、`correct`、`attempts` 容器、 +已映射的 attempt `correct`/`score`/`max_score`/`status`/`analysis_result`/`final_answer`/`ground_truth`/`error`/`artifacts`/`extra`/`meta`/`trajectory.steps`, +根上的 `category`/`k`/`attempts_tried`/`solved_at`/`retry_count`/`retry_counts`, +trajectory 的 `started_at`/`finished_at`,step 的 `finished_at`、`system_prompt`、`user_content`, +以及 tool 的 `id`/`name`/`input`/`command`/`aggregated_output`/`type`/`status`/`exit_code` 不再作为残差保存。 + +| ACTF JSON Pointer | +| --- | +| `/{other-root-key}` | +| `/attempts/{a}/{other-attempt-key}` | +| `/attempts/{a}/trajectory/{other-trajectory-key}` | +| `/attempts/{a}/trajectory/steps/{s}/{other-step-key}` | +| `/attempts/{a}/trajectory/steps/{s}/assistant_content/{other-assistant-key}` | +| `/attempts/{a}/trajectory/steps/{s}/tools/{c}/{other-tool-key}` | +| `/attempts/{a}/trajectory/steps/{s}/assistant_content/tool_calls/{c}/{other-tool-key}` | + +未知 root 残差复制到该 document 产生的每一条 Storyline;同源恢复时这些副本必须一致。 +跨格式转换通过 version-1 `_storyline` envelope 携带外来 unknown fields。 + +## 保真边界 + +ACTF → Storyline → 三表 Lance → Storyline → ACTF 保证规范化 JSON 数据模型级语义一致: +未知键及其值(包括 `null`)、嵌套值、数组顺序和 attempt 分组均保留。已知字段的 +missing/显式 `null` 会按 Storyline 语义规范化;源文件空白、缩进和对象键顺序不属于保真 +边界。没有 ACTF source unknown fields 的普通 Storyline 可以导出为结构合法的单 attempt ACTF, +但这是有定义的合成转换,不宣称还原某个原始 ACTF 文件。`unknown_key_counts` 由 +`unknown_fields` 确定性重算,没有独立源 pointer。 + +## Amendment history + +| Date | Change | +| --- | --- | +| 2026-08-23 | `task.result` 强类型只保留通用评测字段;ACTF 私货进 extra,旧 Storyline JSON 同级键不得静默丢弃。OpenClaw 事件数组标为 ACTF 专属有损入口,不是独立 DocumentFormat。 | +| 2026-08-22 | 主映射改为每个源 pointer 恰好一个权威目标。`/session` 与 `source_document_id` 从 `/task_id` 拆出为派生身份;`kind`、`/fn` 回退、`latency_ms` / `duration_ms` / `source_call_id` / 规范化 `content` 改为便利提升。基数用语不再把 Storyline 文档叫成 run。 | +| 2026-08-22 | 评测/预算、文档与 step 结束时间、tool `type`/`status`/`exit_code` 进入 `/task`、`/started_at`、`/finished_at`、`tool_calls[].kind`/`response`;`task_correct`/`correct`/`status`/`score` 提升到 `/final_metrics`。 | +| 2026-08-22 | `system_prompt` / `user_content` 进入文档 `/prompt` 与 turn `/prompt`;不再作为残差。 | +| 2026-08-22 | `assistant_content.content` / `reasoning_content`、`system_prompt` / `user_content`、attempt `error` / `status` 接受 `null`,与空字符串同一规范化。 | +| 2026-08-22 | observation `type` 可选;仅有 `content` 的观察合法。合成导出仅在存在 tool 引用时补 `type=tool_result`。 | +| 2026-08-22 | `tools` 为空时回退 `assistant_content.tool_calls`;接受 OpenAI `function` 形状。 | +| 2026-08-22 | attempt `ground_truth` 接受任意 JSON(含 `{checklist_path}` 对象),权威目标仍是 `/task/result/ground_truth`。 | +| 2026-08-22 | tool `type`/`id` 可选;`{name,arguments}` 映射 `/fn`/`/args`,缺 `id` 合成 `step-{step_id}-tool-{index}`。attempt `status` 可空。 | +| 2026-08-22 | attempt `extra`/`meta` 进入文档 `/extra`/`/meta`;`max_score` 进入 `/task/result/max_score`。 | diff --git a/docs/src/zh/rfcs/0005-pchronicle-revision-lineage.md b/docs/src/zh/rfcs/0005-pchronicle-revision-lineage.md new file mode 100644 index 00000000..9019fc73 --- /dev/null +++ b/docs/src/zh/rfcs/0005-pchronicle-revision-lineage.md @@ -0,0 +1,40 @@ +# RFC-0005: pChronicle 派生 Revision Lineage + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Date** | 2026-08-09 | +| **Component** | `persisting-pchronicle` | +| **Related** | [RFC-0002 Events](0002-events-format.md) · [RFC-0003 Ownership](0003-pchronicle-ownership.md) | + +## 摘要 + +clean、redact、augment 和格式化数据集是 canonical events 的派生产物。它们不得覆写或 +去重事实流,也不得把 catalog 语义塞入 Storyline `extra_json`。每个 Run 使用独立的 +`revisions.lance` 记录 lineage;canonical `events.lance` 继续维持 at-least-once、 +append-only 契约。 + +## 数据模型 + +每个 revision 以 `revision_id` 为 upsert key,包含: + +- `parent_revision_ids`:零个或多个父 revision; +- `kind`:`clean`、`redact`、`augment`、`export` 或扩展 kind; +- `canonical_snapshot`:输入 event manifest revision或 Storyline snapshot; +- `recipe`:可重放的程序、版本、参数和输入摘要 JSON; +- `status`:`building`、`ready` 或 `failed`; +- `created_at` 与 `output_refs`。 + +`revisions.lance` 是派生 catalog,不参与 canonical event 的提交、replay 或审计裁定。 +写入相同 `revision_id` 更新状态和产物引用;不同 revision 永不隐式合并。 + +## 一致性与回收 + +产物必须先持久化,再把 revision 切到 `ready`。失败记录可保留用于诊断。对象维护将 +`CURRENT` 以及保留的 `ready` revision 视为 GC roots;删除 revision 本身必须是显式维护操作。 + +## 验收 + +- 同一 revision 从 `building` 更新为 `ready` 只留下一个 catalog row。 +- lineage 写入不改变 canonical event 行数或 manifest。 +- catalog 可被 Web UI 和 DataFusion 消费,并能定位 recipe 与产物。 diff --git a/docs/src/zh/rfcs/0006-pchronicle-vortex-backend.md b/docs/src/zh/rfcs/0006-pchronicle-vortex-backend.md new file mode 100644 index 00000000..d91f53a5 --- /dev/null +++ b/docs/src/zh/rfcs/0006-pchronicle-vortex-backend.md @@ -0,0 +1,1605 @@ +# RFC-0006: pChronicle Vortex 轨迹后端提案 + +| Field | Value | +|---|---| +| **Status** | Proposed | +| **Date** | 2026-08-16 | +| **Component** | `persisting-pchronicle` / proposed `persisting-pchronicle-vortex` | +| **Decision scope** | 可重建、读取优化的 Vortex trajectory projection;不替换 canonical facts | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [RFC-0002 Events](0002-events-format.md) · [RFC-0003 Ownership](0003-pchronicle-ownership.md) · [RFC-0005 Revision Lineage](0005-pchronicle-revision-lineage.md) | +| **External references** | [ATIF v1.7](https://github.com/harbor-framework/harbor/blob/main/rfcs/0001-trajectory-format.md) · [Vortex concepts](https://docs.vortex.dev/concepts/) · [Vortex file format](https://docs.vortex.dev/specs/file-format) | + +## 1. 摘要与提议 + +本 RFC 提议为 pChronicle 增加一个**隔离、可选、可重建**的 Vortex 轨迹读取后端。第一阶段 +Vortex 是 canonical `events.lance` 或受信交换输入的派生 projection,服务以下负载: + +- 按 trajectory/session 读取完整对话、tool call 和 observation; +- 对时间、模型、source、tool、指标和 copied-context 做窄列扫描; +- 直接供 SFT/RL 读取 typed token、logprob、reward 和上下文边界; +- 在对象存储上用较少的大文件和 range read 降低 GET、listing 与小文件成本; +- 以 ATIF/Storyline 语义组织数据,同时保持物理窄列和独立投影。 + +本 RFC **不**提议立刻: + +- 把 Vortex 加进 pChronicle 默认 feature; +- 让 Gateway 同时双写 Lance 与 Vortex; +- 用 Vortex 替换 canonical facts、writer fencing 或当前 Lance MVCC; +- 声称 Vortex 在所有轨迹、所有查询上都比 Lance 更小或更快; +- 把 Lance 与 Vortex 强行抽象成语义完全相同的一个 `StorageBackend`。 + +本 RFC 也不自动修改 RFC-0003 的“外围格式经 Storyline hub”规则。下面识别出的 ATIF v1.7 +保真差距必须通过 Storyline/mapping 的独立 schema 决策解决;实验代码可以测量候选物理模型, +但不能绕过已接受的 production ownership contract。 + +建议的初始拓扑是: + +```text +Gateway / importer + │ + ▼ +canonical events or fixed exchange snapshot + │ + ├── current Storyline Lance projection + │ + └── Vortex projector + │ + ▼ + immutable Vortex dataset snapshot + │ + ├── point trajectory reader + ├── virtual runs/steps/tool_calls tables + └── SFT/RL sequential reader +``` + +只有在代表性数据上满足本 RFC 的正确性、恢复、依赖隔离和性能门槛后,才另行决定是否让 +Vortex 成为正式 projection,或进一步研究 direct-capture/canonical backend。 + +## 2. 背景与问题 + +### 2.1 当前模型的优点 + +当前 `StorylineLanceStore` 把一个 Storyline 拆成: + +| 表 | 粒度 | +|---|---| +| `runs.lance` | 一条 Storyline 一行 | +| `steps.lance` | 一个 turn 一行 | +| `tool_calls.lance` | 一个 tool call 一行 | +| `objects.lance` | 内容寻址的大对象 | + +三表是合理的关系投影:列窄、SQL 直观、Lance BTree/Bitmap index 可用,单个 Storyline 可以 +merge-replace,大对象可以 BLAKE3 去重并延迟 hydrate。它也已经通过 `CURRENT` 固定三张业务表 +和对象表的精确 version。 + +### 2.2 当前模型的结构成本 + +三表也引入了不可忽略的物理成本: + +1. `run_id`、`session_id` 在 step 和 tool-call 行中重复; +2. 完整 trajectory 需要定位和读取三张 dataset,必要时再读取 `objects.lance`; +3. `message`、`metrics`、`arguments`、`results` 和 `extra` 中仍有大量 JSON 文本; +4. token id、logprob、reward 等数组若留在 JSON 中,无法充分使用 integer packing、delta、 + sparse、共享 offsets 和压缩态计算; +5. 高频 replace 会积累 fragment、delete file、index delta 和历史 version,必须显式维护; +6. 三张表、业务索引、对象表和 generation 增加 S3 object、open 和 range 请求; +7. 关系模型并不直接表达 ATIF 的 `Trajectory → steps → tool_calls / observation` 局部性。 + +### 2.3 不能用一个普通“宽嵌套行”解决 + +把整个 ATIF JSON 或一个超宽 `Struct` 作为 trajectory 行写入 Vortex,并不能自动得到好结果: + +- JSON 字段仍然失去类型信息; +- 如果嵌套字段不能独立 projection,扫描一个 `source` 也可能物化 message/tool result; +- 一个超大 trajectory 可能形成超大 cell,破坏 page、缓存和并行调度; +- 默认 DataFusion 集成对复杂 nested projection 的能力不能替代领域 reader; +- “逻辑嵌套”不等于“物理宽表”,两者必须由 Layout 明确分开。 + +因此本提案的核心不是更换文件扩展名,而是: + +> 以 trajectory 作为局部性、目录和提交单元;以 List offsets 和独立 child lane 保持物理窄列; +> 以 Vortex Layout/Encoding 组织压缩、裁剪和 range I/O。 + +## 3. 设计原则 + +### 3.1 逻辑嵌套,物理窄列 + +公共逻辑模型保持 ATIF/Storyline 的嵌套含义。物理模型把每层 `List` 的 offsets 和 +child fields 分开存储,因此 step/tool/result 不重复上层身份,也不要求读者一次取回整个结构。 + +### 3.2 DType、Encoding、Layout 分工 + +- **DType** 表示 ATIF/Storyline 的逻辑值和 nullability; +- **Encoding** 表示一个 array 如何压缩,例如 dictionary、sequence、run-end、sparse、FSST、 + PCodec、Zstd 或后续的 prompt-prefix encoding; +- **Layout** 决定跨 array、跨 trajectory、跨 page 的位置、chunk、统计和 I/O 局部性。 + +领域语义不能塞进通用压缩器;文件位置、S3 locality 也不能靠 DType 猜测。 + +### 3.3 不可变发布优先于对象内 append + +标准 S3 `PutObject` 不能随机改写对象的一部分;S3 Express One Zone directory bucket 只支持在 +当前对象末尾 append,而且有 part 数量、部署范围和存储类别约束。因此 baseline 不依赖对象内 +append,而使用滚动不可变文件、不可变 manifest 和一个很小的条件更新 `CURRENT`。 + +### 3.4 Projection 失败不能影响事实写入 + +Vortex projector 固定输入事实 snapshot 后异步构建。构建、上传、索引或 `CURRENT` CAS 失败时, +旧 Vortex snapshot 继续可读,canonical facts 不回滚、不阻塞、不伪装成已经投影成功。 + +### 3.5 先组合内建能力,再引入自定义格式 + +第一阶段优先组合 Vortex 内建 DType、array encoding 和 layout node。只有 benchmark 证明通用布局 +不足时,才引入自定义 `TrajectoryClusterLayout`、`PromptPrefixArray` 或 `ExternalBlobLayout`。 +自定义 on-disk ID 必须版本化并注册,不能依赖未声明的进程内实现细节。 + +### 3.6 依赖和构建默认隔离 + +Vortex 不进入 pChronicle、orchestration layer、pVisor、Gateway 或 CLI 的默认依赖图。默认构建、测试和发布 +二进制中不得出现 Vortex crate,除非消费者显式启用或构建独立实验 crate。 + +## 4. 范围与非目标 + +### 4.1 第一阶段范围 + +- 本地文件和 S3-compatible object store; +- 从固定 canonical snapshot 或 ATIF/Storyline corpus 构建; +- 在 manifest 声明的 capability 内完整重建 Storyline/ATIF;不支持的 hub 语义必须拒绝或显式 + quarantine,不能静默丢失; +- `runs`、`steps`、`tool_calls` 公共虚拟关系; +- 单 trajectory 点读、批量顺序读和窄列分析扫描; +- typed metrics/token lanes; +- 大对象 hot/cold/external 分层; +- generation、CAS、校验、compaction、vacuum 和 projection lineage; +- 与现有 Lance 路径的差分正确性和性能 benchmark。 + +### 4.2 第一阶段非目标 + +- 对一个已发布 `.vortex` 文件原地更新; +- 每个 Gateway SSE chunk 都更新同一个 S3 对象; +- 每步随机 update 的低延迟 OLTP; +- 全局 exactly-once、event ID 唯一性或自动 retry merge; +- 全文、向量或语义 Search; +- 依靠 Vortex 文件自身提供 table-format、catalog 或跨文件事务; +- 绕过 pChronicle reader 后仍保证外部 blob 自动 hydrate; +- 读取未知自定义 encoding/layout 时静默退化。 + +## 5. 逻辑模型 + +### 5.1 Dataset、Run、Trajectory 与 Step + +Vortex projection 的逻辑根是 `TrajectoryBundle`。一个 Dataset snapshot 包含多个 bundle file, +每个 file 包含多个独立 trajectory。 + +```text +DatasetSnapshot +└── DataFile* + └── Trajectory* + ├── Agent + ├── Step* + │ ├── Message / Reasoning / Metrics + │ ├── ToolCall* + │ └── ObservationResult* + └── Parent / Child trajectory references +``` + +### 5.2 身份语义 + +ATIF v1.7 区分 run-scoped `session_id` 与 document-scoped `trajectory_id`;兄弟 subagent 可以共享 +`session_id`。当前 Storyline 使用 required `session_id` 作为 Storyline key。因此物理目录不能把 +裸 `session_id` 当成跨 source 全局唯一键。 + +本提案定义内部键: + +```text +TrajectoryKey = ( + source_id, + run_key, + trajectory_key +) +``` + +其中: + +- `source_id` 来自固定输入 Source identity; +- `run_key` 优先使用 Storyline `run_id` 或 ATIF run-scoped `session_id`; +- `trajectory_key` 优先使用独立 `trajectory_id`,否则使用规范化 Storyline `session_id`; +- 两者仍不足时,importer 以 source fingerprint、文档路径和稳定 preorder ordinal 生成内部键; +- 生成键是物理 identity,不回写或伪装成生产者原始 ID。 + +公共 SQL 始终保留 `_file_`/Source identity;跨 Source join 不能只使用 `session_id`。 + +### 5.3 Subagent 拓扑 + +ATIF 允许递归 `subagent_trajectories`。无限递归地把整棵树放入一个 row 会导致: + +- schema projection 复杂; +- 单 row 可能极大; +- subagent 无法独立定位和并行读取; +- 相同子轨迹难以复用或单独更新。 + +因此 writer 在 Dataset 内把递归树**拓扑扁平化**为独立 trajectory rows,并保存: + +```text +parent_trajectory_key: TrajectoryKey? +child_trajectory_keys: List +parent_local_ordinal: u32? +child_local_ordinals: List? +producer_trajectory_id: Utf8? +producer_session_id: Utf8? +``` + +key reference 是跨 file 的正确性表示;local ordinal 只在 parent/child 被共同放进一个 data file 时 +作为加速提示,不能单独承担身份。writer 应尽量共置一棵中小 subagent tree,但超大拓扑允许跨 +file/cluster。导出 ATIF 单文件时,reader 通过 directory 解析 key 并恢复递归 +`subagent_trajectories`;正常查询和训练可以独立扫描子轨迹。 + +### 5.4 Gateway 流与终态 trajectory + +在线 Gateway 事件在收到请求时并不知道后续 SSE、tool result、subagent 或终态指标。第一阶段 +Vortex projection 不要求热路径提前构造完整 ATIF。projector 从固定 canonical events snapshot +折叠出终态或截止水位的 Storyline,再写 Vortex。 + +如果未来引入 direct Vortex capture,应使用独立的 `GatewayExchange` 事件 DType 和滚动 segment, +而不是让未完成事件不断重写一个 `Trajectory` row。`GatewayExchange → TrajectoryBundle` 仍是显式 +projection 边界。 + +### 5.5 当前 Hub 与 ATIF v1.7 的保真差距 + +本提案不能把现有转换代码尚未表达的语义假装成存储引擎已经解决。当前实现至少有两个需要在 +production 之前明确处理的边界: + +1. `AtifTrajectory::effective_session_id` 优先把 `session_id` 当作规范化 Storyline key,但 ATIF v1.7 + 已允许兄弟 subagent 共享 run-scoped `session_id`;物理 `TrajectoryKey` 必须继续区分文档身份; +2. 当前 `split_storyline` 要求 observation result 关联同一步的 tool call,而 ATIF 允许 system action + 或非标准 action 的 result 没有 `source_call_id`。 + +Vortex writer 必须保留这些 ATIF 值,不能为了复用当前三表而丢弃或伪造关联。production 路径 +需要先扩展 Storyline hub/mapping,形成能携带这些语义的 backend-neutral projection envelope, +再由 Vortex writer 消费。目标表示采用: + +- Storyline projection envelope 保留 producer identity、document identity 和内部 key; +- observation result 物理上属于 step observation,并以 nullable call ordinal 建立可选关联; +- tool-call 内联 `result` 规范化到同一 result lane,同时保存 `result_origin`,以便按原形导出; +- full trajectory reader 能无损恢复支持范围内的 ATIF 语义; +- 三表兼容 view 只把已经关联的 result 聚合到 `tool_calls.results`。 + +若要让这些语义也成为 Storyline hub 和 Lance/Vortex 共同 SQL contract,应先单独演进 Storyline/ +query schema 并更新 RFC-0001/RFC-0003;backend 不能私下改变既有三表的含义。Phase 1 lab 可以用 +内部 direct mapper 验证 DType/Layout,但该 mapper 不注册为正式 import/query 路径。 + +### 5.6 Open、Terminal 与截断 trajectory + +固定事实 snapshot 中的 trajectory 不一定已经结束。Vortex root 必须保存 projection completeness, +不能把“截至水位可见”伪装成 terminal: + +```text +projection_state: open | terminal | truncated | invalid +source_fact_start: u64? +source_fact_end_exclusive: u64? +terminal_event_id: Utf8? +projection_warnings: List +``` + +- `open` 可以被后续 sync 以新 revision 替换; +- `terminal` 表示 projector 已观察到受支持的终态事实,不代表未来绝不追加审计事件; +- `truncated` 表示 source cutoff、size policy 或导入声明造成不完整; +- `invalid` 默认不进入 ready snapshot,只有显式 quarantine/debug Dataset 才可保存; +- SFT/RL reader 默认只消费 `terminal`,除非调用者显式允许 open/truncated; +- manifest 记录各状态计数和 completeness contract。 + +## 6. 物理 DType:嵌套但不宽化 + +### 6.1 顶层 DType + +概念上的 Vortex root 是一个 trajectory array: + +```text +Struct [N] +├── identity / run / lineage scalars +├── agent: Struct +├── summary: Struct +├── parent / children: TrajectoryRef + List +└── steps: List> +``` + +`steps` 虽然逻辑上嵌套,物理上由 offsets 和扁平 child arrays 表示: + +```text +step_offsets: [N + 1] +step_id: [M] +timestamp: [M] +source: [M] +message_tag: [M] +message_hot: [M] +message_cold: [M] +reasoning_content: [M] +... +``` + +其中 `M` 是文件内全部 step 数。tool call 和 observation 分别使用第二层 offsets;result 仍属于 +step observation,而不是被强制嵌入 tool call: + +```text +tool_offsets: [M + 1] +tool_call_id: [K] +function_name: [K] +arguments_hot: [K] +arguments_cold: [K] + +observation_offsets: [M + 1] +result_content: [R] +result_source_call_ordinal: Sparse[R]? +result_origin: [R] # observation | inline_tool_result +result_extra: [R] +``` + +`result_source_call_ordinal` 指向当前 step 的 call ordinal;null 表示 system/non-tool action。读取公共 +`tool_calls` relation 时只聚合非 null 且校验匹配的 result,完整 ATIF reader 则恢复全部 observation。 + +因此磁盘上没有在每个 step/tool row 重复 `run_id` 和 `session_id`。只有虚拟 SQL 表输出时, +`AtifSource` 才把父 trajectory 的 identity 作为 dictionary/constant array 投影给 Arrow。 + +### 6.2 Trajectory 顶层字段 + +| 字段组 | 典型字段 | 物理策略 | +|---|---|---| +| identity | source、run、session、trajectory、parent | dictionary/FSST;只存一份 | +| agent | id/name/version/default model | file/cluster dictionary | +| topology | parent/child key、本地 ordinal、continuation | key refs + primitive + List offsets | +| summary | step/tool 数、时间范围、source mask | common-source bits + `has_other`/bloom | +| training summary | copied/new steps、token counts、reward presence | typed fixed-width | +| flexible root | notes、final metrics extra、extra | typed core + JSON escape lane | + +### 6.3 Step 字段 + +| 字段 | 首选表示 | 说明 | +|---|---|---| +| `step_id` | delta/sequence integer | 常从 1 单调递增 | +| `timestamp` | UTC millisecond + delta | 原始无法规范化时拒绝或进入显式 escape | +| `source` | small enum/dictionary | system/user/agent 等值高度重复 | +| `model_name` | dictionary | 继承 agent default 时保存 override bitmap | +| `llm_call_count` | sparse integer | null 与 0 必须区分 | +| `is_copied_context` | validity + bitmap | null 与 false 语义不同 | +| `message` | tagged content lanes | text/multimodal/empty 不混为 JSON string | +| `reasoning_content` | hot/cold content lanes | 常为空或长文本 | +| `reasoning_effort` | tagged scalar + escape | string/float union | +| `metrics` | typed core + extra JSON | token、成本、reward、logprob 可独立读 | + +### 6.4 Message 与 ContentPart + +ATIF message/result content 可以是 string 或 multimodal ContentPart array。不能把两者都序列化成一个 +JSON cell: + +```text +message_kind: [M] # text | parts +message_text_hot/cold: [M]? + +message_part_offsets: [M + 1] +part_kind: [Q] # text | image | future/escape +part_text_hot/cold: [Q]? +part_media_type: [Q]? +part_source_kind: [Q]? # relative path | CAS asset | inline producer data +part_source_ref: [Q]? +part_extra_json: [Q]? +``` + +空字符串、空 parts array、null lane 和 absent producer field 必须按 schema 允许范围区分。observation +result 的 `content` 复用同一 `ContentValue/ContentPart` 子结构。tool `arguments` 第一阶段仍使用经验证 +的 JSON object hot/cold lane,避免在没有稳定跨工具 schema 时制造成千上万稀疏字段。 + +### 6.5 Metrics 与训练字段 + +ATIF 已明确定义 `prompt_tokens`、`completion_tokens`、`cached_tokens`、`cost_usd`、 +`prompt_token_ids`、`completion_token_ids` 和 `logprobs`。这些字段不应继续整体保存在 +`metrics_json` 中: + +```text +metrics_present: Bitmap[M] +prompt_tokens: Sparse[M] +completion_tokens: Sparse[M] +cached_tokens: Sparse[M] +cost_usd: Sparse[M] + +prompt_token_offsets: [M + 1] +prompt_token_ids: [P] # u32/u64 由校验后的 tokenizer domain 决定 + +completion_token_offsets: [M + 1] +completion_token_ids: [C] +logprob_offsets: [M + 1] +logprobs: [L] # 与 completion token 对齐时可共享 offsets + +metrics_extra_json: Utf8?[M] +``` + +writer 必须验证声明的长度关系。规范只给出 SHOULD 的关系若不满足,应保留独立 offsets 并记录 +warning;会导致歧义或越界的值进入原始 escape/reject policy,不能截断数组使其“对齐”。无法安全 +类型化的 provider-specific 值保留在 `metrics_extra_json`,不能丢弃。 + +### 6.6 JSON 和未知扩展 + +第一阶段采用“typed core + canonical JSON escape”原则: + +- 规范已稳定且查询频繁的字段提升为 typed lane; +- 未知 `extra`、未来 ATIF 字段和不规则 JSON 保留为 UTF-8 JSON; +- JSON 只保证语义 roundtrip,不保证原始空白和对象 key 顺序; +- 如果上游要求字节级保真,应引用 canonical event payload,而不是经 Storyline/ATIF roundtrip; +- 不在第一阶段依赖尚未稳定的私有 Variant encoding。 + +### 6.7 顺序语义 + +- trajectory 在 data file 中的物理行顺序不构成公共 API;跨 trajectory SQL 排序必须显式 + `ORDER BY`; +- step list 保存规范化输入顺序,并有隐式 `step_ordinal`;`step_id` 仍是生产者字段,必须为正且在 + trajectory 内唯一; +- tool call 和 observation result 保留各自数组顺序,以 local ordinal 关联; +- current Storyline compatibility reader 可以继续按 `step_id/call_index` 重建其既有 contract; +- ATIF fidelity reader 使用保存的 source ordinal,不因列式写入静默改变数组顺序; +- 如果 `step_id` 与数组顺序冲突,manifest/verify 标记 `non_monotonic_step_id`,由调用者选择严格拒绝 + 或保真读取,不能无提示排序后声称无损 roundtrip。 + +## 7. Layout:trajectory cluster 优先 + +### 7.1 为什么不是默认 field-first 布局 + +Vortex 默认文件布局大致是顶层 Struct 按字段拆分,再按 zone/chunk/compressor/buffer 组织。这对 +大表分析很合理,但完整 trajectory 点读可能跨越很多远距离字段 range。反过来,把一条 trajectory +所有字节连续写成 blob 又会失去列裁剪。 + +本提案使用两层折中: + +```text +ChunkedLayout by trajectory cluster +└── StructLayout by logical lanes + ├── ZonedLayout / Compressor / Buffered: summary + scalar lanes + ├── ZonedLayout / Compressor / Buffered: message/reasoning lanes + ├── ZonedLayout / Compressor / Buffered: tool/result lanes + └── ZonedLayout / Compressor / Buffered: token/logprob lanes +``` + +先按一组完整 trajectory 形成 cluster,再在 cluster 内按窄 lane 组织。点读通常只访问一个 cluster; +分析扫描仍可只读取每个 cluster 的目标 lane。 + +### 7.2 建议初始尺寸 + +以下是 benchmark 起点,不是永久格式常量: + +| 单元 | 默认目标 | 边界策略 | +|---|---:|---| +| compressed data file | 256 MiB | 128–512 MiB 自适应滚动 | +| compressed trajectory cluster | 16 MiB | 8–32 MiB;不跨 trajectory 边界切分 | +| compressed lane buffer/page | 256 KiB–1 MiB | 大 payload/token lane 可更大 | +| directory shard | 16–64 MiB | 按 key range 分片 | +| blob pack | 128–512 MiB | 独立 immutable object | + +一个 trajectory 超过 cluster 目标时单独成 cluster。它的逻辑 row 不拆散,但 message、result、token +等 child lane 允许继续 page/chunk,避免必须一次读取或分配整个超大 payload。 + +### 7.3 Layout profile + +writer 可以声明 profile,但同一 Dataset snapshot 应使用单一 profile: + +| Profile | 优化目标 | 代价 | +|---|---|---| +| `balanced` | 默认;点读与扫描折中 | 两类负载都不是极限 | +| `trajectory` | 完整 trajectory/S3 冷读 | 单列全库扫描产生更多 range | +| `analytics` | 大范围列扫描、训练 | 单 trajectory 可能跨更多 segment | + +第一阶段只实现 `balanced`,其他 profile 先作为 benchmark 变量,避免过早形成兼容承诺。 + +### 7.4 内建 Layout 与自定义 Layout 的边界 + +Phase 1 使用内建 `ChunkedLayout`、`StructLayout`、`ZonedLayout`、`DictionaryLayout` 和 +`FlatLayout` 的组合,只定制 writer 的 layout strategy 和 chunk boundary。这样普通 Vortex +工具仍能识别 layout tree。 + +只有以下条件同时满足才引入 `dev.persisting.trajectory_cluster.v1` 自定义 Layout: + +1. 内建组合无法在 trajectory boundary 上生成所需 split/pruning; +2. 代表性 benchmark 有显著收益; +3. reader registry、兼容测试和 fallback/rebuild 路径已经存在; +4. 自定义 Layout 不依赖未版本化 Rust 类型布局。 + +## 8. 字段 Encoding 策略 + +### 8.1 默认策略 + +| 数据分布 | 候选 Encoding | 典型字段 | +|---|---|---| +| 小基数重复字符串 | dictionary + FSST | source、model、function name、agent version | +| 单调整数 | sequence/delta/FastLanes | step_id、timestamp、offsets | +| 大量 null | sparse/validity | metrics、reasoning、duration | +| 连续重复值 | run-end | inherited model、source runs、copied-context runs | +| 整数数组 | bit packing/PCodec | token ids、counts、ordinals | +| 浮点数组 | ALP/PCodec | cost、reward、logprobs,按实际分布选择 | +| 普通文本 | FSST 或 Zstd | message、reasoning、JSON extra | +| 已压缩/高熵 binary | identity | image、archive、独立压缩 blob | + +writer 必须记录每 lane 的 logical bytes、stored bytes、chosen encoding 和 encode time,避免“编码 +看起来高级但在当前分布上变大或变慢”。 + +### 8.2 Prompt-prefix encoding + +相邻 agent step 的 `prompt_token_ids` 往往包含长公共前缀。把每一步完整 token list 独立保存会 +重复历史上下文。本提案预留: + +```text +PromptTokenSequence { + base_step_ordinal: u32? + common_prefix_len: u32 + suffix_tokens: List +} +``` + +为了限制随机读取的依赖链: + +- 每 8–32 个 prompt 或达到字节阈值强制 checkpoint; +- 一个 prompt 最多依赖当前 trajectory 内一个早先 checkpoint/base; +- base 不能跨 file,默认也不跨 cluster; +- 解码必须验证 prefix length 和 token count; +- `take/filter` kernel 可以只解码命中 step; +- 没有至少 20% 空间收益时回退普通 List encoding。 + +这是 Phase 3 的自定义 Encoding 候选,不是 Phase 1 的 on-disk 要求。 + +### 8.3 Copied context + +`is_copied_context` 是训练语义,不等同于内容去重。第一阶段仅将它作为 bitmap 和 summary count, +允许 SFT reader 在读取 payload/token 前过滤。后续可以让 copied step 引用相同 Dataset snapshot 中 +的内容 hash,但不得让训练过滤语义依赖去重是否成功。 + +## 9. 大对象与内容层 + +### 9.1 三层策略 + +不是所有大内容都应成为一个独立 S3 object。本提案区分: + +| Tier | 表示 | 适合内容 | 读取成本 | +|---|---|---|---| +| hot inline lane | 当前 cluster 的小值 page | 短 message/arguments/metadata | 最低 | +| cold in-file lane | 同一 `.vortex` 文件的独立大值 lane | 中等、通常唯一、偶尔读取 | 一个额外 range/page | +| external CAS blob pack | 内容地址 + pack/row locator | 超大、重复、附件、独立生命周期 | directory + pack range | + +hot/cold 都在一个 Vortex 文件中,但使用不同 nullable child lane;扫描 summary、source 或 metrics +不会读取 cold lane。external 才是真正 offload。 + +### 9.2 ContentValue + +逻辑内容值保持原类型,物理上使用: + +```text +ContentValue { + storage_kind: hot | cold | external + logical_type: utf8 | json | binary | multimodal + hot_bytes: Binary? + cold_bytes: Binary? + content_id: FixedBinary<32>? + raw_length: u64 + stored_length: u64? + codec: identity | zstd | producer + media_type: Utf8? + preview: Utf8? +} +``` + +nullable lanes由 tag 解释。reader 不得把内部 locator 暴露成用户值;`Full` 模式返回完整内容, +`Preview` 模式返回显式 preview 类型并禁止把 preview 当作完整内容执行谓词。 + +这里的 `FixedBinary<32>` 是逻辑记法;实现应优先使用选定 Vortex edition 可稳定表达的 +`FixedSizeList`/binary DType,不应只为 hash 引入私有 DType。 + +### 9.3 Tier 选择 + +默认阈值只是初始值,最终由 corpus benchmark 调整: + +- 小于 8 KiB:优先 hot; +- 8–256 KiB:优先 cold; +- 大于 256 KiB:候选 external; +- 任意大小若命中已存在 content hash 且复用收益大于 locator/GET 成本,可 external; +- image/audio/archive 或 producer-compressed payload 默认 external/identity; +- 查询频繁但很大的 typed token lane不应仅因大小被当作不透明 blob。 + +选择器应同时考虑大小、估计重复率、查询频率、媒体类型和生命周期,而不是只使用固定阈值。 + +### 9.4 CAS 与 Blob pack + +每个 blob 一个 S3 object 会造成 object、GET、listing 和 GC 碎片。external content 使用 +128–512 MiB immutable Vortex blob pack: + +```text +Struct +├── content_id: FixedBinary<32> +├── logical_type +├── media_type +├── codec +├── raw_length +├── stored_length +├── preview +└── payload: Binary +``` + +`content_id = BLAKE3(raw bytes)`。payload 可以独立 Zstd;如果压缩无净收益则 identity。pack 按 +content id 排序或分 zone,payload lane 不做二次整页压缩时必须明确标记。全局 content directory +把 hash 映射到 `(pack_id, row/zone)`;已有 hash 直接复用,不重复写入 pack。 + +trajectory data 只持久化 `content_id`,不持久化 pack locator;因此 blob compaction 可以移动对象并 +原子发布新 content directory,而不重写全部 trajectory files。 + +### 9.5 一致性与 GC + +发布顺序必须是: + +```text +blob pack + → blob directory + → trajectory data files + → trajectory directory/inventory + → snapshot manifest + → CURRENT +``` + +失败允许留下不可达 pack/file,但不允许发布悬空引用。GC 只删除所有 retained manifest 都不可达 +且超过 grace period 的对象。内容 hash 碰撞、长度不匹配、解压长度错误或 checksum 错误必须失败 +关闭,不能返回未经验证的字节。 + +### 9.6 多模态附件 + +ATIF multimodal content 可以用相对路径引用 image 等附件。projection builder 必须显式选择策略: + +- `preserve-reference`:保存原始相对引用和 source identity,Dataset 不声明 self-contained; +- `embed-assets`:在固定 Source snapshot 中解析受限相对路径,将内容写入 CAS blob pack,并保留原始 + 路径/media type provenance; +- 路径越界、绝对 URI、无法固定版本或读取失败时,`embed-assets` 构建失败,不能静默留下悬空内容。 + +正式 S3 Dataset 默认应使用 `embed-assets`;本地诊断 prototype 可以显式选择 +`preserve-reference`。两种策略必须写入 manifest 和 projection recipe。 + +## 10. 文件、目录与 Dataset 布局 + +### 10.1 目录结构 + +```text +root/ +├── CURRENT +├── manifests/ +│ └── .json +├── inventories/ +│ └── -.vortex +├── directories/ +│ ├── trajectory/-.vortex +│ └── content/-.vortex +├── data/ +│ └── /.vortex +├── blobs/ +│ └── .vortex +└── staging/ + └── /... +``` + +`data/` partition 只用于粗粒度生命周期和发现,例如日期、tenant 或 run bucket;高基数字段不能 +直接形成深目录。Catalog 只把包含 `CURRENT` 的根识别为一个 source,不把内部 data/blob 文件 +再次发现为独立 source。 + +稳态 data object 数量应近似 `ceil(compressed_data_bytes / target_file_bytes)`,而不是 trajectory 数; +directory、inventory 和 blob pack 也按目标尺寸分片。小尾文件数量持续增长视为 compaction debt, +不能用“单文件布局”掩盖。 + +### 10.2 `CURRENT` + +`CURRENT` 是小 JSON 指针: + +```json +{ + "format": "pchronicle-vortex-current/v1", + "snapshot_id": "...", + "manifest": "manifests/.json", + "manifest_digest": "blake3:..." +} +``` + +本地通过临时文件、fsync 和 atomic rename 发布;对象存储通过 ETag/version 的 `If-Match` 或 +`If-None-Match` 条件写。CAS 冲突返回 stale commit,不自动读取新状态并猜测 merge。 + +writer 打开 root 时必须探测/声明 conditional-write capability。不能可靠提供 CAS 的 S3-compatible +backend 只允许 create-new-root、只读,或使用另行批准的外部 fencing/transaction service;不能因 +“通常只有一个 writer”而降级成无条件 last-write-wins。 + +### 10.3 Snapshot manifest + +manifest 至少记录: + +```text +format/version +snapshot_id / parent_snapshot_id +created_at / writer_id +source lineage: source URI/id, fact_version, fact_rows, projector, recipe hash +Vortex file edition and required custom registry IDs +layout profile and thresholds +inventory/directory shard refs + digests +blob directory/pack refs +row/trajectory/step/tool/blob counts +logical/stored byte totals +``` + +小 snapshot 可以在 manifest 内联 file inventory;超过固定数量后必须写 inventory Vortex shards, +避免一个 JSON manifest 随文件数无限增长。 + +### 10.4 Trajectory directory + +trajectory directory 是按 `TrajectoryKey` 排序的窄 Vortex relation: + +| 字段 | 作用 | +|---|---| +| key hash + identity components | 精确定位并校验 hash 冲突 | +| data file id | 目标 immutable file | +| cluster id / row ordinal | 文件内定位 | +| revision sequence | overlay 解析 | +| deleted | tombstone | +| byte/row estimates | scheduler 与代价判断 | +| summary stats | 不打开 data file 的初筛 | + +directory 使用有界的 immutable LSM runs,而不是每次 sync 重写全量目录: + +```text +L0: 本次/近期 sync 的小 sorted delta runs(含 tombstone) +L1+: compaction 生成的按 key range 分片 base runs +``` + +manifest 按新到旧记录 runs,并保存每个 shard 的 sparse fence keys。point lookup 从最新 L0 开始, +命中 key/tombstone 即停止,再查询对应 base range;full scan 做有界 merge。L0 run 数达到阈值后先合并 +成新的 immutable base shards,再发布 manifest。content directory 使用相同原则,因此新增 blob 不会 +重写全局 hash 目录。 + +### 10.5 Directory 不放文件头 + +标准 Vortex 文件的 layout/footer 位于文件尾,并定位数据 segments。已发布文件不可变,因此无需 +“每次新 trajectory 都重写头部 directory”。writer 在本地或 multipart staging 中完成整文件,seal +一次 footer 后上传/完成 multipart,最后才由 manifest 引用。 + +如果 footer 或 upload 没完成,该对象没有进入 manifest;reader 仍从旧 `CURRENT` 找到完整旧 +snapshot。baseline 不在同一 `.vortex` 对象中维护 footer chain,也不依赖头部指向最新 footer。 + +这一选择牺牲“一个对象永久 append”,换取标准格式、S3 可移植性、简单恢复和确定的 checksum。 + +### 10.6 可选本地流式 spool:双槽 footer pointer + +如果未来 direct capture 需要“写入过程中即可恢复”,可以定义 pChronicle 私有的本地 +`.pvtxlog` spool envelope,而不是修改标准 `.vortex` 文件: + +```text +superblock +├── slot A: generation, footer_offset, footer_length, checksum +└── slot B: generation, footer_offset, footer_length, checksum +append-only data/segment/footer chain +``` + +提交一次 checkpoint 的顺序是: + +1. append 完整 data segment 和新 footer,footer 反向引用上一有效 footer; +2. fsync data/footer; +3. pwrite generation 较旧的 superblock slot; +4. fsync superblock; +5. reader 选择 checksum 正确且 generation 最大的 slot,新 slot 损坏则回退旧 slot。 + +这正适合本地可随机写文件,但它不是标准 Vortex file,不能要求普通 Vortex reader 直接打开。 +spool 达到滚动条件后应 seal/转换为标准 immutable `.vortex` 并上传。S3 Standard 不能 pwrite header; +S3 Express 的末尾 append 也不能更新这个头部槽,因此对象存储仍使用独立小 `CURRENT`/manifest, +不以 `.pvtxlog` 作为 baseline durable format。 + +## 11. 写入、同步与发布 + +### 11.1 全量构建 + +```text +1. 固定输入 Source/fact snapshot +2. 读取并验证 canonical events 或交换文档 +3. 规范化为 Storyline/TrajectoryBundle +4. 拓扑扁平化 subagent,生成内部 ordinals +5. typed core 提取、内容分层、cluster packing +6. 写并 seal blob packs / blob directory +7. 写并 seal data files +8. 写 trajectory directory / inventory +9. 校验所有 digest、引用、计数和 roundtrip sample +10. 写 immutable manifest +11. CAS 发布 CURRENT +``` + +在第 11 步之前,任何 reader 都看不到新 snapshot。 + +### 11.2 增量 projection sync + +从 canonical append suffix 计算受影响 trajectory/session。对受影响项: + +- 重新投影完整 trajectory,而不是尝试原地 patch 一个 nested step; +- 写入新的 L0 data file/cluster; +- 写一个小的 sorted L0 directory run,使新 revision 指向新 row; +- 删除使用 tombstone; +- 新 manifest 保留未受影响 file 和 base directory runs,并把 L0 run 加到最前; +- 旧 row 在 retained snapshot 中仍可读,直到 compaction/retention 允许回收。 + +这是 projection replace 语义,不是 canonical event dedup,也不改变 producer append 顺序。 + +### 11.3 流式与滚动 + +projector 可以持续消费事实水位,但输出必须按滚动文件发布: + +- 内存/本地 spool 累计到 file/时间阈值; +- seal 完整 Vortex footer; +- 上传 immutable object; +- 批量更新 directory 和 snapshot; +- 不为每个 event/trajectory CAS `CURRENT`; +- shutdown 时可以 seal 小尾文件,后续 compaction 合并。 + +Gateway 若未来 direct capture,也应写本地/WAL 或独立事件 segment,再异步形成 Vortex file;不能 +把一个尚未完成的 S3 Vortex 对象当作唯一 durable state。 + +### 11.4 并发 writer + +第一阶段每个 Dataset root 只支持一个 projection committer。多个 compressor/uploader 可以并行, +但最终 manifest builder 串行并以 `CURRENT` CAS fencing。stale writer 产生的 immutable objects 是 +orphan,不能自动把它们 merge 到新 snapshot。 + +未来多 writer 需要单独定义 partition ownership 或 transaction coordinator,不由 Vortex 文件格式 +本身提供。 + +### 11.5 内存、背压与超大 trajectory + +writer 以有界 cluster builders 接收 trajectory stream: + +- 在加入下一 trajectory 前根据各 lane logical bytes 估算是否 flush; +- compression/upload channel 都有 batch、in-flight bytes 和并发上限; +- hot/cold/external 选择在保留完整 payload 副本之前完成; +- JSON/ATIF 输入使用有界 record reader,不能先把整个 corpus 构造成 `Vec`; +- 临时压缩、排序 directory 和 pack 可使用显式 scratch directory,并纳入磁盘 quota; +- 一个 trajectory 自身超过内存预算时,大 payload 先 spill/offload,typed child lanes使用分段 builder; +- 如果选定 Vortex API 无法在不越过预算的情况下构造该 nested row,writer 返回可诊断的 + `TrajectoryTooLarge`,不能依赖 OOM 或无界 swap。 + +任何 scratch 文件都属于未发布 staging;崩溃恢复只清理它们,不把部分 array 推断为已提交数据。 + +## 12. Update、Compaction 与 Retention + +### 12.1 为什么需要 Dataset 层 + +Vortex 是 array/file/layout 格式,不是完整 table format。以下能力由 pChronicle Dataset 层提供: + +- snapshot manifest; +- replace/tombstone overlay; +- active row directory; +- compaction; +- retention/vacuum; +- projection lineage; +- writer CAS。 + +不能把“Vortex 文件可读”误认为“已经获得 Lance 的 MVCC、merge 和 index 语义”。 + +### 12.2 Active row resolution + +directory 对一个 `TrajectoryKey` 只暴露 snapshot 中 revision sequence 最大的非 tombstone row。 +point read 直接命中它。分析扫描由 `AtifSource` 把 active row selections 下推到 data file;旧 file +中仍活跃的其他 trajectory 继续可读,shadowed rows 被 selection 排除。 + +directory LSM 的新旧顺序只用于解析同一 key,不改变事实顺序。reader 对 runs 数、总 directory +bytes 和 merge memory 设置硬上限;超过上限的 snapshot 标记 maintenance required,而不是无界打开。 + +随着 replace 增加,active row 可能在旧文件中越来越稀疏,range 数和 selection bitmap 成本上升, +因此 overlay 必须有界。 + +### 12.3 Compaction 触发建议 + +以下初始阈值只作为运维默认值: + +- L0 data file 超过 32 个; +- trajectory/content directory L0 runs 超过 8 个; +- file active-density 低于 70%; +- shadowed/tombstoned trajectory 超过 active 的 10%; +- 平均 file 小于目标尺寸的 25%; +- point read 平均 range/GET 或 scan amplification 超过预算; +- blob pack 的不可达字节超过 20%。 + +compaction 从固定 snapshot 读取 active rows,重写较大的 L1 files/directory,先发布新 manifest, +再按 retention 回收旧对象。compaction 不改变 fact watermark、Storyline 语义或 revision lineage。 + +### 12.4 Retention 与 Vacuum + +保留策略至少包含: + +- 最近 N 个 snapshot; +- 最短时间窗口; +- 被打开 reader lease/pin 引用的 snapshot; +- 审计或 revision lineage 显式 pin 的 snapshot; +- orphan grace period。 + +vacuum 必须从所有 retained manifest 做可达性分析。仅依据最新 `CURRENT` 删除文件会破坏固定旧 +snapshot 的 reader。 + +## 13. 查询设计 + +### 13.1 公共关系不改变 + +Vortex Source 对外注册与当前 Storyline 相同的: + +```text +runs +steps +tool_calls +``` + +后续可以增加只读 `trajectories` 和 `observation_results` relation;前者提供 trajectory-level +nested/summary 访问,后者表达 ATIF 中未关联 tool call 的 system/non-tool results。新增 relation +需要独立 query-model 变更,不属于三表兼容承诺。现有列名、null 语义和已关联 tool result 必须与 +当前 Storyline schema 差分一致。公共 query 不暴露 offsets、ordinal、file locator 或 blob descriptor。 + +### 13.2 专用 `AtifSource` + +不能只把 nested Vortex file 注册给通用 DataFusion reader。`AtifSource` 负责把逻辑 SQL 映射到 +物理 lanes: + +```text +DataFusion projection / filters / limit + │ + ▼ +AtifSource planning + ├── source/trajectory directory pruning + ├── trajectory summary pruning + ├── cluster/zone pruning + ├── exact child-lane projection + ├── active-row selection + └── late content hydration + │ + ▼ +virtual runs / steps / tool_calls Arrow batches +``` + +父 identity 在输出 step/tool relation 时以 dictionary/constant array 生成,不从磁盘重复读取 M/K 次。 + +### 13.3 Predicate 下推等级 + +| Predicate | 下推位置 | 精确性 | +|---|---|---| +| `_file_` / source | Catalog | exact | +| trajectory/run/session key | directory | exact,仍校验原 key | +| time range | trajectory summary + step zones | summary conservative,DataFusion 复核 | +| source/model | summary mask/dictionary + child lane | conservative/exact | +| function name | tool bloom/dictionary + child lane | bloom conservative | +| copied context | bitmap | exact | +| typed token/cost/reward | metrics lane | exact 或 zone conservative | +| message/result JSON/content | hydrate 后 | 默认不下推 | + +OR、函数、复杂 nested path 和用户 UDF 不能证明安全时,保留给 DataFusion;不能为追求 pruning 改变 +SQL 结果。 + +### 13.4 Point trajectory read + +```text +CURRENT small object + → manifest + → directory fence + one shard/zone + → one data file tail/postscript/footer + → one cluster's selected lanes + → optional cold/external content +``` + +这是 cold-open 路径。`VortexTrajectorySnapshot::open` 固定并缓存 manifest、directory fences 和 file +footer;同一 snapshot 的后续 point read 不重复读取 `CURRENT`。refresh 构造新 snapshot 后再切换 +consumer,不能在一次查询中观察两个 generation。 + +session-only lookup 若在一个 run/source 内不唯一,API 必须要求复合 key 或返回多个候选,不能任意 +选择第一条。 + +### 13.5 训练读取 + +SFT/RL reader 不必构造三张虚拟关系再 join。它直接按 trajectory/step 顺序读取: + +- 先读 copied-context、source、`llm_call_count` 和 metrics presence; +- 过滤 `is_copied_context = true` 和 deterministic dispatch; +- 再读取命中 step 的 message、completion tokens、logprobs、reward; +- 保持 tokenizer/model metadata 和 offsets; +- 按 cluster 产生有界 batch 与背压。 + +这条路径是 Vortex 相对通用三表最重要的潜在收益之一。 + +### 13.6 Content hydration + +- 未投影内容列:不读取 hot/cold payload 或 blob pack; +- hot/cold 内容谓词:先读取完整值,再由 DataFusion 求值; +- external refs:按 pack 合并 content ids,批量读取 zone/page; +- `Preview`:只返回显式 preview relation/API,不冒充 Full; +- `LIMIT` 只有在语义安全的 filter/ordering 之后才能减少 hydration; +- checksum/长度验证失败使查询失败并标记 source unhealthy。 + +## 14. 索引与统计 + +### 14.1 Vortex 原生统计 + +使用 file/cluster/zone 的 min、max、null count、sort order 等统计完成粗粒度 pruning。默认 Vortex +布局和压缩态 compute 是基础,但不等价于 Lance BTree/Bitmap scalar index。 + +### 14.2 pChronicle summary lanes + +每个 trajectory 保存小而稳定的 summary: + +```text +step_count / tool_call_count +min_timestamp / max_timestamp +source_presence_mask +model dictionary ids or small bloom +tool-name bloom +copied_step_count +prompt/completion token totals +has_reward / has_logprobs / has_external_content +estimated logical/payload bytes +``` + +summary 是可重建的物理冗余。writer/projector recipe 变化时必须更新 lineage/version,不能让旧 summary +静默解释新字段。 + +data-file 内的 summary 可以引用 file-local dictionary id;复制到跨文件 directory 的 model/tool +summary 必须使用稳定 value/hash/bloom,不能把局部 dictionary code 当作全局身份。 + +### 14.3 Exact ID 与高选择性查询 + +- `TrajectoryKey`:sorted directory + fence index; +- `tool_call_id`:第一阶段没有全局 exact secondary index;先按 trajectory 或 summary 裁剪; +- 若生产负载确实需要跨 Dataset 的 tool-call point lookup,再增加独立 sorted secondary-index + Vortex relation; +- 不为每个可能字段预建索引;每个索引都增加写入、manifest、compaction 和空间成本。 + +这意味着在“已知 tool_call_id、未知 trajectory”的高选择性点查上,当前 Lance BTree 可能更优。 + +## 15. 故障恢复与完整性 + +| 故障 | 可见结果 | 恢复/处理 | +|---|---|---| +| data/blob upload 中断 | 新对象不可见 | 清理 multipart/staging;旧 CURRENT 可读 | +| Vortex footer 未写完 | 文件不进入 manifest | 删除 `.partial`/orphan;不做猜测性发布 | +| directory 写入失败 | 新 data 为 orphan | 重建 directory 或 vacuum | +| manifest 写入失败 | 新 generation 不可见 | 旧 CURRENT 可读 | +| CURRENT CAS 冲突 | stale commit 失败 | 从最新 snapshot 重新规划;不自动 merge | +| CURRENT 丢失/损坏 | source unavailable | 通过显式 repair 选择并校验 manifest,不自动选“最新文件名” | +| data footer/checksum 损坏 | 命中查询失败 | 标记 source unhealthy;从 canonical facts 重建 | +| external blob 缺失 | Full 查询失败 | Preview 可明确降级;verify 报悬空引用 | +| 未注册 encoding/layout | open 失败 | 安装匹配 reader 或从 facts 重建;禁止静默误读 | +| compaction 中断 | 未发布新对象为 orphan | 旧 snapshot 不受影响 | + +`verify` 至少检查: + +- `CURRENT → manifest → inventory/directory → data/blob` 全链路可达; +- 所有 digest、文件 footer 和 Vortex edition; +- directory key 唯一性、active revision 和 row bounds; +- offsets 单调并与 child array 长度一致; +- tool/result correlation、token/logprob 长度关系; +- content hash、raw length、stored length 和 codec; +- manifest counts 与实际抽样/全量模式一致; +- projection lineage 对应的 canonical fact watermark。 + +## 16. 安全与资源边界 + +### 16.1 不可信输入 + +reader/writer 必须限制: + +- schema、layout 和 nesting depth; +- trajectory、step、tool、result、token 和 blob 的最大数量/字节; +- JSON record/extra 大小; +- 解压后大小与压缩比; +- directory shard、footer、metadata 和 split 数; +- 并发 range、in-flight bytes、hydrate bytes 和输出 batch; +- recursive subagent 深度与总节点数。 + +### 16.2 External reference confinement + +manifest、directory 和 ContentValue 只保存相对 root 的 file/pack ID。数据文件不能提供任意 URI、 +绝对路径或凭据。reader 规范化后必须验证目标仍在 Dataset root/prefix 下,防止路径穿越和 SSRF。 + +### 16.3 Encryption + +第一阶段依赖 filesystem permissions、TLS 和 object-store SSE/KMS。不能把 Vortex 文档中的细粒度 +encryption 方向当作已经交付的 pChronicle 字段级加密。若有字段级需求,应另行定义 key envelope、 +rotation、cache 和 pruning 的语义。 + +## 17. Rust crate 与 API 边界 + +### 17.1 实验 crate + +建议新增: + +```text +crates/persisting-pchronicle-vortex/ +├── src/model.rs # TrajectoryBundle DType/mapping +├── src/writer.rs # cluster/file writer +├── src/reader.rs # point/stream reader +├── src/directory.rs # key/content directories +├── src/manifest.rs # snapshot/CAS protocol +├── src/content.rs # tiers/blob packs +├── src/datafusion.rs # optional AtifSource +└── benches/ +``` + +它依赖: + +```toml +persisting-pchronicle = { workspace = true, default-features = false } +``` + +而不是让 `persisting-pchronicle` 核心反向依赖 Vortex。实验 crate 可以是 workspace member,但不得 +加入 `default-members`。 + +### 17.2 Feature 建议 + +```toml +[features] +default = [] +file = ["dep:vortex"] +object-store = ["file", "vortex/object_store"] +datafusion = ["file", "dep:datafusion"] +experimental-layout = ["file"] +``` + +实际 feature 名随选定 Vortex release 校正。原则是 local file、object store、DataFusion 和私有 +layout 不应被一个 feature 无条件全部打开。 + +### 17.3 API 草案 + +```rust +let input = FixedProjectionInput::from_events(source_snapshot); +let report = VortexProjectionBuilder::new(output_uri) + .with_layout_profile(LayoutProfile::Balanced) + .build(input) + .await?; + +let snapshot = VortexTrajectorySnapshot::open(output_uri).await?; +let trajectory = snapshot + .get_trajectory(&trajectory_key, ContentMode::Full) + .await?; + +let source = VortexAtifSource::from_snapshot(snapshot)?; +source.register(&datafusion_context, "dataset")?; +``` + +不建议第一步定义一个包含 `append/update/index/merge/transaction` 全能力的通用 `StorageBackend` +trait。Lance 与 Vortex projection 的能力不同,强行统一会产生最小公分母或隐藏昂贵 fallback。 + +若后续需要共享上层调用,应按 capability 拆分: + +```text +TrajectoryPointRead +TrajectoryScan +ProjectionBuild +ProjectionSync +SnapshotVerify +SnapshotMaintain +ContentResolve +``` + +### 17.4 与现有 Catalog/QueryEngine 的接入顺序 + +当前 `store::catalog`、`ChronicleQueryEngine`、`StorylineDataSource` 等模块整体位于 +`lance-store` feature 下,而且公开 enum/API 含有具体 Lance 名称。Phase 1/2 不修改这些入口:实验 +crate 自己创建 `SessionContext` 并注册 `VortexAtifSource`。 + +只有 shadow benchmark 证明值得进入 Catalog 后,才提取最小 backend-neutral 读取边界: + +```text +DiscoveredSource metadata +PinnedSourceRevision +NormalizedTableProvider factory +TrajectoryPointRead capability +Source health/metrics +``` + +Lance 的 merge、MVCC、maintenance、scalar index 和 Vortex 的 overlay、directory、compaction 不进入 +共同 trait。`ChronicleQueryBackend` 可增加 `Vortex { snapshot_id }` 作为诊断信息,但不得让业务代码 +通过 enum 分支重新实现 provider 行为。 + +## 18. 依赖、构建时间与二进制体积 + +### 18.1 当前基线 + +在本 RFC 编写时,当前 workspace 的 `cargo tree` 唯一传递 package 数约为: + +| pChronicle feature | Package 数 | +|---|---:| +| `--no-default-features` | 146 | +| `lance-store` | 520 | +| `lance-store,s3-store` | 629 | + +这是依赖图指标,不等于 clean build 秒数。它说明 Lance/DataFusion/cloud 已经是重依赖,不能再把 +第二个完整引擎无条件链接进所有二进制。 + +### 18.2 有利条件 + +当前 Persisting 使用 Arrow 58.3、DataFusion 54.1 和 `object_store` 0.13.2;Vortex 当前开发线也 +使用 Arrow 58.3、DataFusion 54 和 `object_store` 0.13.2。选择兼容 release 时,Cargo 可以复用 +最重的基础依赖,而不是编译第二套 Arrow/DataFusion。 + +### 18.3 风险与控制 + +| 风险 | 控制 | +|---|---| +| Vortex 带来数十个 core/encoding crate | 独立 crate、非默认 feature、只开需要的 codec | +| Arrow/DataFusion 版本分叉 | 固定 compatible release;CI 检查 `cargo tree -d` | +| 同一二进制静态链接 Lance+Vortex | 实验 CLI/bench 独立;生产 consumer 不默认启用 | +| Vortex Rust API 变化 | pin crates.io release;适配层只在实验 crate;不跟 develop/git | +| Vortex release 抬高 MSRV | Phase 0 对照项目 toolchain/CI;不得为 lab 静默抬高默认 MSRV | +| custom layout 扩大兼容面 | Phase 1 禁用;required registry ID 写 manifest | +| workspace-wide CI 变慢 | 独立 job/cache;日常使用 targeted package commands | +| test matrix 成倍增长 | core semantic tests共享 fixture;后端专项测试独立运行 | + +验收要求:默认 `cargo build`、orchestration layer、pVisor、Gateway 和 pChronicle CLI 的依赖图中不出现任何 +`vortex-*` package;只有显式构建实验 crate 时才增加编译成本。 + +### 18.4 独立 helper 与同进程链接的权衡 + +实验阶段优先生成独立 `pchronicle-vortex` helper/bench binary,不把 Lance 与 Vortex 同时静态链接 +进默认 `pchronicle`: + +| 方式 | 优点 | 代价 | +|---|---|---| +| 独立 Rust helper | 默认构建和二进制隔离;崩溃边界清楚 | 需要单独分发;进程/IPC 边界 | +| 同进程可选 feature | 类型和 DataFusion 集成直接;延迟最低 | 启用时产生 fat binary 和更大 link/test 成本 | +| 动态 library/plugin | 主程序不静态携带 codec | Rust ABI/plugin 版本复杂,custom registry rollout 更难 | +| 外部 Python/`vx` 工具 | 最快验证标准文件 | 难复用 pChronicle Rust 类型和定制 reader,不适合 production | + +Phase 0/1 可以同时用 Rust helper 和官方工具交叉检查文件,但正式 reader/writer 不能依赖 shelling +out 到未固定版本的外部 CLI。 + +## 19. 兼容性与版本策略 + +### 19.1 Vortex file 与 library API + +Vortex 文档声明从 file format 0.36.0 起提供向后读取兼容;这不意味着 Rust library API 或自定义 +plugin API 已经 1.0 稳定。pChronicle manifest 因此同时记录: + +- Vortex file format edition; +- pChronicle bundle schema version; +- layout profile version; +- required custom array/layout IDs; +- minimum pChronicle reader version; +- projector recipe hash。 + +### 19.2 自定义 ID + +建议命名: + +```text +dev.persisting.atif_bundle.v1 +dev.persisting.trajectory_cluster.v1 +dev.persisting.prompt_prefix.v1 +dev.persisting.external_content.v1 +``` + +reader 遇到未知 major ID 必须失败。minor 演进只有在旧 reader 能正确忽略/解释时才兼容;否则创建 +新 ID。不能复用同一 ID 改变 offsets、null 或校验语义。 + +### 19.3 可重建性是兼容保险 + +在 Vortex projection 尚未稳定前,canonical facts 和 projection lineage 是升级路径。breaking +layout/encoding 通过新 generation 重建,不原地猜测旧字节。只有当 Vortex 被另行批准为 canonical +后端时,才必须提供独立的长期迁移工具和更强兼容承诺。 + +## 20. 可观测性与运维接口 + +### 20.1 写入指标 + +- input trajectories/steps/tools/tokens/logical bytes; +- 每 lane chosen encoding、ratio、encode CPU; +- hot/cold/external bytes 和 dedup hit rate; +- cluster/file/pack sizes 与尾文件比例; +- upload bytes、requests、multipart retries; +- manifest/CURRENT CAS latency 和 conflict; +- projection lag、source fact watermark。 + +### 20.2 查询指标 + +- footer、manifest、directory cache hit; +- files/clusters/zones considered/pruned; +- range/GET count、requested/useful bytes、coalesced bytes; +- lanes projected、compressed bytes decoded; +- external hydrate ids/packs/bytes; +- active-row selection density; +- time-to-first-batch、rows/s、P50/P95/P99; +- full trajectory reconstruction latency。 + +### 20.3 维护指标 + +- L0 count、active density、shadow/tombstone ratio; +- scan amplification 和 point-read range amplification; +- orphan/unreachable bytes; +- retained snapshot count/age; +- compaction input/output bytes、write amplification、duration; +- verify coverage 和最近成功水位。 + +建议的独立命令面: + +```text +pchronicle-vortex build +pchronicle-vortex sync +pchronicle-vortex inspect +pchronicle-vortex verify +pchronicle-vortex compact +pchronicle-vortex vacuum +pchronicle-vortex benchmark +``` + +在提案阶段不把这些命令加入默认 `pchronicle` CLI。 + +## 21. 正确性测试 + +### 21.1 Golden fixture + +至少覆盖: + +- 空 message、null 和 absent 的区别; +- system/user/agent step; +- 多 tool calls、多个 results、无 `source_call_id` 的 system observation; +- multimodal content 和外部附件; +- typed metrics、token ids、logprobs、reward、provider extra; +- `llm_call_count = 0/1/>1/null`; +- `is_copied_context = true/false/null`; +- root/subagent、共享 session、独立 trajectory id、continuation; +- hot/cold/external content; +- 未知 `extra` 和未来字段 escape; +- 超大单 trajectory 和跨多个 page 的 token/result。 + +### 21.2 差分测试 + +测试分成两组,避免把当前 Lance/Storyline 无法表达的 ATIF 值错误归类为 Vortex 差分失败。 + +对三表共同 contract corpus: + +1. 分别构建 Lance 与 Vortex projection; +2. 对 `runs/steps/tool_calls` 执行同一 SQL; +3. 规范化 Arrow batch 顺序后逐值比较; +4. 完整重建 Storyline/ATIF 后比较语义 JSON; +5. Full/Preview/content predicate 分别校验; +6. copied-context/SFT reader 与规范过滤结果比较。 + +对 ATIF fidelity corpus(共享 session 的兄弟 subagent、无 `source_call_id` result、inline tool result、 +multimodal attachment),Vortex full reader 与原 ATIF 做语义 roundtrip;当前 Lance/Storyline 路径若 +按既有 contract 拒绝输入,应明确记录为已知 capability difference,不能通过删字段使差分“通过”。 + +### 21.3 Fault injection + +在 blob、data、directory、manifest、CURRENT 的每个发布边界注入失败;验证旧 snapshot 始终可读, +新 snapshot 要么完整可见、要么完全不可见。并覆盖 CAS 冲突、缺失 pack、坏 digest、坏 footer、 +unknown plugin、offset overflow 和解压炸弹。 + +## 22. Benchmark 与验收门槛 + +### 22.1 数据集组合 + +不能只用一种合成 JSON。benchmark 至少包含: + +| Corpus | 特征 | +|---|---| +| chat-heavy | 短消息多、tool 少、低 token 密度 | +| tool-heavy | arguments/result 大、唯一文本多 | +| dedup-heavy | 重复 system prompt、代码、日志片段 | +| token/RL-heavy | prompt/completion ids、logprobs、reward | +| multi-agent | 深/宽 subagent 拓扑、共享 run/session | +| pathological | 单超大 trajectory、超大 blob、极端 null/高基数字符串 | + +真实数据必须先脱敏,并记录字段分布、压缩前 bytes 和重复率。 + +### 22.2 比较口径 + +- Lance 先执行等价 maintain/compact/index refresh/vacuum; +- 比较 current reachable data + index + directory + blob,不把任一方旧 retained snapshot 偏置计入; +- 另报 operational footprint,包括历史 snapshot、orphan 和 compaction debt; +- cold/warm cache 分开; +- local NVMe 与 S3 分开; +- 报 GET/range/bytes,不只报 wall time; +- 报 median/P95/P99、CPU、peak RSS、encode time、write amplification; +- 使用相同 DataFusion/Arrow 版本和等价投影/谓词。 + +### 22.3 查询矩阵 + +1. exact trajectory key point read; +2. session/run 候选查找; +3. 完整 trajectory reconstruction; +4. 只读 step source/time/model; +5. tool function group/filter; +6. 内容列不投影与投影对照; +7. content predicate; +8. Full 与 Preview; +9. SFT copied-context filter + message; +10. RL token/logprob sequential scan; +11. incremental sync; +12. compaction 与 vacuum。 + +### 22.4 Go/No-Go + +正式 projection 必须同时满足: + +- 所有差分与故障测试通过; +- 默认构建依赖图和产物不含 Vortex; +- S3 不出现 per-trajectory/per-blob 小对象退化; +- point trajectory P95 不劣于压实 Lance 20% 以上; +- narrow analytical scan 至少一个核心生产查询提升 2 倍; +- 以下三项至少再满足一项: + - 典型 corpus current reachable bytes 不超过 Lance 的 80%; + - S3 完整 trajectory P95 提升至少 1.5 倍或 GET 减少至少 50%; + - token/RL 读取吞吐提升至少 3 倍; + - projection build/ingest 吞吐提升至少 2 倍; +- compaction 后 scan amplification、active density 和恢复时间在运维预算内。 + +若收益只出现在合成 benchmark,或需要默认启用不稳定 custom layout 才达到门槛,则保持实验状态。 + +## 23. 性能与压缩预期:假设而非承诺 + +基于当前 schema、Vortex 编码能力和公开通用 benchmark,可以提出待验证假设: + +| 负载 | Vortex/Lance 空间假设 | 主要变量 | 信心 | +|---|---:|---|---| +| 普通 chat/tool trajectory | 0.70–0.90 | ID 去重、typed core、文本占比 | 中低 | +| 大量唯一大 payload | 0.85–1.10 | 双方 Zstd、外部 CAS/pack | 低 | +| 重复 tool result/prompt | 0.60–0.90 | 全局 content dedup 命中率 | 低 | +| token/RL-heavy | 0.35–0.65 | typed arrays、prefix 重复率 | 中低 | + +| 查询 | 相对假设 | 主要限制 | +|---|---|---| +| exact indexed point lookup | 持平到小幅改善/退化 | directory cache;Lance BTree 很强 | +| 完整 trajectory | 1.5–3 倍潜力 | cluster locality、content bytes | +| 本地窄列扫描 | 2–5 倍潜力 | child projection、压缩态 kernel | +| S3 窄列扫描 | 1.1–2 倍潜力 | 网络与 GET 主导;通用公开结果并不保证大幅领先 | +| SFT/RL | 2–6 倍潜力 | typed token lane、copied-context early filter | +| 随机修改单 trajectory | Lance 更有利 | Vortex 需要 overlay/compaction | + +这些范围不能写进产品 SLA,也不能作为跳过本项目 benchmark 的理由。Vortex 官方 benchmark 是 +方向性证据,不是 pChronicle 轨迹负载的替代测量。 + +## 24. 方案权衡 + +### 24.1 选择的方案:Vortex 可重建 projection + +**优点**: + +- 风险与 canonical capture 隔离; +- 可以充分定制 ATIF-aware DType/Layout; +- 可用真实数据与 Lance 做同语义差分; +- 失败时从 facts 重建; +- 不要求立即实现 Vortex 上的完整 OLTP/MVCC。 + +**缺点**: + +- 同一事实可能同时存在 Lance 与 Vortex projection,占用额外空间; +- 需要 projector、lineage、lag 和维护; +- 生产系统短期存在两种读取实现; +- 只有通过 benchmark 后才产生实际用户价值。 + +### 24.2 直接替换 Storyline Lance + +**优点**:少一套正式 projection,长期架构更单一。 + +**缺点**:在 point index、replace、MVCC、content GC、S3 commit 和 DataFusion nested pushdown 未被 +证明前风险过高;回滚和数据迁移复杂。当前不选。 + +### 24.3 把当前三张窄表原样写成三个 Vortex 文件 + +**优点**:实现简单,公共 SQL 几乎不变。 + +**缺点**:保留三次 open/join、ID 重复和跨表 snapshot;没有利用 ATIF 局部性,收益主要只来自 +codec。它适合作为 benchmark baseline,不作为目标设计。 + +### 24.4 一个 trajectory 一个 Vortex 文件 + +**优点**:点读直观、单条替换简单、文件语义清楚。 + +**缺点**:S3 object/listing/GET 和 footer 小文件碎片严重,训练/扫描调度成本高。当前不选。 + +### 24.5 一个永久增长的 Vortex 单文件 + +**优点**:object 数最少,顺序 append 理论简单。 + +**缺点**:标准 S3 不能随机更新头/footer;S3 Express append 有范围和 part 限制;故障恢复、并发、 +目录增长、vacuum 和长期 compaction 都复杂;已发布 reader 与 writer 相互牵制。当前不选。 + +### 24.6 只保留 Lance + +**优点**:依赖、运维和语义最简单;已有 MVCC、index、blob、DataFusion 和维护路径。 + +**缺点**:不验证 trajectory-aware layout、typed training lanes 和更少 S3 I/O 的潜力。如果真实负载 +主要是随机更新/高选择性点查且没有大规模训练扫描,这仍可能是最终正确选择。 + +### 24.7 Parquet + +**优点**:生态成熟、工具广、长期兼容清晰。 + +**缺点**:对自定义压缩态 kernel、trajectory-specific layout 和 plugin encoding 的扩展空间较小; +同样需要 Dataset manifest、blob、index 和 update 语义。应加入 benchmark,但不是本提案目标。 + +## 25. 分阶段实施 + +### Phase 0:依赖与可行性探针 + +- 独立 crate,Vortex 非默认依赖; +- 锁定与 Arrow 58.3/DataFusion 54/object_store 0.13.2 兼容的 crates.io release; +- 记录 clean build、增量 build、package graph、二进制和 target 增量; +- 写最小 nested `TrajectoryBundle`,用 `vx`/Rust reader 检查 layout tree; +- 不修改 Gateway、orchestration layer、pVisor 或默认 CLI。 + +### Phase 1:标准 Vortex 单文件 codec prototype + +- Storyline/ATIF → nested offsets/lane arrays; +- balanced built-in layout strategy; +- 本地 file writer/reader; +- 完整 roundtrip、point trajectory 和顺序训练 reader; +- 无 external blob、无 DataFusion、无 custom layout; +- 与“三表 Vortex baseline”和压实 Lance 比较。 + +### Phase 2:虚拟关系与 typed training lanes + +- `AtifSource` 注册 `runs/steps/tool_calls`; +- projection/predicate/limit 下推; +- typed metrics/token/logprob; +- summary lanes 和 point directory prototype; +- Lance/Vortex SQL 差分测试。 + +### Phase 3:Dataset snapshot 与 object store + +- immutable manifest、directory、inventory、CAS `CURRENT`; +- S3 range/coalescing/cache; +- hot/cold/external content 和 blob packs; +- verify、fault injection、orphan cleanup; +- 全量与增量 projector lineage。 + +### Phase 4:Shadow production + +- 从同一 canonical fact snapshot 异步构建; +- 用户流量仍读 Lance,Vortex 只 shadow query/benchmark; +- 采集压缩、延迟、GET、CPU、失败、projection lag 和维护数据; +- 不允许 projection 失败影响 capture。 + +### Phase 5:决策 + +根据 Go/No-Go: + +1. 未达标:删除/保留 lab,不增加产品后端; +2. 部分负载达标:作为训练/分析专用 projection; +3. 全面达标:进入正式 Catalog Source,仍不默认替换 facts; +4. 若要成为 canonical backend:新 RFC 定义 append、fencing、repair、长期兼容和迁移。 + +## 26. 开放问题 + +1. balanced cluster 的最佳 file/cluster/page 尺寸是多少,是否应按 payload/token 分布自适应? +2. Phase 1 的 built-in LayoutStrategy 能否充分表达 child-lane projection,何时必须 custom Layout? +3. `trajectory_id/session_id/run_id` 在当前 Storyline hub 与 ATIF v1.7 之间是否需要进一步补强? +4. content tier 应由静态阈值、采样重复率,还是 workload profile 决定? +5. blob directory 应在每个 Dataset 内,还是允许多个 Dataset 共享一个 CAS domain? +6. prompt-prefix encoding 的 checkpoint 和随机读取预算如何确定? +7. 跨 trajectory 的 system prompt/tool definition dictionary 是否值得其引用和 GC 复杂度? +8. tool-call exact secondary index 是否有真实生产需求,还是 trajectory key + summary 已足够? +9. active-row directory 的 LSM/overlay 层数上限和 compaction budget 是多少? +10. Vortex custom registry 的长期读兼容、edition 和 reader rollout 如何管理? +11. 是否需要独立的 portable export profile,只使用 Vortex core edition、禁用私有 encoding? +12. S3 Express append 是否值得作为可选 spool 优化,还是始终保持 immutable object? + +## 27. 决策记录 + +若本 RFC 被接受,它只批准: + +1. 创建隔离、非默认的 Vortex 实验 crate; +2. 以可重建 projection 身份实现和 benchmark 本文物理模型; +3. 在不影响 canonical capture 的条件下进行 shadow 验证; +4. 使用 immutable files + manifest + CAS `CURRENT`,不使用永久单文件 append; +5. 保持逻辑嵌套、物理窄 lane、大文件聚合和显式 content tiers。 + +它不批准默认依赖、生产切流、Lance 删除或 Vortex canonical ownership。那些动作必须由测量结果和 +后续决策单独批准。 + +## 28. 参考资料 + +- [pChronicle 轨迹存储设计](../pchronicle/design/trajectory-storage.md) +- [Storyline 三表 Lance 存储](../pchronicle/design/storyline-lance.md) +- [pChronicle 架构](../pchronicle/design/architecture.md) +- [Harbor ATIF v1.7 RFC](https://github.com/harbor-framework/harbor/blob/main/rfcs/0001-trajectory-format.md) +- [Vortex Arrays](https://docs.vortex.dev/concepts/arrays) +- [Vortex Layouts](https://docs.vortex.dev/concepts/layouts) +- [Vortex File Format concepts](https://docs.vortex.dev/concepts/file-format) +- [Vortex File Format specification](https://docs.vortex.dev/specs/file-format) +- [Vortex DataFusion integration](https://docs.vortex.dev/developer-guide/integrations/datafusion) +- [Extending Vortex](https://docs.vortex.dev/developer-guide/extending/) +- [Vortex benchmark dashboard](https://bench.vortex.dev/) +- [Amazon S3 PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) +- [S3 Express append](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-append.html) diff --git a/docs/src/zh/rfcs/0007-events-contract-pchronicle-sidecar.md b/docs/src/zh/rfcs/0007-events-contract-pchronicle-sidecar.md new file mode 100644 index 00000000..6e3b88ec --- /dev/null +++ b/docs/src/zh/rfcs/0007-events-contract-pchronicle-sidecar.md @@ -0,0 +1,167 @@ +# RFC-0007: 事件契约与 pChronicle Sidecar 边界 + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Date** | 2026-08-16 | +| **Components** | `persisting-events` · pVisor · orchestration layer · pChronicle · Gateway | +| **Amends** | [RFC-0002 Events](0002-events-format.md) · [RFC-0003 pChronicle ownership](0003-pchronicle-ownership.md) | +| **Related** | [端到端架构](../system-design/architecture.md) · orchestration architecture · [轨迹存储](../pchronicle/design/trajectory-storage.md) | + +## 摘要 + +Persisting 将运行时事件的逻辑契约从存储实现中拆出,由唯一新增 crate +`persisting-events` 拥有。pVisor、Gateway、orchestration layer 与 pChronicle 共享该契约,但只有 +pChronicle 拥有 Lance、DataFusion、对象存储、Catalog、查询与投影实现。 + +pVisor 需要持久轨迹或 Attempt registry 时启动 +`pchronicle serve --control 127.0.0.1:0 DATASET`,通过带版本和认证令牌的 control 协议提交事件并等待 durable +acknowledgement。pVisor 默认构建不再链接 Lance/DataFusion,也不直接打开或写入 +`events.lance`。 + +## 动机 + +此前 `EventRecord` 位于 pChronicle,pVisor 的默认持久化路径又以内嵌适配器链接 +pChronicle。这把“描述发生了什么”的稳定数据契约与“如何落盘、查询和投影”的实现绑在 +一起,导致单 Run 执行器携带不必要的存储依赖,也使 producer 难以在不依赖具体后端的 +情况下发布事件。 + +边界调整需要同时满足: + +1. producer 与 consumer 仍使用同一种事件类型,禁止复制同构 schema; +2. pVisor 不拥有存储格式,也不链接重型存储引擎; +3. pChronicle 仍是唯一的结构化轨迹持久化和读取层; +4. 不为少量进程协议再增加一个独立 client crate。 + +## 决策 + +### 1. `persisting-events` 拥有逻辑事件契约 + +`persisting-events` 是存储无关的公共契约包,拥有: + +- `EventIdentity`:`event_id`、`run_id`、`attempt_id`、Story/Turn identity、producer + 与观测时间; +- `EventRecord`:扁平 identity、`seq`、`source`、`kind`、关联字段与 JSON payload; +- 不涉及存储引擎的信封校验; +- 可选 `control` feature 下的 pChronicle control 消息、trait 与进程 client。 + +默认 feature 只提供事件数据模型。`control` feature 可以依赖 Agent control 类型和 Tokio, +但 MUST NOT 引入 Lance、Arrow、DataFusion、对象存储 SDK 或 pChronicle 实现。 + +`EventRecord` 是进程内和进程间共同使用的逻辑记录,不是物理存储 schema。事件所属的 +Run、Attempt 或 Session 与 producer 定义的 `seq` 一起形成排序上下文;wall-clock +timestamp 只用于关联和展示,不作为顺序真相。 + +### 2. pChronicle 拥有物理存储与持久解释 + +pChronicle 消费 `persisting-events::EventRecord`,并独占维护: + +- `EventRow`、Arrow schema 与逻辑记录到物理行的映射; +- Lance/Vortex 等物理后端、writer fencing、manifest、compaction 与 vacuum; +- Catalog、query、replay、格式转换、revision 和派生视图; +- `pchronicle serve` 内嵌的 Control 服务以及 append 成功的 durable acknowledgement。 + +RFC-0003 中“pChronicle 拥有轨迹格式”的约束仍适用于物理 schema、交换格式与转换。 +其中“pChronicle 唯一定义 `EventRecord`”以及“所有调用方直接依赖 pChronicle 类型”的部分 +由本 RFC 修订。 + +### 3. pVisor 通过 sidecar 持久化 + +pVisor 只暴露两个面向用户的落盘选择:格式和目标位置。 + +| 选择 | 行为 | +|---|---| +| `--record-format json` + 本地目录 | pVisor 直接追加完整 `events.jsonl`,不启动 pChronicle | +| `--record-format json` + warehouse URI | 启动 pChronicle,由 sidecar 将 JSON 事件写入 warehouse | +| `--record-format lance` | 启动 `pchronicle serve --control 127.0.0.1:0 `,通过 control 协议写 canonical Lance | + +旧的 `--chronicle-mode`、`--chronicle-dir` 和 `--pchronicle-binary` 不再是 pVisor +CLI 参数。pVisor 库/配置仍可通过 `chronicle.binary` 选择 sidecar executable;orchestration layer +自己的 `--pchronicle-binary` 不属于 pVisor CLI。pVisor 管理自己启动的 child 生命周期; +child 退出、握手失败或协议版本不兼容都会显式使持久化路径失败。 + +pVisor 与 Gateway producer 只构造 `EventRecord`。它们 MUST NOT 选择 Lance row、执行 +DataFusion query,或根据 storage URI 加载对象存储 SDK。 + +### 4. Control 协议随事件契约发布 + +不创建 `persisting-pchronicle-client`。control client、协议信封、Attempt/lease/commit +消息和内存测试实现位于 `persisting-events` 的可选 `control` feature 中。这些类型描述 +producer 到持久化服务的边界,本身不实现存储。 + +当前协议版本为 `2`,使用 loopback TCP 上的逐行 JSON frame。sidecar 在 stdout 发布 +一次 readiness 记录,包含 endpoint、协议版本和每进程随机认证令牌。每个请求携带版本、 +request ID 与令牌;client 校验响应版本和 request ID。frame 大小有明确上限。 + +这是本地子进程协议,不是面向不可信网络的远程公共 API。跨主机部署需要另行定义传输 +安全、身份和可用性契约。 + +### 5. ACK、背压与不确定性 + +pVisor 到 sidecar 的 append 队列是有界的。入队使用 `try_send`:队列已满或 worker 已 +关闭时,事件被明确拒绝,调用方可以复用该 `seq`。成功入队后调用方等待 sidecar 响应; +只有 pChronicle 完成 append 并返回成功时,事件才对 pVisor 视为 durable。 + +连接中断、写入错误或 ACK 丢失无法证明事件未提交,必须分类为 unknown。此时 producer +消耗该序号,不能把不确定写入伪装为“肯定未写”。事实层仍允许 at-least-once 与重复 +`event_id`;exactly-once 和热路径去重不属于该协议。 + +同一 control sidecar 也承载 Run lease、Attempt active/heartbeat/terminal 和 Run commit。 +这些控制记录的 fencing/CAS 语义保持不变。 + +## 依赖边界 + +```text +pVisor / Gateway / orchestration layer + │ + │ EventRecord + optional control protocol + ▼ + persisting-events + │ + │ versioned authenticated local IPC + ▼ + pchronicle serve process (Control enabled) + │ + ├── EventRow / Arrow + ├── Lance or another storage backend + └── Catalog / query / projection +``` + +默认 pVisor dependency graph MUST NOT 通过 Chronicle 写路径引入 Lance、Arrow、DataFusion +或云对象存储 SDK。其他 pVisor 组件若为了非存储的格式/投影 helper 暂时形成到 +pChronicle 的间接依赖,不改变本 RFC 的 ownership,但 SHOULD 在后续边界整理中消除; +不得借此让 pVisor 重新直接写存储。 + +## 兼容与迁移 + +- `EventRecord` 的 JSON 顶层字段保持扁平,移动 crate 不改变既有 wire 形状; +- pChronicle 对外 re-export 公共事件类型,允许调用方渐进迁移 import; +- pVisor 调用方应迁移到 `--record-format {json,lance}` 与 `--record-destination PATH|URI`;旧 Chronicle CLI 参数不再接受; +- `persisting-pchronicle-client` 被删除,使用者改为 + `persisting-events = { features = ["control"] }`; +- pChronicle 的既有 Lance dataset、目录布局和 replay 语义不因这次 crate 拆分而变化。 + +## 被否决的方案 + +| 方案 | 原因 | +|---|---| +| pVisor 继续内嵌 Lance adapter | 执行器与存储引擎生命周期、feature 和依赖重新耦合 | +| `EventRecord` 继续由 pChronicle 定义 | producer 为使用基础事件信封被迫依赖存储产品 | +| 单独保留 `persisting-pchronicle-client` | 协议包过碎;control 契约可以作为事件边界的可选 feature | +| pVisor 与 orchestration layer 各写一套 IPC client | 会产生协议漂移、重复认证与错误语义 | +| pVisor 写 JSONL,pChronicle 以后导入 | 缺少运行期 durable ACK、fencing 与统一 canonical append 语义 | + +## 验收条件 + +- Workspace 只新增 `persisting-events`,不存在 `persisting-pchronicle-client`; +- pVisor、Gateway、pChronicle 复用同一 `EventRecord`,没有同构公共事件 struct; +- pVisor 默认构建不直接依赖 pChronicle 存储 API,也不链接 Lance/DataFusion; +- `spawn` 模式能够启动 sidecar,持久写入有序事件并发布 Attempt 终态; +- 协议版本、认证、request correlation、frame limit、拒绝与 unknown 写入语义有测试; +- pChronicle 的原有 replay、query 与物理存储测试继续通过。 + +## Changelog + +| Version | Date | Notes | +|---|---|---| +| Accepted | 2026-08-16 | 拆出 `persisting-events`,移除 client crate,以 pChronicle sidecar 替代 pVisor 内嵌存储 | diff --git a/docs/src/zh/rfcs/0008-atif-format.md b/docs/src/zh/rfcs/0008-atif-format.md new file mode 100644 index 00000000..e0f22e04 --- /dev/null +++ b/docs/src/zh/rfcs/0008-atif-format.md @@ -0,0 +1,154 @@ +# RFC-0008: ATIF v1.7 轨迹格式 + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Format** | `atif` | +| **Date** | 2026-08-21 | +| **Component** | `persisting-pchronicle` | +| **Implements** | `crates/persisting-pchronicle/src/atif.rs` · `crates/persisting-pchronicle/src/convert/atif.rs` | +| **Upstream** | [Harbor RFC-0001: Agent Trajectory Interchange Format](https://github.com/harbor-framework/harbor/blob/main/rfcs/0001-trajectory-format.md) | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [RFC-0004 ACTF](0004-actf-format.md) · [RFC-0009 OpenAI Messages](0009-openai-messages-format.md) | + +## 摘要 + +ATIF 是 pChronicle 支持的外部 JSON 轨迹交换格式。pChronicle 以 `ATIF-v1.7` 作为规范 +输出版本,将每个 trajectory node 规范化为一份 Storyline;内嵌 +`subagent_trajectories` 递归展开为独立 Storyline,并通过 `parent` 与 `children` 外链。 +Storyline wire schema 由 [RFC-0001](0001-storyline-format.md) 定义,本 RFC 负责 ATIF +数据模型、校验边界及完整字段映射。 + +文件 reader 接受单个 ATIF object、ATIF object 数组以及 JSONL/NDJSON;下文 pointer +均以单个 trajectory object 为根。文件容器只影响批处理,不改变字段映射。 + +## JSON 数据模型 + +```text +AtifTrajectory +├── schema_version: string +├── session_id / trajectory_id: string? +├── agent: AtifAgent +├── steps: AtifStep[] +├── notes / continued_trajectory_ref: string? +├── final_metrics / extra: any? +└── subagent_trajectories: AtifTrajectory[]? + +AtifAgent +├── name / version: string +├── model_name: string? +└── tool_definitions / extra: any? + +AtifStep +├── step_id: integer +├── timestamp: RFC3339 string? +├── source: string +├── message: any +├── model_name / reasoning_content: string? +├── reasoning_effort: any? +├── tool_calls: AtifToolCall[]? +├── observation: { results: any[] }? +├── metrics / extra: any? +├── llm_call_count: integer? +└── is_copied_context: boolean? + +AtifToolCall +├── tool_call_id / function_name: string +├── arguments: any +└── result / extra: any? +``` + +以上每个拥有字段的 object 都允许额外 key。额外 key 不扩张 Storyline schema,而按本 RFC +映射到 `unknown_fields`。 + +## 校验约束 + +- 根 trajectory 必须至少有一个非空 `session_id` 或 `trajectory_id`;内嵌 trajectory + 必须有非空且在整棵树中唯一的 `trajectory_id`。 +- `agent.name` 与 `agent.version` 必须非空。 +- 每个 trajectory node 内的 `step_id` 必须从 1 开始且唯一;数组顺序具有语义,不按 id + 重排。 +- 每个 trajectory node 内的 `tool_call_id` 必须非空且全局唯一。 +- 非空 `timestamp` 必须是可解析的 RFC3339 字符串。 +- pChronicle 规范导出写 `ATIF-v1.7`;导入保留源 `schema_version` 到 Storyline origin。 + +## ATIF → Storyline JSON Pointer 映射 {#atif-storyline-json-pointer-mapping} + +本节是 ATIF 到 Storyline 字段映射的权威定义。指针遵循 RFC 6901;`{s}`、`{c}` 和 +`{t}` 分别表示源 step、tool call 与目标 turn 的数组下标。代入实际 token 后即为普通 +JSON Pointer。 + +`P` 表示左侧命中的完整源 pointer;`E(P)` 表示把整个 `P` 作为 `fields` 对象 key 后再做 +一次 RFC 6901 token 转义。所有输出都生成 +`/schema_version = "storyline/v1"`、`/origin/format = "atif"`,并从 +`/unknown_fields` 计算 `/unknown_key_counts`;这些值没有源 pointer,故不列入表。 + +| ATIF JSON Pointer | Storyline JSON Pointer | +| --- | --- | +| `/schema_version` | `/origin/schema_version` | +| `/session_id` | `/session` | +| `/trajectory_id` | `/trajectory`
`/session` | +| `/agent/name` | `/agent/id`
`/agent/name` | +| `/agent/version` | `/agent/ver` | +| `/agent/model_name` | `/agent/model` | +| `/agent/tool_definitions` | `/agent/tools` | +| `/agent/extra` | `/agent/extra` | +| `/notes` | `/notes` | +| `/final_metrics` | `/final_metrics` | +| `/continued_trajectory_ref` | `/continued_trajectory_ref` | +| `/extra` | `/extra` | +| `/steps/{s}/step_id` | `/turns/{t}/id` | +| `/steps/{s}/timestamp` | `/turns/{t}/ts` | +| `/steps/{s}/source` | `/turns/{t}/src`
`/turns/{t}/kind` | +| `/steps/{s}/message` | `/turns/{t}/msg` | +| `/steps/{s}/model_name` | `/turns/{t}/model` | +| `/steps/{s}/reasoning_effort` | `/turns/{t}/effort` | +| `/steps/{s}/reasoning_content` | `/turns/{t}/reason` | +| `/steps/{s}/tool_calls` | `/turns/{t}/tool_calls`
`/turns/{t}/kind` | +| `/steps/{s}/tool_calls/{c}/tool_call_id` | `/turns/{t}/tool_calls/{c}/tcid` | +| `/steps/{s}/tool_calls/{c}/function_name` | `/turns/{t}/tool_calls/{c}/fn` | +| `/steps/{s}/tool_calls/{c}/arguments` | `/turns/{t}/tool_calls/{c}/args` | +| `/steps/{s}/tool_calls/{c}/result` | `/turns/{t}/tool_calls/{c}/result` | +| `/steps/{s}/tool_calls/{c}/extra` | `/turns/{t}/tool_calls/{c}/extra` | +| `/steps/{s}/tool_calls/{c}/extra/duration_ms` | `/turns/{t}/tool_calls/{c}/extra/duration_ms`
`/turns/{t}/tool_calls/{c}/duration_ms` | +| `/steps/{s}/observation/results` | `/turns/{t}/observation/results` | +| `/steps/{s}/metrics` | `/turns/{t}/metrics` | +| `/steps/{s}/metrics/latency_ms` | `/turns/{t}/metrics/latency_ms`
`/turns/{t}/latency_ms` | +| `/steps/{s}/metrics/elapsed_ms` | `/turns/{t}/metrics/elapsed_ms`
`/turns/{t}/latency_ms` | +| `/steps/{s}/metrics/duration_ms` | `/turns/{t}/metrics/duration_ms`
`/turns/{t}/latency_ms` | +| `/steps/{s}/metrics/ttft_ms` | `/turns/{t}/metrics/ttft_ms`
`/turns/{t}/ttft_ms` | +| `/steps/{s}/extra` | `/turns/{t}/extra` | +| `/steps/{s}/llm_call_count` | `/turns/{t}/nllm` | +| `/steps/{s}/is_copied_context` | `/turns/{t}/copied` | +| `/subagent_trajectories/{c}` | `""` | +| `/subagent_trajectories/{c}/session_id` | `/session` | +| `/subagent_trajectories/{c}/trajectory_id` | `/children/{c}`
`/trajectory`
`/session` | +| `/session_id`
`/trajectory_id` | `/parent/psid` | +| `/{unmapped-root}`
`/agent/{unmapped-agent}`
`/steps/{s}/{unmapped-step}`
`/steps/{s}/tool_calls/{c}/{unmapped-tool}`
`/steps/{s}/observation/{unmapped-observation}` | `/unknown_fields/sources/atif/fields/{E(P)}` | + +条件和规范化规则: + +- `/session` 按非空 `session_id → trajectory_id → 父 trajectory 的有效 session` 选择; + 根 trajectory 缺少前两者时导入失败。`/agent/id` 与 `/agent/name` 都取 `agent.name`。 +- `/turns/{t}` 与 `/steps/{s}` 保持同一数组顺序。`kind` 通常省略,由 `src` 和 + `tool_calls` 推导;agent turn 含 tool calls 时显式为 `autonomous`,非标准 source + 显式为 `dialogue`。 +- `/latency_ms` 按 `metrics.latency_ms → metrics.elapsed_ms → metrics.duration_ms` 选择, + `/ttft_ms` 取 `metrics.ttft_ms`;数值转换为整数毫秒。完整 metrics value 仍原样保留。 +- `tool_calls.extra.duration_ms` 提升到 call 顶层时,完整 `/extra` 仍保留,因此可以双向 + 恢复。 +- 父 Storyline `/children/{c}` 保存 child `trajectory_id`。child `/parent/psid` 取父 + `trajectory_id`,缺失时取父有效 `session`;`/parent/rel` 固定为 `spawn`。上表对每个 + `/subagent_trajectories/{c}` 递归适用:源 pointer 加 child 前缀,目标 pointer 从新 + Storyline 文档根重新开始。 +- ATIF source document id 是去除 `_storyline` envelope、递归排序 object key 后对规范 JSON + 计算的 BLAKE3;它写入 `/unknown_fields/sources/atif/source_document_id`,没有直接源字段。 +- 除已知 optional 字段的 `null`/missing 规范化外,不能映射到 Storyline 已知字段的值都 + 进入 `unknown_fields`。同源恢复按原 pointer 写回;外来格式 residual 通过 version-1 + `_storyline` envelope 携带。 + +## 保真边界 + +ATIF → Storyline → Lance → Storyline → ATIF 保留 JSON 语义、数组顺序、未知 key/value、 +嵌套 subagent、trajectory/session 身份及有效 RFC3339 原文。已知 optional 字段的显式 +`null` 与 missing 归一为同一缺失语义;源文件空白、缩进、object key 顺序和输入容器排版 +不属于保真边界。 diff --git a/docs/src/zh/rfcs/0009-openai-messages-format.md b/docs/src/zh/rfcs/0009-openai-messages-format.md new file mode 100644 index 00000000..9b004de7 --- /dev/null +++ b/docs/src/zh/rfcs/0009-openai-messages-format.md @@ -0,0 +1,251 @@ +# RFC-0009: OpenAI Messages 轨迹语料格式 + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Format** | `openai-msg`(CLI alias: `openai-messages`) | +| **Date** | 2026-08-21 | +| **Component** | `persisting-pchronicle` | +| **Implements** | `crates/persisting-pchronicle/src/formats/openai_corpus.rs` | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [RFC-0004 ACTF](0004-actf-format.md) · [RFC-0008 ATIF](0008-atif-format.md) | + +## 摘要 + +OpenAI Messages 是 pChronicle 面向训练、评测和回放语料支持的 row-based JSON 格式。 +reader 接受顶层 row 数组或 `{ "session_steps": [...] }` envelope,按 `session_id` 分组, +再把每个 source step 规范化为 request/response turns。Storyline wire schema 由 +[RFC-0001](0001-storyline-format.md) 定义;本 RFC 是输入形态、选择规则与字段映射的 +权威文档。 + +## 接受的数据形态 + +```text +OpenaiCorpus = OpenaiRow[] | { session_steps: OpenaiRow[], ...root fields } + +OpenaiRow +├── session_id: non-empty string +├── step_id: positive integer +├── messages: OpenaiMessage[]? +├── response: OpenaiMessage? +├── created_at: RFC3339 string | Unix epoch seconds? +├── agent_id / agent_model / llm_model: string? +├── run_id / run_bucket / job_id: string? +├── meta_json: object | JSON-encoded object string? +└── arbitrary row fields + +OpenaiMessage +├── role: string? +├── content / refusal: any? +├── reasoning_content: string? +├── name / tool_call_id: string? +└── tool_calls: OpenaiToolCall[]? + +OpenaiToolCall +├── id / type: string? +└── function: { name: string?, arguments: any?, ... } +``` + +`content` 保留 OpenAI 的原始 JSON 类型。对于少数把 content parts 数组再次编码为字符串的 +生产者,reader 会在其字符串内容是合法 JSON 数组(或已知 content-part 对象)时还原为结构化 +值;普通文本字符串保持不变。encoder 使用同一规则写回 `content`,避免把 `message_value` +中的 parts 退化为不可读的 JSON 字符串。 + +每个 row 必须有非空 `session_id`、正整数且在 session 内唯一的 `step_id`,并且必须能从 +`response` 或 `messages` 选出一个有效 assistant output。相同 session 中非空 run identity +必须一致;turn id 计算不得溢出。未知字段不扩张 Storyline schema,按本 RFC 进入 +`unknown_fields`。 + +## Turn 构造与选择 + +第一行最后一条 user message 之前、role 为 `system`、`user` 或 `assistant` 的 message +形成 context turns,并写 `/copied = true`。每行最后一条 user message 形成 request turn。 +assistant output 优先选择包含有效输出的 `/response`;否则从 `messages` 末尾向前选择第一条 +包含非空 content、refusal 或 tool calls 的 assistant message。row 中 role 为 `tool` 且有 +非空 `tool_call_id` 的 message 形成该 response turn 的 observation results。 + +## OpenAI Messages → Storyline JSON Pointer 映射 {#openai-storyline-json-pointer-mapping} + +本节是 OpenAI Messages 到 Storyline 字段映射的权威定义。顶层数组在映射和 unknown-field +记录中规范化为 `/session_steps/{r}`。指针遵循 RFC 6901;`{r}`、`{m}`、`{c}`、`{o}` +和 `{t}` 分别表示 row、message、tool call、observation result 和目标 turn 下标。 +`{last-user}`、`{output}`、`{context-message}` 与 `{tool-message}` 表示按上一节选中的 +message:`{output}` 是有效 `/response`,否则是 `messages` 里选中的 assistant。 + +映射分成四类,禁止把不同角色的槽写进同一格: + +| 类别 | 含义 | 每个源 pointer 的目标数 | +| --- | --- | --- | +| 权威字段 | OpenAI 值进入一个 Storyline 领域字段;同源导出从该字段还原 | 恰好 1 | +| 派生身份 | 由一个或多个源值计算,不是字段拷贝 | 公式,见下 | +| 便利提升 | 在权威字段之外再复制到 hub 顶栏或别名 | 额外 0 或 1,不替代权威字段 | +| 残差 | Storyline 没有对应领域字段,按原 pointer 进入 `unknown_fields` | 1(残差槽) | + +`P` 表示左侧命中的完整源 pointer;`E(P)` 表示把整个 `P` 作为 `fields` 对象 key 后再做 +一次 RFC 6901 token 转义。例如 `/session_steps/0/vendor_row` 保存在 +`/unknown_fields/sources/openai-msg/fields/~1session_steps~10~1vendor_row`。 + +基数: + +```text +OpenAI 文件 1 ──► N Storyline 文档(按 session_id 分组) +OpenAI row 1 ──► 0 或 1 条 request turn + 1 条 response turn +第一行 last-user 之前的 + system/user/assistant 1 ──► 1 条 copied context turn +OpenAI tool message 1 ──► 1 条 observation result +OpenAI tool call 1 ──► 1 条 Storyline tool_call +``` + +`meta_json` 与 `meta_json.env_state` 可以是 object,也可以是编码 object 的 JSON string; +表中的子 pointer 表示解码后的逻辑路径。无法解码时整个值进入残差。 + +### 权威字段(1:1) + +| OpenAI Messages JSON Pointer | Storyline JSON Pointer | +| --- | --- | +| `/session_steps/{r}/session_id` | `/session` | +| `/session_steps/{r}/created_at` | `/turns/{response-t}/ts` | +| `/session_steps/0/messages/{context-message}/content` | `/turns/{t}/msg` | +| `/session_steps/{r}/messages/{last-user}/content` | `/turns/{request-t}/msg` | +| `/session_steps/{r}/messages/{tool-message}/tool_call_id` | `/turns/{response-t}/observation/results/{o}/source_call_id` | +| `/session_steps/{r}/messages/{tool-message}/content` | `/turns/{response-t}/observation/results/{o}/content` | +| `/session_steps/{r}/{output}/content` | `/turns/{response-t}/msg` | +| `/session_steps/{r}/{output}/reasoning_content` | `/turns/{response-t}/reason` | +| `/session_steps/{r}/{output}/tool_calls/{c}/id` | `/turns/{response-t}/tool_calls/{c}/tcid` | +| `/session_steps/{r}/{output}/tool_calls/{c}/function/name` | `/turns/{response-t}/tool_calls/{c}/fn` | +| `/session_steps/{r}/{output}/tool_calls/{c}/function/arguments` | `/turns/{response-t}/tool_calls/{c}/args` | +| `/session_steps/0/messages/{context-message}/tool_calls/{c}/id` | `/turns/{t}/tool_calls/{c}/tcid` | +| `/session_steps/0/messages/{context-message}/tool_calls/{c}/function/name` | `/turns/{t}/tool_calls/{c}/fn` | +| `/session_steps/0/messages/{context-message}/tool_calls/{c}/function/arguments` | `/turns/{t}/tool_calls/{c}/args` | +| `/session_steps/{r}/env_name` | `/task/env/name` | +| `/session_steps/{r}/meta_json/env_state/endpoint` | `/task/env/endpoint` | +| `/session_steps/{r}/dataset_type` | `/task/env/state/dataset_type` | +| `/session_steps/{r}/dt` | `/task/env/state/dt` | +| `/session_steps/{r}/meta_json/group_id` | `/task/env/state/group_id` | +| `/session_steps/{r}/meta_json/env_state/redaction_policy` | `/task/env/state/redaction_policy` | +| `/session_steps/{r}/meta_json/env_state/upstream_base_url` | `/task/env/state/upstream_base_url` | +| `/session_steps/{r}/meta_json/env_state/weight_version` | `/task/env/state/weight_version` | +| `/session_steps/{r}/id` | `/turns/{response-t}/env/id` | +| `/session_steps/{r}/meta_json/env_state/event_type` | `/turns/{response-t}/env/event_type` | +| `/session_steps/{r}/meta_json/env_state/request_id` | `/turns/{response-t}/env/request_id` | + +已知 metric 键组成 response turn 上的一个 `/metrics` 对象,不再为每个键单列一行: + +| 源 | 进入 `/turns/{response-t}/metrics` 的键 | +| --- | --- | +| `/session_steps/{r}/reward`、`/session_steps/{r}/step_reward`、`/session_steps/{r}/is_terminal`、`/session_steps/{r}/is_truncated`、`/session_steps/{r}/is_session_completed`、`/session_steps/{r}/is_trainable` | 同名 | +| `/session_steps/{r}/meta_json/env_state/{metric}` | 同名;`{metric}` 为 `prompt_tokens`、`completion_tokens`、`total_tokens`、`request_bytes`、`response_bytes`、`output_bytes`、`output_chunk_count`、`finish_reason`、`status_code`、`retry_count`、`upstream_latency_ms`、`gateway_overhead_ms`、`total_latency_ms`、`ttft_ms`、`truncate_reason`、`error_type`、`error_text`、`client_cancelled`、`upstream_cancelled`、`synthetic_stop`、`is_truncated`、`is_session_completed`、`max_steps`、`is_stream`、`payload_sampled`、`created_at`、`completed_at` | + +row 顶层与 `env_state` 同名时,row 顶层值写入 `/metrics`,`env_state` 里的同名键视为已消费。 +`function.arguments` 若为合法 JSON string,权威 `args` 是解析后的 JSON value,否则保留原 +string。没有结构化 `tool_calls` 时,`{output}/content` 仍只映射到 `/msg`;其中受支持的 +`` / `` 标记另外**派生** `/tool_calls`,不是 `content` 的第二 +个权威目标。`{output}/refusal` 仅在 `content` 没有有效值时回退写入 `/msg`,此时 `refusal` +视为已消费;若与有效 `content` 同时存在,`refusal` 进残差。 + +session-stable 的 `/task/env` 键取该 session **第一个非空值**;后续 row 上相等的值视为已消费 +别名;后续不相等的值写入该 response turn 的 `/env`(含 `state` 浅 delta),导入不失败。 +`id` / `event_type` / `request_id` 只写 response turn `/env`,不提升到 `/task/env`。copied +context turns 不写 `env`。`env_state` 里已进入 `/metrics` 的键(tokens、latency、 +`status_code`、`finish_reason`、`created_at`/`completed_at` 等)不写入 `env`。row +`created_at` 不提升为文档 `/started_at`。 + +### 派生身份(不是字段拷贝) + +```text +{request-t} := context_count + 2 × step_id - 1 当该 row 有 last-user +{response-t} := context_count + 2 × step_id +/run := session 内第一个非空 run_id → run_bucket → job_id +/agent/id := 第一个非空 agent_id → meta_json.source → 首个 model → "openai-import" +/agent/name := /agent/id +/agent/model := session 内第一个非空 agent_model → llm_model +/turns/{response-t}/model := 该 row 的 agent_model → llm_model +``` + +未选中的 `llm_model` 仅当等于已选 model 时才消费,否则进残差。 + +`context_count` 是第一行实际接纳的 context turns 数,不一定等于原 message 数。`step_id` +只用于计算 turn id,不拷贝到两个 `/id`。同一 session 后续 row 的 `/run` 候选必须与已选 +值一致,否则导入失败。 + +没有 JSON 源 pointer 的常量与文件身份: + +| Storyline | 值 | +| --- | --- | +| `/schema_version` | `"storyline/v1"` | +| `/origin/format` | `"openai-msg"` | +| `/origin/document_id` | 源文件相对路径 | +| `/unknown_fields/sources/openai-msg/source_document_id` | 同上;残差文档键,用来把同一文件拆出的 N 条 Storyline 再拼回去 | +| `/origin/schema_version` | 缺省 | +| context `/src` | `system → system`、`user → user`、`assistant → agent` | +| context `/copied` | `true` | +| context `/kind` | 有 tool calls 时 `"autonomous"`,assistant 为 `"llm.response"`,user 为 `"llm.request"`,system 为 `"context"` | +| request `/src`、`/kind` | `"user"`、`"llm.request"` | +| response `/src`、`/nllm` | `"agent"`、`1` | +| response `/kind` | 有 tool calls 时 `"autonomous"`,否则 `"llm.response"` | + +`env_id`、`env_state.session_id` 仅当等于 `/session` 时视为冗余别名并消费; +`env_state.requested_model` 仅当等于该 row 已选 model 时消费;`env_state.llm_step_index` +仅当等于该 row `step_id` 时消费。不一致值进入残差,不改写 `/session`、`/model` 或 turn id。 + +tool-role message 的 `role` 只用于选出 observation,不映射到 result 对象。未选中的 +assistant / 历史 messages 副本不生成新 turn。 + +### 便利提升 + +| 源(已在权威表或派生结果中) | 额外写入 | 条件 | +| --- | --- | --- | +| `/turns/{response-t}/ts` | `/turns/{request-t}/ts` | 该 row 有 request turn | +| `/turns/{response-t}/metrics` | `/final_metrics` | 只复制 session **最后一个** response turn | +| `/metrics/total_latency_ms` | `/turns/{response-t}/latency_ms` | 值为 number | +| `/metrics/ttft_ms` | `/turns/{response-t}/ttft_ms` | 值为 number | + +### 残差 + +未进入权威字段且未被当作冗余别名/结构判别/空值消费的键,按原 pointer 写入 +`/unknown_fields/sources/openai-msg/fields/{E(P)}`。已消费、不再作为残差保存的包括: +`session_id`、`step_id`、`created_at`、已选 run/agent/model 键、row 顶层与 `env_state` +中已进入 `/metrics` 的键、已进入 `/task/env` 或 response `/env` 的 env 键、选中 message 的 `role`/`content`、作为 output 消费的 +`refusal`、string/null 的选中 `reasoning_content`、有效 tool call 的 `id` / +`function.name` / `function.arguments`、以及 `type="function"`。其它 `type` 值进入残差。 + +| OpenAI Messages JSON Pointer | +| --- | +| `/{unmapped-root}` | +| `/session_steps/{r}/{unmapped-row}` | +| `/session_steps/{r}/messages/{m}/{unmapped-message}` | +| `/session_steps/{r}/response/{unmapped-message}` | +| `/session_steps/{r}/messages/{m}/tool_calls/{c}/{unmapped-call}` | +| `/session_steps/{r}/response/tool_calls/{c}/{unmapped-call}` | +| `/session_steps/{r}/messages/{m}/tool_calls/{c}/function/{unmapped-function}` | +| `/session_steps/{r}/response/tool_calls/{c}/function/{unmapped-function}` | +| `/session_steps/{r}/meta_json/{unmapped-meta}` | +| `/session_steps/{r}/meta_json/env_state/{unmapped-env}` | + +后续 row 里重复的历史 messages 视为 context 副本:已识别的 `role`/`content` 被规范化掉, +不重复生成 turns,也不进入残差。只有每行最后一个 user、选中的 assistant output 和 +tool-role results 产生新语义。未选中 assistant 副本中的 string/null `reasoning_content`, +以及没有有效 content 时的非空 `refusal`,按副本规范化。已映射 message 的 `name`、 +`refusal`、`tool_call_id`、`tool_calls` 中的 `null` 或空容器,以及 row 的 +`blob_manifest`、`chosen_response`、`rejected_response`、`ground_truth_answer`、 +`reference_answer` 中的 `null` 或空容器,按缺失值规范化;非空且未命中权威语义的值进入 +残差。 + +同源恢复按原 pointer 写回。导出时若没有 openai-msg residual,合成行把 `/run` 写成 +`job_id`、把 `/agent/id` 写成 `agent_id`、把 model 写成 `agent_model`,不宣称还原 +`run_id` / `run_bucket` / `llm_model` 的原始键名。外来格式 residual 通过 version-1 +`_storyline` envelope 携带。`unknown_key_counts` 由 `unknown_fields` 确定性重算,没有 +独立源 pointer。 + +## 保真边界 + +同源 roundtrip 保留进入 Storyline 语义或 `unknown_fields` 的 JSON value、数组顺序与 +session 分组。已知空值、重复历史 context、`type="function"` 结构判别,以及 +`refusal` 在无 content 时并入 `/msg`,按上节规范化。文件空白、缩进、object key 顺序 +以及顶层数组与 `session_steps` envelope 的原始排版不属于保真边界。 + +## Amendment history + +| Date | Change | +| --- | --- | +| 2026-08-22 | 按 RFC-0004 的映射类别重写:每个源 pointer 恰好一个权威目标。`step_id`、`/run`、`/agent/id`、turn id 改为派生公式;`created_at` 只权威写入 response `/ts`;metric 收成 `/metrics` 对象并以 `/final_metrics` 为最后一 turn 的提升;`type`/`role`/`env_id` 等不再写成 1 到多字段拷贝。 | +| 2026-08-22 | session-stable env 键进入 `/task/env`;row `id`、`event_type`、`request_id` 进入 response turn `/env`。 | diff --git a/docs/src/zh/rfcs/0010-agent-corpus-lance-layout.md b/docs/src/zh/rfcs/0010-agent-corpus-lance-layout.md new file mode 100644 index 00000000..f442e0eb --- /dev/null +++ b/docs/src/zh/rfcs/0010-agent-corpus-lance-layout.md @@ -0,0 +1,563 @@ +# RFC-0010: Agent 评测语料的分层 Lance 布局 + +| Field | Value | +|---|---| +| **Status** | Proposed | +| **Schema / format name** | `corpus/v1`(逻辑);物理为 `corpus/*.lance` 一组 dataset | +| **Date** | 2026-08-29 | +| **Component** | `persisting-pchronicle` | +| **Implements** | 尚未实现;本 RFC 定义目标布局 | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [RFC-0004 ACTF](0004-actf-format.md) · [RFC-0009 OpenAI Messages](0009-openai-messages-format.md) · [Storyline Lance](../pchronicle/design/storyline-lance.md) | + +--- + +## 摘要 + +本 RFC 定义一个**四层 + 两条旁路**的 Lance 布局,用于存放 Agent 评测语料(benchmark +harness 产出的 attempt 级 JSON)。 + +核心判断来自对一份 1562MB / 18 文件真实语料的实测:**99% 的体积是冗余和衍生物,真正的 +信息量在 20MB 量级**。因此布局的第一原则不是"如何优雅地建模轨迹",而是**按访问频率和体积 +把数据切成物理隔离的层**,让日常查询永远不接触取证层的字节。 + +与既有 Storyline 三表([storyline-lance](../pchronicle/design/storyline-lance.md))的关系: +本布局是**入库侧的语料层**,负责无损收敛外部 harness 的异构输出;Storyline 仍是互操作枢纽。 +两者共享 CAS 内容层的设计思路,但本布局的原子粒度更细(block 而非 step),并且显式建模 +了 Storyline 没有的维度:多 attempt、analyzer 判定、取证产物、RL 偏好对。 + +--- + +## 动机 + +### 实测数据画像 + +语料路径约定为 +`////_/details/.json`, +一个文件对应一个 task 的一组 attempt。实测结论: + +| 观察 | 实测值 | +|---|---| +| 文件级完全重复 | 1562MB → 892MB(18 文件中仅 15 个内容不同);两个 654MB 文件 md5 相同 | +| 取证转储占比 | `attempts.1.artifacts.raw_researchharness_trace_events` = 651.1MB(单文件 99.5%),同文件规范轨迹仅 6.7MB | +| 同文件内逐字节重复 | `attempts.1.error`(3.06MB 单字符串)完整包含 `extra.harness_metrics.stdout`(3.06MB) | +| 二次型前缀增长 | RL 族每行携带完整历史,第 N 步 messages 是第 N+1 步的精确前缀;单 session 放大 25.6x | +| 逐步重复 | ACTF 族 `system_prompt` / `tools` 每步重存;1000 步文件内 tool schema 重复 8000 份 | +| 端到端可压缩性 | 205.9MB 内容字符串 → 去重 92.1MB(2.2x)→ 压缩 14.95MB(合计 14x) | + +### schema_version 不可信 + +8 个 `trajectory` 为 dict 的文件**全部**声明 `schema_version: "ACTF_v1.0"`,但 +`observation` 元素有四种互不兼容的形状: + +1. `{content, is_error, tool_use_id, type}`(Claude 风格) +2. `{content}` +3. `{role, text, tool_names, error}` +4. 元素本身是 list(嵌套一层) + +单文件出现 198 个不同键名,`retry_count` / `retry_counts` 只在部分文件出现, +`compaction` 事件只在部分文件出现。**入库必须按形状探测而非按声明版本分派,且必须有 +无损兜底通道。** + +### 三个来源族 + +| 族 | 形态 | 来源 | +|---|---|---| +| `actf_steps` | `trajectory = {schema_version, started_at, finished_at, steps[]}`;step 含 `step_id / system_prompt / tools / user_content / assistant_content / observation / metric / started_at / finished_at` | terminal_bench、swebench_pro、researchclawbench | +| `event_stream` | `trajectory = [{type, id, parentId, timestamp, ...}]`;类型 `session / model_change / thinking_level_change / custom / message / compaction`;message 角色 `user / assistant / toolResult` | skillsbench、pinchbench | +| `rl_rows` | 顶层即 list;行含 `session_id, step_id, messages[], chosen_response, rejected_response, reward, step_reward, is_trainable, is_terminal, is_truncated, blob_manifest, ...` | cybergym | + +`event_stream` 族的 `parentId` 意味着轨迹是**树**而非线性序列。 + +--- + +## 分层模型 + +四个存储层,按"访问频率 × 体积"划分。层之间只通过键引用,物理上是独立 Lance dataset, +可以独立压缩、独立维护、独立过期。 + +```text +L0 溯源层 corpus_files ──< file_paths + │ (物理文件身份;一个内容可有多个观测路径) + ▼ +L1 分析层 attempts ──< analysis + │ (查询主脊:约 0.1% 字节,承载全部 triage 查询) + ▼ +L2 结构层 steps ──< blocks + │ (有序骨架 + 内容块索引;窄表,全列可字典编码) + ▼ +L3 内容层 content (CAS,按 digest 唯一,Blob v2 承载 payload) + ▲ ▲ + │ │ +L4 冷层 artifacts │ (取证转储:约 95% 字节,默认不进查询路径) + │ +旁路 A preferences (RL 偏好对:派生训练视图) +旁路 B tool_defs (工具定义的去重投影) +``` + +分层的实际含义: + +| 层 | 字节占比 | 访问频率 | 是否可丢 | +|---|---|---|---| +| L0 溯源 | ~0% | 中(血缘追溯) | 否 | +| L1 分析 | ~0.1% | **极高**(每次 triage) | 否 | +| L2 结构 | ~1% | 中(回放、导出) | 否,可从 L0 重建 | +| L3 内容 | ~4% | 中低(回放、导出) | 否,可从 L0 重建 | +| L4 冷层 | **~95%** | 极低(取证) | **是**,是 L2+L3 的衍生重复品 | + +--- + +## L0 溯源层 + +### `corpus_files` + +一行一个**内容不同**的物理文件。身份是内容而非路径,因此字节相同的文件天然合并。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `file_digest` | `FixedSizeBinary(32)` | BLAKE3-256,主键 | +| `n_bytes` | `Int64` | 原始字节数 | +| `source_family` | `Utf8`(字典) | `actf_steps` / `event_stream` / `rl_rows` | +| `declared_schema_version` | `Utf8` nullable | 原样保留,**不用于分派** | +| `shape_fingerprint` | `FixedSizeBinary(32)` | 探测得到的形状指纹,用于分组同构文件 | +| `ingested_at` | `Timestamp(us, UTC)` | | +| `raw_digest` | `FixedSizeBinary(32)` | 指向 `content`,可选保留原始 JSON | + +### `file_paths` + +一行一个**观测到的路径**。同一 `file_digest` 可有多行——实测中两个 654MB 文件字节相同但 +路径不同(`_2054` 与 `_clone_2081`),这是唯一诚实的表达方式:内容是一份,路径是两个观测。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `file_digest` | `FixedSizeBinary(32)` | → `corpus_files` | +| `path` | `Utf8` | 相对语料根的完整路径 | +| `owner` | `Utf8`(字典) | 路径第 1 段 | +| `experiment` | `Utf8`(字典) | 路径第 2 段 | +| `benchmark` | `Utf8`(字典) | 路径第 3 段 | +| `model_tag` | `Utf8`(字典) | 路径第 4 段 | +| `run_name` | `Utf8`(字典) | 路径第 5 段去掉尾部 `_` | +| `run_id` | `Int64` nullable | 路径第 5 段尾部数字 | +| `is_clone` | `Boolean` | `run_name` 含 `_clone` | +| `task_slug` | `Utf8` | 文件名去掉 `_error_` 前缀与 `.json` | +| `filename_marks_error` | `Boolean` | 文件名带 `_error_` 前缀 | +| `observed_mtime` | `Timestamp(us, UTC)` nullable | | + +路径维度是**每一个查询的入口**("benchmark=X 且 model=Y 的失败 attempt"),因此必须是 +一等列而非从路径字符串现场解析。 + +--- + +## L1 分析层 + +### `attempts` + +一行一个 attempt。这是查询主脊:**所有 triage 查询必须只靠这张表完成,不读任何内容字节。** + +| 列 | 类型 | 说明 | +|---|---|---| +| `attempt_uid` | `FixedSizeBinary(32)` | `blake3(file_digest ‖ attempt_no)`,主键 | +| `file_digest` | `FixedSizeBinary(32)` | → `corpus_files` | +| `attempt_no` | `Int32` | `attempts` 的键(`"1"`, `"2"`…) | +| `task_id` | `Utf8` | | +| `category` | `Utf8`(字典) | | +| `k` | `Int32` | | +| `attempts_tried` | `Int32` | | +| `retry_count` | `Int32` nullable | 仅部分来源有 | +| `correct` | `Boolean` | | +| `score` | `Float64` nullable | | +| `status` | `Utf8`(字典) | | +| `solved_at` | `Timestamp(us, UTC)` nullable | | +| `started_at` / `finished_at` | `Timestamp(us, UTC)` nullable | | +| `owner` … `filename_marks_error` | 同 `file_paths` | **反规范化**的规范路径维度(取该 digest 路径集的字典序最小者) | +| `n_steps` | `Int32` | 以下均为入库期预计算的 rollup | +| `n_messages` | `Int32` | | +| `n_blocks` | `Int32` | | +| `n_tool_calls` | `Int32` | | +| `n_tool_errors` | `Int32` | | +| `input_tokens` / `output_tokens` / `cache_read_tokens` / `cache_write_tokens` | `Int64` nullable | | +| `cost_total` | `Float64` nullable | | +| `llm_infer_ms_total` / `tool_exec_ms_total` / `wall_ms` | `Float64` nullable | | +| `has_error` | `Boolean` | | +| `error_digest` | `FixedSizeBinary(32)` nullable | → `content`;巨型 error 字符串不进本表 | +| `final_answer_digest` | `FixedSizeBinary(32)` nullable | → `content` | +| `ground_truth_json` | `lance.json` nullable | 形状不一(有时 str,有时 `{checklist_path}`) | +| `meta_json` | `lance.json` nullable | **已脱敏**的 `meta`,见"凭证脱敏" | +| `unknown_json` | `lance.json` nullable | 无损兜底 | + +rollup 列是本设计成立的关键:它们把"筛出高成本 / 高延迟 / 工具报错多的 attempt"从一次 +内容扫描降级为一次窄列扫描。 + +### `analysis` + +一行一个 `(attempt, analyzer)`。**长格式**,不是 21 个固定列也不是一个 JSON blob。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `attempt_uid` | `FixedSizeBinary(32)` | → `attempts` | +| `analyzer` | `Utf8`(字典) | 实测 21 种,集合在增长 | +| `is_badcase` | `Boolean` nullable | 实测 188 次出现 | +| `score` | `Float64` nullable | 实测 118 次出现 | +| `analyzer_error` | `Utf8` nullable | 实测 55 次出现 | +| `details_digest` | `FixedSizeBinary(32)` nullable | → `content`;`ExceptionAnalyzer.details` 实测达 1.93MB | +| `details_inline_json` | `lance.json` nullable | details 小于阈值时就地存放,可直接查询 | + +选长格式的三个理由:analyzer 集合在增长(新增不动 schema);`details`/`score`/`error` +三个子键都是可选的(宽表会产生大量 null 列);最常见的查询是"任一 analyzer 命中", +长格式下是一次普通过滤而非 21 列 OR。 + +--- + +## L2 结构层 + +### `steps` + +有序的回合骨架。`metric` / `usage` **完全摊平**成真实列——它们是聚合查询的主要目标, +留在 JSON 里等于放弃列式优势。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `attempt_uid` | `FixedSizeBinary(32)` | → `attempts` | +| `step_ordinal` | `Int32` | 从 0 连续,本布局赋予的规范序 | +| `source_step_id` | `Utf8` nullable | 来源自带的 `step_id` / 事件 `id` | +| `parent_step_ordinal` | `Int32` nullable | `event_stream` 族 `parentId` 解析结果;线性时为 null | +| `session_id` | `Utf8` nullable | `rl_rows` 族与 `session` 事件 | +| `model` / `provider` / `api` | `Utf8`(字典) nullable | | +| `stop_reason` / `finish_reason` | `Utf8`(字典) nullable | | +| `prompt_tokens` / `completion_tokens` | `Int64` nullable | ACTF `metric.{prompt,completion}_tokens_len` | +| `cache_read_tokens` / `cache_write_tokens` / `total_tokens` | `Int64` nullable | `event_stream` 族 `usage.*` | +| `cost_input` / `cost_output` / `cost_cache_read` / `cost_cache_write` / `cost_total` | `Float64` nullable | `usage.cost.*` | +| `llm_infer_ms` | `Float64` nullable | ACTF `metric.llm_infer_ms` | +| `env_action_ms` | `Float64` nullable | ACTF `metric.env_action_ms` | +| `started_at` / `finished_at` | `Timestamp(us, UTC)` nullable | | +| `system_prompt_digest` | `FixedSizeBinary(32)` nullable | → `content`;逐步重复由 CAS 吸收 | +| `tools_digest` | `FixedSizeBinary(32)` nullable | → `content` / `tool_defs` | +| `unknown_json` | `lance.json` nullable | | + +### `blocks` + +**本布局的核心表。** 原子是内容块,不是 message 也不是 step。三个来源族在这个粒度上完全 +同构:ACTF 的 `assistant_content.{content, reasoning_content, tool_calls[]}`、 +`event_stream` 的 `[thinking, text, toolCall]` 块列表、`rl_rows` 的 `messages[].content[]` +都落成同一组行。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `attempt_uid` | `FixedSizeBinary(32)` | → `attempts` | +| `step_ordinal` | `Int32` | → `steps` | +| `msg_ordinal` | `Int32` | 步内消息序 | +| `block_ordinal` | `Int32` | 消息内块序 | +| `role` | `Utf8`(字典) | `system` / `user` / `assistant` / `tool` / `runtime` | +| `block_type` | `Utf8`(字典) | `text` / `thinking` / `tool_call` / `tool_result` | +| `tool_name` | `Utf8`(字典) nullable | | +| `tool_call_id` | `Utf8` nullable | 关联 `tool_call` 与 `tool_result` | +| `is_error` | `Boolean` nullable | | +| `content_digest` | `FixedSizeBinary(32)` nullable | → `content` | +| `n_bytes` | `Int32` | 内容原始字节数 | +| `arguments_json` | `lance.json` nullable | tool call 参数;小且是高频查询目标 | +| `thinking_signature` | `Utf8` nullable | | +| `unknown_json` | `lance.json` nullable | | + +`blocks` 的所有过滤列都是低基数可字典编码的,payload 只是定长摘要,因此 +`WHERE tool_name = 'Bash' AND is_error` 这类查询扫描代价接近于零。 + +物理写入按 `(attempt_uid, step_ordinal, msg_ordinal, block_ordinal)` 排序, +`attempt_uid` 上建 BTree 标量索引:筛一批 attempt 走索引,回放一个 attempt 是一次连续 +范围读。 + +--- + +## L3 内容层 + +### `content` + +CAS。按 `digest` 唯一,是全布局唯一存放大段字节的地方。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `digest` | `FixedSizeBinary(32)` | BLAKE3-256 of 未压缩原始字节,主键 | +| `n_bytes` | `Int64` | 未压缩长度 | +| `encoding` | `Utf8`(字典) | `raw` / `zstd` | +| `content_type` | `Utf8`(字典) | `text/plain` / `application/json` / … | +| `payload_inline` | `Binary` nullable | 小于 `inline_threshold` 时就地存放 | +| `payload_blob` | Lance Blob v2 | 大于阈值时走 blob,不投影则零字节读取 | + +**去重与卸载解耦,这是与现行 Storyline 内容层最重要的分歧。** 摘要**总是**计算,去重在 +`content` 表这一级无条件发生;`inline` 还是 `blob` 是 `content` 表内部的独立决定 +(建议阈值 8KB)。现行设计用单一的 64KB `DEFAULT_CONTENT_OFFLOAD_THRESHOLD` 同时决定 +这两件事,导致本语料的主要重复模式(小对象的成千上万次重复)完全逃逸。 + +需要说明清楚 CAS 相对列压缩的**边界**:同一 fragment 内的重复值,Lance 的字典编码和页 +压缩本来就能吃掉,这部分不是 CAS 的功劳。CAS 不可替代的是两种情形—— + +1. **跨 dataset / 跨 run 的重复**:上千次 run 共享同一份 system prompt 与 tool schema, + 页压缩看不到跨文件边界;实测两个 654MB 文件完全相同,压缩无能为力。 +2. **二次型前缀增长**:`rl_rows` 族第 N 步与第 N+1 步的 `messages` 是**不同的值**,字典 + 编码失效;只有结构化引用能把 25.6x 放大压回 1x。 + +### `tool_defs`(旁路 B) + +`tools_digest` 指向的工具定义列表的去重投影,让"哪些 run 可用工具 X"变成关系查询。 +实测单文件内 tool schema 重复 8000 份,去重后是个位数行。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `tools_digest` | `FixedSizeBinary(32)` | → `content` | +| `tool_name` | `Utf8`(字典) | | +| `description_digest` | `FixedSizeBinary(32)` nullable | → `content` | +| `parameters_json` | `lance.json` nullable | | + +--- + +## L4 冷层 + +### `artifacts` + +取证转储。**独立 dataset、独立生命周期、默认不进查询路径。** + +| 列 | 类型 | 说明 | +|---|---|---| +| `attempt_uid` | `FixedSizeBinary(32)` | → `attempts` | +| `artifact_name` | `Utf8`(字典) | `raw_researchharness_trace_events` / `harness_metrics.stdout` / `error` / … | +| `digest` | `FixedSizeBinary(32)` | → `content` | +| `n_bytes` | `Int64` | | +| `content_type` | `Utf8`(字典) | | +| `derives_from` | `Utf8`(字典) nullable | 标注它是 L2+L3 的衍生重复品时填 `trajectory` | + +这一层承载实测 95% 的字节,却是 L2+L3 的衍生重复品——`error` 完整包含 +`harness_metrics.stdout`,`raw_researchharness_trace_events` 是 `trajectory.steps` 的 +逐次全量重放。因此它必须能被独立地过期、独立地丢弃,而不影响任何分析查询。 +`derives_from` 让"可安全丢弃"成为可判定的属性。 + +### `preferences`(旁路 A) + +`rl_rows` 族的偏好对。它是**派生的训练视图**,不是轨迹;硬塞进轨迹模型正是 25.6x 放大的 +成因,所以单独一张表。 + +| 列 | 类型 | 说明 | +|---|---|---| +| `attempt_uid` | `FixedSizeBinary(32)` | → `attempts` | +| `session_id` | `Utf8` | | +| `step_ordinal` | `Int32` | → `steps`;**状态就是该步的 block 前缀,不再复制** | +| `chosen_digest` | `FixedSizeBinary(32)` nullable | → `content` | +| `rejected_digest` | `FixedSizeBinary(32)` nullable | → `content` | +| `response_digest` | `FixedSizeBinary(32)` nullable | → `content` | +| `reward` / `step_reward` | `Float64` nullable | | +| `is_trainable` / `is_terminal` / `is_truncated` / `is_session_completed` | `Boolean` | | +| `dataset_type` | `Utf8`(字典) | `TRAIN` / `TEST` / … | +| `dt` | `Date32` | | +| `env_id` / `env_name` / `job_id` / `agent_model` | `Utf8`(字典) nullable | | +| `blob_manifest_json` | `lance.json` nullable | | +| `unknown_json` | `lance.json` nullable | | + +消除二次型冗余的机制在这里:`preferences` 不存 `messages[]`,只存 `step_ordinal`;状态 +按需从 `blocks` 取 `step_ordinal <= N` 的前缀重建。 + +--- + +## 关联关系与基数 + +| 父 | 子 | 外键 | 基数 | 语义 | +|---|---|---|---|---| +| `corpus_files` | `file_paths` | `file_digest` | 1 : 1..N | 一份内容可有多个观测路径 | +| `corpus_files` | `attempts` | `file_digest` | 1 : 1..k | 一文件含 `attempts_tried` 个 attempt | +| `attempts` | `analysis` | `attempt_uid` | 1 : 0..21 | analyzer 集合可增长 | +| `attempts` | `steps` | `attempt_uid` | 1 : 0..N | | +| `attempts` | `artifacts` | `attempt_uid` | 1 : 0..M | | +| `attempts` | `preferences` | `attempt_uid` | 1 : 0..N | 仅 `rl_rows` 族非空 | +| `steps` | `steps` | `parent_step_ordinal` | 自引用 | `event_stream` 族的分支树 | +| `steps` | `blocks` | `(attempt_uid, step_ordinal)` | 1 : 0..N | | +| `blocks` | `blocks` | `tool_call_id` | 1 : 0..1 | `tool_call` ↔ `tool_result` 配对 | +| `blocks` | `content` | `content_digest` | N : 1 | **多对一是去重发生的地方** | +| `steps` | `content` | `system_prompt_digest` / `tools_digest` | N : 1 | | +| `analysis` | `content` | `details_digest` | N : 1 | | +| `artifacts` | `content` | `digest` | N : 1 | | +| `preferences` | `content` | `chosen` / `rejected` / `response_digest` | N : 1 | | +| `content` | `tool_defs` | `tools_digest` | 1 : N | 投影展开 | + +所有指向 `content` 的边都是 **N : 1**,这是整个布局压缩比的来源。除此之外的边全部是 +严格的树形父子关系,没有多对多。 + +### 关键 join 路径 + +```text +triage attempts ⋈ analysis (不触碰 content) +成本分析 attempts ⋈ steps (不触碰 content) +工具行为 blocks ⋈ steps ⋈ attempts (不触碰 content payload) +回放 attempts ⋈ steps ⋈ blocks ⋈ content (范围读 + blob take) +训练导出 preferences ⋈ blocks ⋈ content +取证 attempts ⋈ artifacts ⋈ content (显式 opt-in) +``` + +--- + +## 身份与幂等 + +- `content.digest` = BLAKE3-256(未压缩原始字节) +- `corpus_files.file_digest` = BLAKE3-256(文件原始字节) +- `attempts.attempt_uid` = BLAKE3-256(`file_digest` ‖ `attempt_no` 的 LE u32) + +**身份取内容而非路径**,带来三个性质:重复入库天然幂等;字节相同的文件自动合并为一个 +attempt 并记录多个路径观测;血缘可从任何一层反查到原始文件。 + +代价是必须接受一个语义判断:字节完全相同(含全部时间戳)的两个文件是**同一次逻辑运行的 +拷贝**,而非两次巧合相同的运行。实测的 `_2054` / `_clone_2081` 属于前者。如果某个 harness +确实会产出字节相同的不同运行,则需要在 `attempt_uid` 中混入路径,这是本 RFC 的一个 +未决点。 + +--- + +## 来源族到 `blocks` 的映射 + +### `actf_steps` + +| 来源字段 | 落点 | +|---|---| +| `steps[i].step_id` | `steps.source_step_id` | +| `steps[i].system_prompt` | `steps.system_prompt_digest` → `content` | +| `steps[i].tools` | `steps.tools_digest` → `content` / `tool_defs` | +| `steps[i].user_content` | `blocks(role=user, block_type=text)` | +| `steps[i].assistant_content.content` | `blocks(role=assistant, block_type=text)` | +| `steps[i].assistant_content.reasoning_content` | `blocks(role=assistant, block_type=thinking)` | +| `steps[i].assistant_content.tool_calls[j]` | `blocks(role=assistant, block_type=tool_call, tool_name, arguments_json)` | +| `steps[i].observation` | `blocks` 行,`role` 取 `tool` 或 `runtime`,`block_type=tool_result`;四种形状统一到 `{content, is_error, tool_call_id}`,未能映射的键进 `unknown_json` | +| `steps[i].metric.*` | `steps` 的摊平列 | + +`observation` 的四种形状必须由**形状探测**分派,不得依赖 `declared_schema_version`。 + +### `event_stream` + +| 来源字段 | 落点 | +|---|---| +| 事件 `id` / `parentId` | `steps.source_step_id` / `steps.parent_step_ordinal` | +| `session` 事件的 `cwd` / `version` | `attempts.meta_json` | +| `model_change` / `thinking_level_change` | 生效区间内 `steps.model` / `steps.provider`;原事件保留于 `unknown_json` | +| `message.role=user` 的 `content[]` | `blocks(role=user)` | +| `message.role=assistant` 的 `content[]` 块 | `blocks` 行,`block_type` 取 `thinking`、`text` 或 `tool_call` | +| `message.role=toolResult` | `blocks(role=tool, block_type=tool_result, tool_call_id, tool_name, is_error)` | +| `message.usage.*` / `usage.cost.*` | `steps` 的摊平列 | +| `compaction` 事件 | `steps` 一行,`block_type` 无内容块;标记于 `unknown_json` | +| `custom` 事件 | `steps.unknown_json` | + +一次 assistant 消息及其后继 toolResult 折叠为一个 `step`;`parentId` 分叉时 +`parent_step_ordinal` 指向分叉点,不做线性化。 + +### `rl_rows` + +| 来源字段 | 落点 | +|---|---| +| `session_id` / `step_id` | `steps.session_id` / `steps.step_ordinal` | +| `messages[]` | **仅最后一条新增消息**落 `blocks`;前缀通过 `step_ordinal <= N` 重建 | +| `chosen_response` / `rejected_response` / `response` | `preferences.*_digest` | +| `reward` / `step_reward` / `is_*` | `preferences` | +| `blob_manifest` / `meta_json` | `preferences` 的 `lance.json` 列 | + +入库时必须校验"第 N 步的 messages 是第 N+1 步的前缀"这一前提;若不成立则退化为全量落 +`blocks`(CAS 仍会去重相同消息),并在 `corpus_files.shape_fingerprint` 上标注。 + +--- + +## Lance 物理决策 + +1. **`lance.json` 用于小而需查询的半结构化列**:`blocks.arguments_json`、 + `attempts.meta_json` / `ground_truth_json`、`analysis.details_inline_json`、 + `preferences.blob_manifest_json`,以及每张表的 `unknown_json`。这些列在 + `lance 9.0.1` 中以 JSONB(`LargeBinary` + `lance.json` 扩展)存储,可用 + `json_get_*` / `json_extract` 过滤,并可对热路径建 JSON 标量索引。 + 相比 `Utf8` 兜底列,它的类型不撒谎且可查询。 +2. **JSON 标量索引**建在实际热路径上:`blocks.arguments_json` 的 `$.command`、`$.path`。 + 索引按路径字面量匹配,查询必须用同一路径写法。 +3. **Blob v2 仅用于 `content.payload_blob`**,且 `content` 是唯一使用 blob 的表。 + 不投影即零字节读取。 +4. **排序与索引**:各表按第一列为 `attempt_uid` 的复合序物理排序;`attempt_uid`、 + `content.digest`、`blocks.tool_name` 上建标量索引。 +5. **不使用 Variant**:Lance 明确不实现 Parquet Variant;`parquet-variant` 仍标注 WIP + 且属 Parquet 侧。JSONB 是当前唯一可用的原生二进制 JSON 路径。 +6. **兜底列必须存在于每张表**。198 个键名、四种同版本异构形状、按来源出现的可选字段, + 决定了任何封闭 schema 都会丢数据。 + +--- + +## 查询路径示例 + +```sql +-- triage:只碰 L1,不读一个内容字节 +SELECT a.task_id, a.benchmark, a.model_tag, a.score, an.analyzer +FROM attempts a JOIN analysis an USING (attempt_uid) +WHERE a.correct = false AND an.is_badcase + AND a.benchmark = 'skillsbench'; + +-- 成本分析:只碰 L1 + L2 的窄列 +SELECT model_tag, sum(output_tokens), avg(llm_infer_ms) +FROM attempts a JOIN steps s USING (attempt_uid) +GROUP BY model_tag; + +-- 工具行为:碰 L2,payload 不物化 +SELECT tool_name, count(*), sum(CAST(is_error AS INT)) +FROM blocks +WHERE block_type = 'tool_call' +GROUP BY tool_name; + +-- 命令级下钻:走 JSON 索引 +SELECT attempt_uid, step_ordinal +FROM blocks +WHERE tool_name = 'Bash' + AND json_get_string(arguments_json, 'command') LIKE '%pyomo%'; +``` + +前三个查询完全不接触 L3 / L4。这正是分层的目的。 + +--- + +## 生命周期与 GC + +- **L4 可过期**:`artifacts` 中 `derives_from = 'trajectory'` 的行可按保留期删除, + 仅需级联清理 `content` 中失去引用的 digest。删除后 L1/L2/L3 完整,全部分析查询不受影响。 +- **`content` GC** 是引用计数:live set = `blocks` ∪ `steps` ∪ `analysis` ∪ `artifacts` + ∪ `preferences` ∪ `corpus_files` 中出现的全部 digest。因为 `content` 是所有层共享的, + GC 必须在**所有引用表的同一快照**上计算,否则会误删。 +- **重建**:L1/L2/L3 全部可从 `corpus_files.raw_digest` 重放重建。若不保留原始 JSON, + 则 L2/L3 成为事实源,此时 L4 的删除不可逆——这是一个需要显式配置的取舍。 + +--- + +## 凭证脱敏 + +实测在 `attempts.*.meta.plan` 下发现明文凭证: +`environment.params.secret_key`(10 处)与 +`execution.analysis_params.OnomyAnalyzer.api_key`(2 处)。 + +因此入库管线 **MUST** 在写入前对 `meta_json` 执行键名模式脱敏 +(`secret` / `token` / `api_key` / `password` / `credential` / `authorization`), +将值替换为 `«redacted:»` 形式的占位符,保留可比较性而不保留明文。 +`corpus_files.raw_digest` 指向的原始 JSON 若保留,则该 dataset 必须与 L1–L4 分离 +授权。这是本 RFC 的一条硬约束,而不是建议。 + +--- + +## 预估收益 + +按实测推算: + +| 项 | 原始 | 目标 | +|---|---|---| +| L4 取证层 | ~670MB | ~110MB(CAS + zstd),且离开查询路径 | +| L0–L3 | ~220MB | ~15–20MB(去重 2.2x × 压缩 ~6x) | +| **合计** | **1562MB** | **~20MB 可查询 + ~110MB 冷 blob** | +| triage 查询实际读取 | — | 几百 KB 量级 | + +若判定 L4 可丢(它确实是 L2+L3 的衍生重复品),则总量约 20MB。 + +--- + +## 未决问题 + +1. **字节相同文件的身份**:`attempt_uid` 是否应混入路径?取决于是否存在会产出字节相同 + 的不同逻辑运行的 harness。当前假设不存在。 +2. **step 折叠粒度**:`event_stream` 族一次 assistant + 后继 toolResult 折叠为一 step 是 + 启发式;`compaction` 事件与多 toolResult 的情形需要更明确的规则。 +3. **与 Storyline 的关系**:本布局是否应作为 Storyline 三表的上游语料层,还是应由 + Storyline 增补 attempt / analyzer / artifact 维度后统一?前者引入两套模型,后者会把 + 评测语料的关注点压进互操作枢纽。 +4. **`observation` 四形状的收敛**:统一到 `{content, is_error, tool_call_id}` 会丢失 + 形状 3 的 `tool_names`(复数)语义,目前靠 `unknown_json` 兜底,是否需要一等列待定。 +5. **inline 阈值**:8KB 为估计值,需按实际块大小分布(实测消息平均 665 字节)实测标定。 diff --git a/docs/src/zh/rfcs/0012-pchronicle-find-query-syntax.md b/docs/src/zh/rfcs/0012-pchronicle-find-query-syntax.md new file mode 100644 index 00000000..920f8503 --- /dev/null +++ b/docs/src/zh/rfcs/0012-pchronicle-find-query-syntax.md @@ -0,0 +1,366 @@ +# RFC-0012: pChronicle `find` 查询表达式 + +| Field | Value | +|---|---| +| **Status** | Proposed | +| **Date** | 2026-08-30 | +| **Component** | pChronicle CLI、pChronicle Web Explorer | +| **Related** | [RFC-0001 Storyline](0001-storyline-format.md) · [CLI reference](../pchronicle/reference/cli.md) · [Storyline Lance](../pchronicle/design/storyline-lance.md) | + +--- + +## 摘要 + +本 RFC 定义 `pchronicle find` 的统一检索语法。检索入口只有一个:重复使用 +`--match EXPRESSION`。表达式同时覆盖: + +- Storyline Step 内容的全文检索(FTS,默认使用 Jieba 分词器); +- 按消息角色、推理、观察结果等字段限定的全文检索; +- JSONB 列的 JSONPath 精确值和数值比较; +- `AND`、`OR`、`NOT` 与括号组合。 + +CLI 和 Web Explorer MUST 使用同一个解析器、同一个表达式语义和同一个 FTS/JSONB +执行路径。共享契约是表达式、scope 与 snapshot_id;Web 前端匹配只做高亮与截取。 +这样 CLI 可以作为 Web 搜索的可重复诊断入口。 + +```text +pchronicle find [DATASET] + (--run-id ID|--document-id ID|--session-id ID|--match EXPRESSION) + [--source PATH] [--step-id N] [--match EXPRESSION ...] + [--format auto|table|json] [--max-results N] +``` + +## 动机 + +旧的检索接口将全文检索和 JSONB 检索拆成多个选项,导致以下问题: + +1. 用户必须先判断数据属于 FTS 还是 JSONB,不能在一个查询中表达组合条件; +2. CLI、Web 和 Agent 可能各自实现一套过滤逻辑,结果不一致; +3. `ipython` 等通用词容易命中 system 上下文,缺少字段限定; +4. 仅返回身份字段时,用户无法判断命中的轨迹是否正确; +5. 大量命中项可能生成过深的 SQL 布尔树或过大的输出。 + +本 RFC 将检索定义为一个受限表达式语言,并规定快照、结果预览和资源边界。 + +## 目标与非目标 + +### 目标 + +- 用一套语法表达文本、字段限定、JSONB 和布尔组合。 +- 保持命令行可读、可复制、可安全地嵌入 shell 脚本。 +- 让 Web Explorer 直接复用 CLI 的解析与执行语义。 +- 为每个命中提供有限的 `preview`,支持定位后再做精确 SQL 查询。 +- 在 FTS 不可用、索引错误或结果被截断时显式报告状态。 + +### 非目标 + +- 本 RFC 不定义 SQL 语法;复杂聚合仍使用 `pchronicle query`。 +- 本 RFC 不提供正则表达式、模糊编辑距离或任意用户脚本执行。 +- 本 RFC 不把全文索引当作事实源;Storyline/Events 的存储契约仍由各自 RFC 定义。 +- 本 RFC 不允许用户通过查询表达式修改 Dataset。 + +## 命令级语义 + +### 身份条件 + +`--run-id`、`--document-id`、`--session-id` 是身份条件,分别限制 Run、文档或 +Session。`--step-id` 必须与 `--session-id` 一起使用。`--source` 限制为 Dataset +相对路径,不允许绝对路径、URI 或 `..` 路径段。 + +身份条件可以和 `--match` 同时使用,所有条件使用 AND 连接。没有身份条件时,至少 +需要一个 `--match`。 + +`--match` 可以重复。多个 `--match` 参数始终使用 AND 连接: + +```bash +pchronicle find ./dataset --match "timeout" --match "retry" +``` + +等价于: + +```text +timeout AND retry +``` + +重复参数的 AND 语义不受表达式内部 `OR` 影响。 + +### 快照一致性 + +一次 `find` 调用只使用一个 Snapshot(打开 path 之后写入与读取之间的同步协议)。 +JSON 输出 MUST 包含 `snapshot_id`;stderr 也输出该 ID、返回数量和 `truncated` 状态。 +后续 SQL 或 Web 钻取可以使用该 Snapshot ID 进行结果追溯。 + +## 表达式语法 + +下面的语法是描述性的 EBNF;空白可以出现在 token 之间,字符串中的空白除外。 + +```ebnf +expression = or-expression ; +or-expression = and-expression , { "OR" , and-expression } ; +and-expression = unary-expression , { "AND" , unary-expression } ; +unary-expression = [ "NOT" ] , primary ; +primary = "(" , expression , ")" + | text-predicate + | json-predicate ; + +text-predicate = plain-text | scoped-text ; +plain-text = atom ; +scoped-text = "#" , text-field , "(" , argument , ")" ; + +json-predicate = json-short | json-column ; +json-short = json-path , json-operator , json-value ; +json-column = "#json" , [ "." , identifier ] , "(" , json-path , ")" + , json-operator , json-value ; + +json-path = path-token | quoted-string ; +path-token = "$" , { path-char } ; +path-char = ? any character other than whitespace or a JSON operator ? ; +json-operator = "=" | "!=" | ">" | ">=" | "<" | "<=" ; +json-value = quoted-string | bare-value | number | "true" | "false" | "null" ; +``` + +关键字 `AND`、`OR`、`NOT` 大小写不敏感,但只有在 token 边界上才作为关键字。 +包含空格的普通文本应使用 shell 引号;未包含特殊语法的带空格参数仍作为一个完整 +的全文短语处理,而不是隐式拆成多个参数。 + +### 运算优先级 + +优先级从高到低为: + +1. 括号; +2. `NOT`; +3. `AND`; +4. `OR`。 + +例如: + +```text +#user("timeout") OR #assistant("retry") AND NOT #system("example") +``` + +等价于: + +```text +#user("timeout") OR (#assistant("retry") AND NOT #system("example")) +``` + +需要改变语义时 MUST 使用括号。 + +## 全文检索字段 + +普通文本和 `#content(...)` 使用内容字段集合。其他选择器的含义如下: + +| 选择器 | 语义 | 默认数据范围 | +|---|---|---| +| `#content(text)` | 消息、观察结果和 prompt 的内容集合 | Step | +| `#message(text)` | `message_value` | Step | +| `#user(text)` | `message_value` 且 `source = 'user'` | Step | +| `#assistant(text)` | `message_value` 且 `source = 'agent'` | Step | +| `#system(text)` | prompt/message 且 `source = 'system'` | Step | +| `#reasoning(text)` | `reasoning_content` | Step | +| `#observation(text)` | `observation` | Step | +| `#prompt(text)` | prompt 和消息内容 | Step | +| `#model(text)` | Step 模型名 | Step | +| `#all(text)` | 所有可索引 Step 文本列 | Step | + +`#agent(text)` 是 `#assistant(text)` 的解析别名。`#model_name(text)` 是 +`#model(text)` 的解析别名。 + +普通文本使用 Storyline Step 的 FTS 索引;默认 tokenizer 为 Jieba。FTS 查询结果 +先映射为 `(source_path, document_id, step_id)`,再参与整个表达式的布尔组合。 + +FTS 不可用不等价于零命中。实现 MUST 在 JSON 的 `search.fts_available` 和诊断信息 +中报告不可用原因;只有 FTS 正常执行且没有命中时,才可以返回空结果。 + +## JSONB 检索 + +### 短语法 + +```bash +pchronicle find ./dataset --match '$.tags="important"' +pchronicle find ./dataset --match '$.priority>=2' +``` + +`$.path` 是 JSONPath,必须以 `$` 开始。等值和不等值比较使用 JSON 编码后的值; +范围比较要求右值为数字。 + +短语法不指定列时,按当前查询范围检查所有允许的 JSONB 列: + +- Run 范围:`agent_extra`、`final_metrics`、`extra`、`meta`、`unknown_fields`; +- Step 范围:`metrics`、`extra`。 + +### 列限定语法 + +```bash +pchronicle find ./dataset --match '#json.metrics("$.score")>=0.9' +pchronicle find ./dataset --match '#json.extra("$.tags")="important"' +``` + +`#json.COLUMN("$.path") OP VALUE` 只检查指定 JSONB 列。当前允许的列由查询范围 +决定;指定不可用列 MUST 返回可读的参数错误,而不是静默返回零结果。 + +显式使用 `#json.metrics(...)` 时,即使表达式不包含文本条件,也强制使用 Step +范围。仅包含未限定 JSONB 条件的表达式默认使用 Run 范围;文本与 JSONB 混合时使用 +Step 范围。 + +## 范围解析 + +实现根据表达式确定规范化查询表: + +| 表达式 | 查询范围 | 搜索模式 | +|---|---|---| +| 纯文本 | `steps` | `fts` | +| 纯 JSONB(未指定 Step 列) | `runs` | `json` | +| 纯 `#json.metrics(...)` | `steps` | `json` | +| 文本 + JSONB | `steps` | `fts+json` | +| 无 `--match`,仅身份条件 | 由身份条件决定 | `identity` | + +查询范围必须在结果的 `search.scope` 中公开,避免用户把 Run 级命中误认为 Step 级命中。 +范围是 find 契约的一部分:CLI 与 Web 必须使用同一 scope。规范意图是调用方显式指定 +`--scope runs|steps`(Web 同等控件)。当前实现仍按上表从表达式推断范围;隐式切表不得写成 +产品特性,也不得在 CLI 与 Web 之间使用不同推断规则。 + +## 输出契约 + +### JSON 输出 + +`--format json`(以及非交互 stdout 下的 `--format auto`)返回一个对象: + +```json +{ + "dataset_uri": "./dataset", + "snapshot_id": "snapshot-id", + "query": { + "matches": ["#user(\"timeout\")", "$.priority>=2"], + "expression": "#user(\"timeout\") AND $.priority >= 2" + }, + "search": { + "mode": "fts+json", + "scope": "steps", + "fts_available": true, + "tokenizer": "jieba" + }, + "truncated": false, + "matches": [ + { + "source_path": "runs/storyline.json", + "document_id": "doc-1", + "run_id": "run-1", + "session_id": "session-1", + "step_id": 7, + "step_source": "user", + "effective_kind": "message", + "timestamp": "2026-08-30T00:00:00Z", + "preview": "Please investigate timeout in the worker" + } + ] +} +``` + +每个 `preview` 都是有界的人类可读摘要,不是事实源,也不保证包含完整 JSON。 +调用方应使用 `source_path`、`document_id`、`session_id` 和 `step_id` 做后续精确查询。 + +### Table 输出 + +交互式终端的 `auto` 输出为表格,至少显示: + +- Source、Document ID、Run ID、Session ID; +- Step 范围下的 Step ID、Step Source、Kind、Timestamp; +- 有界 Preview。 + +空结果 MUST 显示 `(0 matches)`。超过 `--max-results` 时 MUST 标记 `(truncated)`, +JSON 同时设置 `truncated: true`。 + +## 资源边界和安全性 + +实现 MUST 保留以下边界: + +- 单个 `--match` 最多 4096 字节; +- `--max-results` 必须大于 0,默认 100; +- `--max-output-bytes` 默认 8 MiB; +- `--timeout` 默认 30 秒; +- FTS 命中映射到 SQL 时使用平衡的布尔树,避免线性嵌套造成栈溢出; +- 所有用户值使用参数化/安全 SQL 字面量编码; +- 查询只读,不允许通过表达式执行 SQL、文件系统访问或函数调用。 + +轨迹中的文本、JSON 和 preview 都是不可信数据,不能被解释为 CLI 指令或系统提示。 + +## CLI、Web 和 Agent 一致性 + +共享契约是 **表达式 + scope + snapshot_id**,不是行形。规范实现提供一个共享的 +`FindExpr` AST: + +1. CLI 的 `--match` 与 Web 的 `q` 交给同一个 `parse_match_expression`,执行同一套 + FTS / JSONB 路径;重复的 CLI `--match` 通过 `combine_match_expressions` 组合为 AND。 +2. 两端报告同一 `search.scope` 与同一 `snapshot_id`。 +3. Web Explorer 可以把 step 命中折叠成 run 行,这是视图,不是第二种查询。 +4. Web 可以多一层**前端匹配**:对后端返回的完整字段用表达式中的文本谓词做高亮和可视截取。 + 前端匹配 MUST NOT 改变命中集合,MUST NOT 在浏览器里再求值 JSONB。 +5. 后端 MUST 返回命中字段的完整归一化文本,不得先截取固定前缀。 +6. Agent 只生成 `--match`,不生成已废弃的 `--fts`、`--jsonb`、`--query` 或兼容别名。 + +输入框、作用域提示和清除按钮只是交互层,不能改变表达式语义。 + +## 示例 + +```bash +# 普通全文检索 +pchronicle find ./dataset --match "ipython" + +# 两个词都必须命中 +pchronicle find ./dataset --match "ipython" --match "task" + +# 限定 system prompt +pchronicle find ./dataset --match '#system("timeout")' + +# OR / NOT 组合 +pchronicle find ./dataset \ + --match '(#user("timeout") OR #assistant("retry")) AND NOT #system("example")' + +# JSONB 精确值和范围 +pchronicle find ./dataset \ + --match '$.tags="important"' \ + --match '#json.metrics("$.score")>=0.9' \ + --format json + +# 先用 find 定位,再用身份条件消除歧义 +pchronicle find ./dataset --match "timeout" --format json +pchronicle find ./dataset --source runs/storyline.json \ + --session-id session-1 --step-id 7 --format json +``` + +## 被拒绝的方案 + +### 分离 `--fts` 和 `--jsonb` + +拒绝。它会把一个逻辑查询拆成两条命令,并迫使 Web 维护另一套接口;统一的 +`--match` 可以在同一 AST 中表达 FTS、JSONB 和布尔组合。 + +### 直接暴露 SQL/JSONPath 全查询 + +拒绝。`find` 的目标是有界定位,不是分析查询;任意 SQL 会带来资源、安全和跨后端 +兼容问题。需要投影、聚合或复杂 JOIN 时使用 `query`。 + +### 为旧参数保留多个兼容别名 + +拒绝。`--match` 是唯一检索入口,避免 Agent 和用户在不同别名之间漂移。语义升级应 +通过 RFC 和明确的错误信息完成。 + +## 兼容性与演进 + +- 当前语法版本随 pChronicle CLI 版本发布,不在数据文件中写入查询版本。 +- 新增字段选择器或 JSONB 列时,必须保持旧表达式的语义不变。 +- 新增操作符、函数或隐式语法需要新的 RFC 评审;不得把 SQL 语法悄悄引入 `find`。 +- 解析错误、不可用索引和资源耗尽必须保持可区分,便于 Web、Agent 和自动化诊断。 + +## 实施状态 + +当前实现已覆盖本 RFC 的核心范围:统一 `--match`、字段选择器、布尔运算、JSONB +比较、Jieba FTS 元数据、快照输出、bounded preview,以及 CLI/Web 共用检索路径。 + +后续工作: + +1. 为更多字段选择器补充索引可用性和命中预览测试; +2. 在 Web 输入框中展示当前表达式解析状态和查询范围; +3. 为复杂布尔表达式提供结构化命中片段,而不只高亮单个文本参数; +4. 评估在 JSON 输出中增加命中字段和命中 Step 数量。 diff --git a/docs/src/zh/rfcs/0013-pchronicle-warehouse-catalog.md b/docs/src/zh/rfcs/0013-pchronicle-warehouse-catalog.md new file mode 100644 index 00000000..6333e0c8 --- /dev/null +++ b/docs/src/zh/rfcs/0013-pchronicle-warehouse-catalog.md @@ -0,0 +1,306 @@ +# RFC-0013: pChronicle path Directory + +| Field | Value | +|---|---| +| **Status** | Proposed | +| **Date** | 2026-08-30 | +| **Component** | pChronicle CLI、`pchronicle serve`、pChronicle Web | +| **Related** | [RFC-0003 Ownership](0003-pchronicle-ownership.md) · [Warehouse 指南](../pchronicle/guides/serve.md) · [CLI 参考](../pchronicle/reference/cli.md) · [架构](../pchronicle/design/architecture.md) | + +--- + +## 摘要 + +本 RFC 定义 pChronicle 平台部署时打开 **path** 的一种方式:**Directory**(名字 → path + ACL + 换票)。 + +Dataset 身份始终是 path(本机路径或 `s3://` / `az://` / `gs://` URI)。Directory 不是第三种 Dataset,也不替代 Snapshot。它只决定调用方可以解析到哪些 path;换票后的 `uri` 才是引擎打开的 Dataset。 + +CLI 标志、配置文件和 HTTP 路径为兼容性仍使用 `catalog` 一词(`--catalog-config`、`catalog.toml`、`catalog://`、`/api/v1/catalog/datasets`)。产品与 RFC 口径称 Directory。 + +规范实现挂在现有 `pchronicle serve --catalog-config` 上,不引入独立 `catalog serve` 进程,也不把 listener 从 loopback 打开。 + +- **CLI**:`@team` 解析为 `catalog://127.0.0.1:PORT` Directory locator;`@team/prod` 换票后客户端打开票里的 path(透传后端密钥)。 +- **Web**:用户钥存在浏览器 `localStorage`;数据面查询在 **新进程 worker** 中执行。父进程负责鉴权和换票,不拿全量后端密钥跑 DataFusion。 + +```text +pchronicle serve catalog issue --catalog-config catalog.toml alice +pchronicle serve catalog grant --catalog-config catalog.toml alice prod evals +pchronicle serve --catalog-config catalog.toml --listen 127.0.0.1:8081 +pchronicle alias add team catalog://127.0.0.1:8081 --ak USER_AK --sk USER_SK +pchronicle query @team/prod 'SELECT 1' +``` + +## 动机 + +本机路径和静态 Warehouse mount 假设操作者已经能看见全部 Dataset。把对象存储上的多个评测库交给一组人使用时,出现三个缺口: + +1. **发现与授权混在一起**。用户需要一份目录,列出自己可以打开的 library 名,而不是把所有 bucket URI 写进每人的 `config.toml`。 +2. **后端密钥不能进用户配置**。对象存储 ak/sk 属于存储账户;用户钥只用于 Directory 鉴权。把后端钥写入本机 alias 会扩散到每台笔记本,也无法按人裁剪可见库。 +3. **Web 与 CLI 的数据面不同**。CLI 可以在换票后自己打开 `s3://`。Web 的查询跑在 serve 进程里;若父进程加载全部 library 的后端密钥并执行 SQL,一次鉴权绕过就会看到未授权库。 + +本 RFC 把 Directory 定义为 **目录 + ACL + 换票**,把存储访问留给已有 `open(path)`,并把 Web 数据面隔离到一次性 worker。 + +## 目标与非目标 + +### 目标 + +- 用一份 `catalog.toml` 描述 users、datasets 和 grants。 +- 用 CLI 签发用户钥并改写 ACL:`pchronicle serve catalog issue|grant|revoke` 不启动 HTTP。 +- 让 `@name/library` 解析为一条 path(换票后的 `uri`);引擎随后只打开该 path。 +- 换票后 CLI 自己访问存储;后端密钥只出现在票和 worker stdin 中,不写入用户 `config.toml`。 +- Web 用用户钥换授权范围,查询只看到该用户的 mounts。 +- 保持 Warehouse 为 loopback-only 本地检查面,而不是公网多租户服务。 + +### 非目标 + +- STS、临时凭证轮换、或把用户钥映射成短时 AWS session。 +- 热加载 `catalog.toml`;改配置 MUST 重启 serve。 +- 在运行中的 Warehouse 上提供 HTTP 签发接口。 +- 把 listener bind 到非环回地址,或提供独立 `catalog serve` 二进制。 +- 在已运行的 Tokio runtime 上 `fork(2)`(未定义行为)。 +- 把后端对象存储密钥写入本机 alias 配置。 +- 改变 Snapshot 协议、SQL schema 或 Gateway/Control 协议。 + +本 RFC 的 Directory 与打开 path 之后的 **Snapshot**(见 [Snapshot 设计](../pchronicle/design/catalog.md))不是同一对象。Directory 列出授权 path;Snapshot 钉住一条已打开 path 上的 Source 成员与版本。 + +## 角色与信任边界 + +| 角色 | 持有 | 用途 | +|---|---|---| +| 存储账户 | 后端 `access_key` / `secret_key`,以及可选 endpoint、region | 打开 `s3://` library | +| Directory 用户 | 用户 `access_key` / `secret_key` | 列出/领取被授权 library 的票 | +| 本机 CLI | 用户钥(存在 alias 配置) | 换票后把后端钥注入进程环境并打开票中的 path | +| 浏览器 | 用户钥(`localStorage`) | 作为请求头发给 loopback serve | +| serve 父进程 | 完整 `catalog.toml` | 鉴权、返回票、spawn worker;不把后端钥写入 AWS 环境 | +| query worker | 该用户被授权 library 的票 | 一次性执行 Warehouse 数据面请求 | + +ACL 是 **发现与授权** 边界,不是对象存储的强制隔离。持有后端密钥或能猜测 URI 的调用方,仍可能绕过 Directory 直接访问存储。Directory 不替代 bucket policy。 + +## 进程模型 + +Directory 挂在现有 Warehouse listener 上。未传 `--catalog-config` 时,`pchronicle serve` 行为不变:静态 mount、无用户鉴权。 + +```text +浏览器 / CLI + → loopback Warehouse + ├─ GET /health + ├─ GET /api/v1/catalog/datasets[/{name}] 父进程:鉴权 + 目录/票 + ├─ 静态 UI + └─ 其余 /api/* 父进程鉴权后 spawn worker + → pchronicle serve --catalog-query-worker + stdin: mounts + HTTP 请求 + stdout: status / content-type / body + 退出 +``` + +约束: + +1. Listener MUST 为 loopback。本 RFC 不把 catalog 头当作公网认证边界。 +2. 父进程 MUST NOT 打开 `catalog.toml` 中的 datasets。父进程使用空 mount 的 front-only Warehouse。 +3. Worker MUST 由 `Command` 启动新进程,MUST NOT `fork(2)` 已运行的 Tokio runtime。 +4. Worker MUST NOT 监听端口、MUST NOT 读取 `catalog.toml`、MUST NOT 读取用户钥。它只消费 stdin 中过滤后的 mounts 和原始请求。 +5. Worker 继承父进程环境(证书、`PATH` 等),但父进程 MUST NOT 预先把 catalog 后端密钥写入 `AWS_*`。Worker 在打开存储前为自己设置该用户票中的后端环境。 +6. 每个 Dataset 可以使用自己的 endpoint、region 和后端 ak/sk;worker 必须按 Dataset ticket 设置对应存储环境。 +7. 隐藏 flag `--catalog-query-worker` MUST NOT 出现在用户可见的 `serve --help` 中。 + +Worker 超时后父进程 MUST 返回 `unavailable`,不得把 stdin 中的密钥写进日志。 + +## 配置 + +`catalog.toml` 只管理用户、Dataset 和授权关系。它是唯一事实来源;运行时服务配置仍由 `pchronicle serve` 参数提供。配置文件不存在时,Catalog 管理命令会创建一个空 Catalog。 + +```toml +[meta] +version = 1 +revision = 1 +name = "team-catalog" + +[users.alice] +display_name = "Alice" +status = "active" +access_key = "USER_AK" +secret_key = "USER_SK" + +[datasets.prod] +display_name = "Production trajectories" +description = "Production agent trajectories" +status = "active" +uri = "s3://bucket/prod" +endpoint = "http://127.0.0.1:9000" +region = "us-west-2" +access_key = "BACKEND_AK" +secret_key = "BACKEND_SK" + +[[grants]] +user = "alice" +dataset = "prod" +permissions = ["read", "query", "analyze"] +``` + +规则: + +- `meta.version` 必须为支持的配置版本;每次成功写入 MUST 递增 `meta.revision`。 +- 用户名和 Dataset 名必须是小写 `[A-Za-z_][A-Za-z0-9_]*`。 +- `users.*.access_key` 必须全局唯一;第一版允许明文 `secret_key`。 +- Dataset 的 `uri` 必须是有效的本地、`s3://`、`az://`、`gs://` 或测试存储 URI。 +- 对象存储 Dataset 可以设置 `endpoint`、`region`、`access_key` 和 `secret_key`;本地 Dataset 不需要这些字段。 +- `grants.user` 和 `grants.dataset` 必须分别引用已存在的用户和 Dataset。 +- 同一用户和 Dataset 的 grant 不得重复;权限只能来自 `read`、`query`、`analyze`、`write`、`admin`。 +- 配置文件大小必须有上界;解析或校验失败时服务拒绝启动。 +- TOML 是权威配置,后续 SQLite/Postgres 只能作为索引和派生投影。 + +## CLI 管理 + +Catalog 管理命令只修改配置文件,不启动 HTTP listener。文件不存在时,命令创建父目录和空配置文件。 + +```text +pchronicle serve catalog user create --catalog-config FILE NAME +pchronicle serve catalog user list --catalog-config FILE +pchronicle serve catalog user remove --catalog-config FILE NAME + +pchronicle serve catalog dataset create --catalog-config FILE NAME URI [OPTIONS] +pchronicle serve catalog dataset list --catalog-config FILE +pchronicle serve catalog dataset show --catalog-config FILE NAME +pchronicle serve catalog dataset remove --catalog-config FILE NAME + +pchronicle serve catalog grant --catalog-config FILE USER DATASET --permission PERMISSION... +pchronicle serve catalog revoke --catalog-config FILE USER DATASET --permission PERMISSION... +pchronicle serve catalog grants --catalog-config FILE +``` + +`user create` 生成用户 AK/SK;secret 只在本次 stdout 输出。`dataset create` 只登记 Dataset,不创建或删除后端数据。`grant` 和 `revoke` 修改独立的 `[[grants]]` 授权记录。所有写操作 MUST 原子替换文件,失败时保留原文件。 + +## HTTP + +Directory 路由与 Warehouse 共用 `/api` 与 `/api/v1` 前缀。鉴权头: + +| Header | 含义 | +|---|---| +| `x-pchronicle-access-key` | 用户 access key | +| `x-pchronicle-secret-key` | 用户 secret key | + +缺失、空白或密钥不匹配 MUST 返回 `401`,且 MUST NOT 区分“用户不存在”与“密钥错误”。 + +未授权的 library 名与不存在的 library 名 MUST 都返回 `404`。 + +| 路由 | 父进程 | 响应 | +|---|---|---| +| `GET /api/v1/catalog/datasets` | 是 | 该用户可见 library 的 `name`、`uri`、可选 `endpoint`/`region`;**不含**后端密钥 | +| `GET /api/v1/catalog/datasets/{name}` | 是 | 授权时返回完整票,含后端 `access_key` / `secret_key` | +| `GET /api/health` | 是 | 无鉴权 | +| 静态 UI | 是 | 无鉴权 | +| 其余 `/api/*`(含 `GET /api/catalog`,返回当前 Snapshot) | 否,转发 worker | 先鉴权,再按用户 mounts 执行 | + +错误 JSON 沿用 Warehouse 的 `code`、`message`、`request_id`。日志可以包含用户段名、library 名和 `request_id`,MUST NOT 打印用户钥或后端钥。 + +`GET /api/v1/catalog/datasets/{name}` 是 CLI 换票接口。拿到票的客户端随后直接打开 `uri`(Dataset path),不再把查询代理回 Directory。 + +## CLI alias + +`catalog://` 是 alias **类型**,不是 DatasetLocation 可解析的存储 URI。换票成功后 Dataset 身份是票里的 path,不是 `catalog://…` 本身。 + +```bash +pchronicle alias add team catalog://127.0.0.1:8081 --ak USER_AK --sk USER_SK +``` + +规范化规则: + +- scheme MUST 为 `catalog`; +- host MUST 是环回 IP(如 `127.0.0.1`),MUST 带端口; +- MUST NOT 包含 userinfo、path、query 或 fragment; +- MUST NOT 接受 `--endpoint` / `--region`(那是对象存储参数,来自票而不是 alias)。 + +解析按 alias **类型** 分派,而不是把所有 `@name/suffix` 都做路径拼接: + +| 引用 | catalog alias | 普通 URI alias | +|---|---|---| +| `@team` | 错误:Directory locator 不是 path | 解析为 alias 根 URI | +| `@team/prod` | 向 Directory 领取 library `prod` 的票,打开票中 path | 根 URI 再拼接路径 `prod` | +| `@team/prod/more` | 先领 `prod`,再把 `more` 拼到票的 path 上 | 根 URI 拼接 `prod/more` | + +用户 `--ak/--sk` 存入本机 alias 凭据表,与 S3 alias 相同的隔离方式:不出现在 `alias list` / `alias get-url` 的 URI 里。后端密钥 MUST NOT 写入该文件。 + +换到的票缓存在 CLI 进程内(`thread_local`),按 catalog URL、用户 access key 和 library 名索引。长生命周期的 `serve` 进程不使用这份 CLI 缓存;Web 每次请求重新鉴权。进程退出即丢弃缓存。 + +## Web + +Settings(左侧 **Keys**)保存 catalog 用户钥到 `localStorage`: + +- `pchronicle.catalog.access_key` +- `pchronicle.catalog.secret_key` + +浏览器把这两项作为上述 HTTP 头附加到 **发往当前 pChronicle serve 的** `/api/` 请求。这与 Assistant 的 Browser BYOK 相反:Assistant 钥只发给模型端点,catalog 钥必须到达 serve 才能鉴权。 + +未配置用户钥时,Web MUST NOT 假装本地 Warehouse 已授权;catalog 模式下无头请求在数据面得到 `401`。无 `--catalog-config` 的普通 serve 不要求这些头。 + +查询在 worker 中执行。浏览器不直接持有后端对象存储密钥。 + +## 数据面隔离 + +父进程在数据面中间件中: + +1. 校验用户钥; +2. 过滤该用户的 library 票; +3. 把 HTTP method、path、query、body 和 mounts 写成 JSON job; +4. spawn 同源二进制 `serve --catalog-query-worker`; +5. 把 stdout 信封还原为 HTTP 响应。 + +Worker 用票构造 `ChronicleServerConfig` mounts,执行与普通 Warehouse 相同的只读路由,然后退出。 + +不得把未授权 library 的票放进 job。空授权集合 MUST 表现为 `404`,而不是启动一个空 Warehouse。 + +## 被拒绝的方案 + +### 把签发做成 Warehouse HTTP mint + +拒绝。Catalog 头不是公网认证边界;loopback 上无认证的 mint 会把用户钥发给任何能打到端口的本机进程。签发入口是改写 `catalog.toml` 的 CLI。 + +### 独立 `catalog serve` 进程 + +拒绝。第二套 listener、端口和生命周期会与 Warehouse 文档分叉。Catalog 目录流量很小,适合挂在现有 `pchronicle serve` 上。 + +### 父进程打开全部 datasets 再按用户过滤 SQL + +拒绝。DataFusion 与对象存储客户端一旦持有全量后端密钥和 mount,过滤错误就会越权。Web 查询必须在只含授权 mounts 的进程里执行。 + +### `fork(2)` 已运行的 Tokio 以“降权” + +拒绝。在多线程 runtime 上 fork 是未定义行为。使用 `Command` 新进程。 + +### STS / 短时会话券 + +拒绝。当前目标是本机协作目录,不是云上身份联邦。透传后端密钥给已授权客户端,配置更简单,也与现有 S3 alias 注入 `AWS_*` 的方式一致。 + +### 把 catalog 做成普通路径拼接 alias + +拒绝。`@prod/evals` 对 `s3://bucket` 是路径拼接;对 Directory locator 则是“名字 + library 名”,换票后打开票中 path。混用会让 `@team/prod` 被拼成非法 URI `catalog://127.0.0.1:8081/prod`。 + +### 非环回 bind + 把 catalog 头当公网认证 + +拒绝。Warehouse 仍是本机检查面。打开 `0.0.0.0` 需要独立的认证、TLS 与多租户威胁模型,超出本 RFC。 + +## 兼容性与演进 + +- 无 `--catalog-config` 时,现有 Dataset 引用、普通 alias 的 `@name/suffix` 路径拼接、以及无鉴权 loopback Warehouse MUST 保持不变。 +- `catalog://` MUST NOT 成为 `DatasetLocation` 可打开的存储 scheme;只有 alias 解析器认识它。 +- 新增 library 字段、鉴权头或 worker 协议属于破坏性变更,需要修订本 RFC。 +- 未来的 STS 或热加载可以作为后续 RFC,不得 silently 改变“透传后端密钥 / 重启生效”的语义。 + +本 RFC 修正架构文档中“loopback Warehouse 完全没有 authentication”的表述:在 `--catalog-config` 下,数据面和 Directory 路由使用用户钥请求头;它仍不是公网多租户服务。 + +## 实施状态 + +当前实现覆盖本 RFC 的核心范围: + +- `catalog.toml` 解析与启动期校验; +- `pchronicle serve catalog issue|grant|revoke` 改写 ACL(签发不授权,sk 只打一次 stdout); +- `GET /api/v1/catalog/datasets` 与 `/{name}`; +- `--catalog-config` front-only 父进程与 `--catalog-query-worker`; +- `catalog://` alias、`@team/prod` 换票与进程内票缓存; +- Web `localStorage` 用户钥与数据面请求头。 + +后续工作: + +1. 覆盖真实 worker 子进程的集成测试(环境中不得出现未授权 library 的密钥); +2. 评估是否为本地路径 library 提供与 S3 相同的显式审计日志字段; +3. `issue --rotate`:轮换已有用户密钥(当前重名签发直接拒绝)。 diff --git a/docs/src/zh/rfcs/0014-compact-jsonl.md b/docs/src/zh/rfcs/0014-compact-jsonl.md new file mode 100644 index 00000000..5119d281 --- /dev/null +++ b/docs/src/zh/rfcs/0014-compact-jsonl.md @@ -0,0 +1,218 @@ +# RFC-0014: Compact JSONL Lance 存储格式 + +| Field | Value | +|---|---| +| **Status** | Accepted | +| **Format name** | `compact-jsonl/v1` | +| **Date** | 2026-09-04 | +| **Component** | `persisting-pchronicle`、`pchronicle` CLI | +| **Implements** | `crates/persisting-pchronicle/src/store/compact_jsonl.rs` | +| **Related** | [RFC-0003 pChronicle ownership](0003-pchronicle-ownership.md) · [RFC-0010 Agent corpus Lance layout](0010-agent-corpus-lance-layout.md) | + +--- + +## 摘要 + +Compact JSONL 把一个文件或目录树中的 JSONL 记录写入一个 Lance dataset,同时保留每条 +记录的来源文件、可查询 JSONB、用户选择的投影列和逐字节导出所需的数据。它不把输入转换成 +Storyline,也不推断轨迹语义。 + +本文使用 RFC 2119 的 **MUST**、**MUST NOT**、**SHOULD** 与 **MAY** 表示规范要求。 + +## 目标与非目标 + +目标: + +- 一个输入 JSON object 对应一行 Lance 数据; +- `id`、`timestamp`、`filename` 和 `data` 构成稳定的最小 schema; +- 用户可用 `--column NAME=JSON_PATH` 指定 `id`、`timestamp` 或附加 JSONB 列; +- import、sync 和 export 支持完整目录,并逐字节恢复所有合法输入文件; +- 超过阈值的原始记录可放入内容寻址的 offload 对象; +- schema 可被独立 reader 识别和拒绝,而不依赖目录名。 + +非目标: + +- 识别 ATIF、ACTF、Codex、Claude Code 或 Storyline 语义; +- 把任意 JSONPath 标准完整实现; +- 对 `timestamp` 的单位、时区或业务含义作推断; +- 在 v1 中支持远端对象存储、append 或行级增量 sync。 + +## 术语 + +- **input root**:import/sync 指定的文件或目录。 +- **record**:JSONL 中一行 JSON object。 +- **source filename**:record 所在文件相对于 input root 的 UTF-8 路径。 +- **mapping**:列名到受限 JSON path 的映射。 +- **raw record**:record 的全部原始字节,包括原有的 `LF` 或 `CRLF`;最后一行没有换行时 + 也保持没有换行。 +- **offload object**:dataset 下由 BLAKE3-256 key 标识的原始记录文件。 + +## 输入语法 + +### 文件集合 + +显式文件输入 MUST 是扩展名大小写不敏感的 `.jsonl` 普通文件。目录输入 MUST 递归选择 +`.jsonl` 普通文件,并 MUST 忽略符号链接和其他扩展名。实现 MUST 按规范化相对文件名的 +字节序处理文件;单个文件内部 MUST 按原始行顺序处理。 + +每个被选择的文件 MUST 至少包含一条 record。每一物理行 MUST: + +1. 不是空行或纯空白行; +2. 是 UTF-8 JSON; +3. 顶层值是 JSON object; +4. 包含可映射为非空标量的 `id` 和 `timestamp`。 + +任一条件不满足时,整个 import/sync MUST 失败,不得发布部分 dataset。 + +### JSON path 子集 + +Compact JSONL v1 不声称实现通用 JSONPath。它只接受以下语法: + +```abnf +path = "$" / "$" 1*(member [index]) +member = "." identifier +identifier = (ALPHA / "_") *(ALPHA / DIGIT / "_") +index = "[" 1*DIGIT "]" +``` + +示例:`$`、`$.id`、`$.user.id`、`$.messages[0].role`。 + +不支持 wildcard、slice、filter、递归下降、quoted member、负数 index 或一段中的多个 index。 +映射缺失时,附加列写 Arrow null;`id` 或 `timestamp` 映射缺失时必须拒绝该 record。 + +### 列映射 + +默认映射为: + +```text +id=$.id +timestamp=$.timestamp +``` + +`--column id=PATH` 和 `--column timestamp=PATH` 覆盖默认映射,但不增加重复物理列。其他 +`--column NAME=PATH` 增加一个 nullable JSONB 列。 + +`NAME` MUST 符合上述 `identifier`。映射名 MUST 唯一。`filename`、`data`、`_raw_` 和 +`_offload_` 是保留名,MUST NOT 用作用户映射名。 + +`id` 和 `timestamp` 的来源值 MUST 是 JSON string 或 number。string 原样写入;number 使用 +JSON 规范表示写为 UTF-8。null、boolean、array、object 与空 string 均无效。dataset 内的 +`id` MUST 唯一。 + +## Lance 物理 schema + +Lance schema metadata MUST 包含: + +| Key | Value | +|---|---| +| `pchronicle.format` | `compact-jsonl/v1` | +| `pchronicle.columns` | `CompactJsonlColumn[]` 的 JSON 编码;包括 `id`/`timestamp` 覆盖 | + +列顺序和类型为: + +| Ordinal | 列 | Arrow/Lance 类型 | Nullable | 语义 | +|---:|---|---|---|---| +| 0 | `id` | `Utf8` | no | record 的稳定唯一 ID | +| 1 | `timestamp` | `Utf8` | no | 来源时间戳的无损标量文本 | +| 2 | `filename` | `Utf8` | no | `/` 分隔的 source filename | +| 3 | `data` | `lance.json` / JSONB | no | 未 offload 时为完整 record;offload 时为 JSON null | +| 4… | 用户附加列 | `lance.json` / JSONB | yes | path 命中的 JSON value | +| N-1 | `_offload_` | `lance.json` / JSONB | yes | offload descriptor | +| N | `_raw_` | `LargeBinary` | yes | 未 offload 的 raw record | + +JSON null 是非 null JSONB cell,不等于 Arrow null。`data` 因此始终是非 nullable JSONB。 + +每行 MUST 恰好满足以下一个状态: + +1. inline:`_raw_` 非 null,`_offload_` 为 Arrow null,`data` 是完整 record; +2. offloaded:`_raw_` 为 Arrow null,`_offload_` 非 null,`data` 是 JSON null。 + +reader 遇到其他组合 MUST 拒绝导出。 + +## Offload + +`offload_threshold = 0` 禁用 offload。否则 raw record 长度大于或等于阈值时 MUST offload。 + +descriptor 的 JSONB schema 在实现中包含 `path` 与 `key` 两个字段。 + +- `key` MUST 等于 raw record 的 BLAKE3-256 hex digest; +- object MUST 位于 `dataset/path/key`; +- 相同 key MUST 内容相同,可在多行间共享; +- import 发现已有 key 但内容不同 MUST 失败; +- export MUST 重新计算 digest,不匹配时 MUST 失败; +- reader MUST 拒绝绝对 `path` 或包含 `..` 的 `path`。 + +`id`、`timestamp`、`filename` 与用户附加列始终 inline,因此不读取 offload object 也可执行 +这些列上的过滤和聚合。 + +## Import + +```text +pchronicle import \ + --from ./jsonl-root \ + --to ./records.lance \ + --output-format compact-jsonl \ + --column id=$.event.id \ + --column timestamp=$.event.time \ + --column model=$.payload.model +``` + +`--input-format compact-jsonl` 与 `--output-format compact-jsonl` 任一均选择本格式。 + +- create MUST 拒绝已存在的目标; +- replace MUST 使用既有 `--yes` 确认规则; +- append MUST 被拒绝; +- 本地 CLI 发布 MUST 通过同父目录 staging 后原子替换; +- API `CompactJsonlStore::import_path` 表示完整快照写入,不提供 append 语义。 + +## Sync + +```text +pchronicle sync \ + --from ./jsonl-root \ + --to ./warehouse-copy \ + --convert ./records.lance \ + --input-format compact-jsonl \ + --column id=$.event.id \ + --column timestamp=$.event.time +``` + +v1 sync 是 snapshot sync。每批变化 MUST 重新扫描完整 input root,并用一个完整的新 compact +snapshot 替换 `--convert`。创建、修改和删除源文件都必须反映到下一快照。v1 不承诺行级增量 +更新。 + +## Export + +```text +pchronicle export \ + --from ./records.lance \ + --to ./restored \ + --output-format compact-jsonl +``` + +`export` MUST: + +1. 验证 `pchronicle.format=compact-jsonl/v1`; +2. 验证 `filename` 是相对路径且不含 `..`; +3. 按 Lance 物理行序,将每行写回 `filename`; +4. inline 行写 `_raw_`,offloaded 行验证并写 offload object; +5. 不添加、删除或规范化任何字节,包括空格、JSON key 顺序、数字表示和行结束符; +6. 默认拒绝已存在的输出,只有 `--overwrite` 可替换它; +7. 不支持 `--source`、ID filter 或 `--where`,因为过滤会破坏目录的无损镜像语义。 + +## 错误与安全边界 + +以下情况 MUST fail closed:格式 metadata 缺失或版本未知、schema 缺列或列类型错误、无效 +JSON、无效 mapping、重复 ID、缺少必填标量、路径逃逸、offload 缺失或 digest 不匹配。 + +import/export 不跟随源目录中的符号链接。export 在创建任何文件前 SHOULD 验证 schema;每个 +目标 filename 与 offload path MUST 在拼接前完成路径逃逸检查。 + +## 兼容性 + +reader MUST 只接受它明确支持的 `pchronicle.format`。v1 增加 nullable 用户列不改变基础列 +语义;修改基础列类型、offload descriptor、逐字节恢复规则或 JSON path 语法均需要新的格式 +版本。 + +Compact JSONL 是存储格式,不是 `DocumentFormat` trajectory codec。公共 Rust API 从 +`persisting_pchronicle::storage` 暴露,具体实现归属 `store/compact_jsonl.rs`。 diff --git a/docs/src/rfcs/index.zh.md b/docs/src/zh/rfcs/index.md similarity index 100% rename from docs/src/rfcs/index.zh.md rename to docs/src/zh/rfcs/index.md diff --git a/docs/src/system-design/architecture.zh.md b/docs/src/zh/system-design/architecture.md similarity index 82% rename from docs/src/system-design/architecture.zh.md rename to docs/src/zh/system-design/architecture.md index ee4c9f05..c7996682 100644 --- a/docs/src/system-design/architecture.zh.md +++ b/docs/src/zh/system-design/architecture.md @@ -11,12 +11,10 @@ pChronicle Design,命令属于各产品 Reference。 | --- | --- | --- | | `persisting-events` 契约 | 存储无关的 `EventRecord` identity/envelope 与可选的版本化 pChronicle control 协议 | 物理 row、存储引擎、查询或 projection | | pVisor | 一个 Run、Attempt、执行环境、capability admission、Effect 与运行时 Evidence | 多 Run 调度或持久历史查询 | -| pPilot | 多 Run planning、有界执行、lease、重试与恢复、reconciliation、结果收集及 task-to-Run mapping | Agent reasoning、Provider enforcement 或轨迹格式与存储 | | pChronicle | Agent 轨迹存储引擎:path 身份、Snapshot、canonical event、projection、查询与交换 | 启动、调度或控制 Run | | Runtime Provider | 一种物理执行机制 | 逻辑 Run identity 或产品策略 | -Gateway、OverlayFS 和 OverlayNet 是 pVisor 运行时机制,不构成独立控制面。pPilot 扩展 -pVisor 的 Run 模型,仍位于 pVisor 产品路径中。 +Gateway、OverlayFS 和 OverlayNet 是 pVisor 运行时机制,不构成独立控制面。 ## 运行位置与平台边界 @@ -46,7 +44,7 @@ Pinned external Sources │ └─> normalized Dataset views ``` -pPilot 是受治理执行路径上可选的多 Run 编排器。pVisor 可以用 staged Effect 与私有、带版本的 +pVisor 可以用 staged Effect 与私有、带版本的 Run Bundle 及 terminal RunResult 完成独立闭环。配置 capture 并不是 pVisor 运行时前置条件。 外部文件与 Storyline Source 会被直接固定版本并规范化;它们既不经过 pVisor,也不会变成 canonical runtime event,因此不会获得 pVisor 执行保证。 @@ -97,34 +95,6 @@ enforce 时,在 workload 执行前失败;可选降级必须明确写入 Run lifecycle fact 与其中可用的 Evidence。Artifact reference、lineage、staged filesystem Effect、 AgentCtl/network/resource Evidence 和完整 Run Bundle 仍留在本地,除非由单独 adapter 搬运。 -## 多 Run 路径 - -```text -Manifest or task stream - → pPilot planner - → stable task_id and run_id - → bounded RunFuture set - → pVisor placement and Attempts - → pPilot checkpoint and reconciliation - → terminal results and task-to-Run mapping -``` - -pPilot 调度 Run future,而不是 Agent conversation。它持久保存: - -```text -job_id → task_id → run_id → attempt_id / lease_epoch → terminal result -``` - -系统不承诺物理执行 exactly once。Lease fencing、稳定 identity、幂等 event ingestion 和 -终态 compare-and-swap 的目标是 at-least-once Attempt 与一个可见 Run 结果。 - -使用 `run --sink` 时,默认路径会写入配置的结果 journal,并让 pChronicle control 子进程 -保存所选 coordination record。启用 `traj-sink` 构建并传入 `--traj` 时,pPilot 只额外发出 -终态 `ppilot.result` 或 `ppilot.failure` record;它不会捕获通用 Run 轨迹。Delegated pVisor -Run 不会获得 Chronicle capture 配置。在所有模式中,编排决策与 task-to-Run mapping 仍归 -pPilot 所有。命令与 resume 行为见 [pPilot CLI](../ppilot/reference/cli.md) 与 -[编排设计](../ppilot/design/orchestration.md)。 - ## Dataset 路径 Canonical runtime writer 与固定版本的外部 Source 是相互独立的 Source 路径;它们只在 @@ -150,7 +120,6 @@ Source 的全局事务。固定外部文件不会把它转换为 canonical runti | 外部文件或 imported Source | 已发现的内容、固定的 Source version、规范化表示,以及在已实现位置记录的 conversion lineage | 外部 task manifest 的完整性,或不存在未报告轨迹 | | Gateway capture | 通过所配置 Gateway 路径观察到并持久发布的 request 与 response | 不存在绕过 Gateway 的流量 | | pVisor Run | Run/Attempt identity、已记录终态事实、已安装机制、观察到的 Effect 与 Provider 特定 Evidence | 所选 Provider 未提供的 enforcement | -| pPilot job | 所选模式支持的持久 task/Run mapping、重试与 lease 历史,以及终态结果行为 | 物理 exactly-once execution | Ingestion 保留这些边界。规范化表示或 Snapshot 不会升级 Source 提供的 Evidence。 @@ -165,11 +134,9 @@ Sidecar 标志与模式名见 [pVisor CLI](../pvisor/reference/cli.md) 与 | 故障 | Owner | 必需行为 | | --- | --- | --- | | Attempt 退出或 Provider 消失 | pVisor | finalise Evidence;暴露失败或创建 fenced replacement Attempt | -| Worker lease 过期 | pPilot | 阻止 stale terminal publication;reconcile 期望与实际状态 | | sidecar append queue 饱和或关闭 | pVisor/Gateway producer | 提交前明确拒绝并报告失败;不得声称已经 durable | | append 连接或 ACK 丢失 | producer 与 pChronicle writer | 由于写入可能已经提交,保留 unknown 状态;不得按“明确拒绝”复用序号 | | 历史发布冲突 | pChronicle writer | 保留已发布 Snapshot;按 writer contract 报错或重试 | -| 控制面重启 | pPilot | reconcile checkpoint、活跃 Attempt 与终态历史事实 | | 视图生成失败 | pChronicle | 保持 canonical fact 可读;重建派生视图 | 恢复不能把不确定性升级为成功。缺失终态事实、丢失 callback、未 enforce 的 capability 都必须 @@ -178,8 +145,7 @@ Sidecar 标志与模式名见 [pVisor CLI](../pvisor/reference/cli.md) 与 ## 安全与 Evidence 链 安全性按 capability 维度报告。pVisor 记录请求策略、实际机制、Provider identity、 -enforcement 结果与观察到的 Effect;pPilot 在 placement 间保存 authority generation 和 -lease history。配置后的 pChronicle capture 会持久保存 Gateway 轨迹 event、pVisor lifecycle +enforcement 结果与观察到的 Effect。配置后的 pChronicle capture 会持久保存 Gateway 轨迹 event、pVisor lifecycle record,以及这些 event 实际携带的 Evidence。完整 Artifact、lineage、filesystem Effect、 AgentCtl/network/resource Evidence 和 Run Bundle 仍留在本地,除非由单独 publisher 或 adapter 搬运。 @@ -210,7 +176,6 @@ Evidence 层级见[安全与 Evidence](security-evidence.md),可迁移要求 | 逻辑运行事件与本地 Chronicle control 协议 | `persisting-events` | [RFC-0007](../rfcs/0007-events-contract-pchronicle-sidecar.md) | | Agent 执行与 Effect review | pVisor | [pVisor 概念](../pvisor/concepts/index.md)与[指南](../pvisor/guides/index.md) | | Provider 与运行时机制 | pVisor | [pVisor Design](../pvisor/design/index.md) | -| 多 Run 编排 | pVisor 中的 pPilot | [pPilot Design](../ppilot/design/orchestration.md) | | Dataset、事实与 Projection | pChronicle | [pChronicle 概念](../pchronicle/concepts/index.md) | | 存储与 Snapshot 实现 | pChronicle | [pChronicle Design](../pchronicle/design/index.md) | | 稳定命令语法与格式 | 各产品 | [pVisor Reference](../pvisor/reference/index.md)与 [pChronicle Reference](../pchronicle/reference/index.md) | diff --git a/docs/src/system-design/index.zh.md b/docs/src/zh/system-design/index.md similarity index 80% rename from docs/src/system-design/index.zh.md rename to docs/src/zh/system-design/index.md index 317fb84f..b93a10fc 100644 --- a/docs/src/system-design/index.zh.md +++ b/docs/src/zh/system-design/index.md @@ -4,7 +4,6 @@ Persisting 是横跨模型状态——参数与 KV Cache——以及 Agent 历 当前公开产品路径: - [pVisor](../pvisor/index.md) 虚拟化并治理单个 Agent Run; -- [pPilot](../ppilot/index.md) 把该 Run 模型扩展到多个任务,并仍位于 pVisor 执行边界内; - [pChronicle](../pchronicle/index.md) 把持久轨迹 Source 组织为可查询 Dataset。 Gateway、OverlayFS 与 OverlayNet 是 pVisor 运行时机制。存在稳定 Run identity 时,它会连接 @@ -32,13 +31,15 @@ lineage、Effect 与更完整的 Evidence 清单仍留在本地,除非另行 canonical event。每条路径保留与 Source 对应的保证;ingestion 不会补充 Source 未提供的 Evidence。 -| 关注点 | Owner | -| --- | --- | -| 单个 Run 的执行边界 | pVisor | -| 模型、网络与文件系统 runtime driver | pVisor | -| 多 Run planning、lease 与 task-to-Run mapping | pPilot | -| Canonical event、终态事实与 Dataset 历史 | pChronicle | -| 查询、交换与 revision lineage | pChronicle | +职责边界可以概括为两点: + +- **pVisor 负责执行。** 它定义单个 Run 的边界,以及模型、网络和文件系统 runtime driver。 + 即使没有捕获历史,私有 Run Bundle 也独立有效。 +- **pChronicle 负责历史。** 它记录 canonical event 和终态事实,并提供 Dataset 查询、交换与 + revision lineage。 + +这个拆分直接服务于使用者:可以先独立使用执行或历史,只有当问题同时跨越两个域时才配置 +capture 交接。 ## 按问题继续阅读 @@ -46,7 +47,6 @@ Evidence。 - [从本地到集群的连续性](local-to-fleet.md) - [安全与 Evidence 模型](security-evidence.md) - [pVisor 实现边界](../pvisor/design/index.md) -- [pPilot 编排](../ppilot/design/orchestration.md) - [pChronicle 实现边界](../pchronicle/design/index.md) 交付状态以产品 Design 页面与[项目工程笔记](../project/engineering.md)为准。目标架构不能 diff --git a/docs/src/system-design/local-to-fleet.zh.md b/docs/src/zh/system-design/local-to-fleet.md similarity index 93% rename from docs/src/system-design/local-to-fleet.zh.md rename to docs/src/zh/system-design/local-to-fleet.md index 2c757155..cafb6bb9 100644 --- a/docs/src/system-design/local-to-fleet.zh.md +++ b/docs/src/zh/system-design/local-to-fleet.md @@ -21,4 +21,4 @@ placement、tenant isolation、lease、attestation、恢复与 reconciliation, 稳定 identity 模型见 [Run、Attempt 与 Effect](../pvisor/concepts/run-model.md)。Provider admission 属于 [pVisor 隔离设计](../pvisor/design/isolation.md);集群协调(placement、lease -与 reconciliation)由 [pPilot](../ppilot/design/orchestration.md) 拥有。 +与 reconciliation)属于部署控制面,不会改变逻辑 Run 契约。 diff --git a/docs/src/system-design/security-evidence.zh.md b/docs/src/zh/system-design/security-evidence.md similarity index 94% rename from docs/src/system-design/security-evidence.zh.md rename to docs/src/zh/system-design/security-evidence.md index 1d254ed9..401789bf 100644 --- a/docs/src/system-design/security-evidence.zh.md +++ b/docs/src/zh/system-design/security-evidence.md @@ -1,8 +1,8 @@ # 安全与 Evidence 模型 Persisting 不会把安全压缩成一个 `safe` 或 `sandboxed` 标签。每个 Run 都按 capability -维度报告保证。pVisor 拥有 admission 与 runtime enforcement。pPilot 在 placement 间保存 -authority generation 与 lease 历史,但不会升级 pVisor 的 Evidence 等级。配置后的 +维度报告保证。pVisor 拥有 admission 与 runtime enforcement。Placement 与恢复机制不会提升 +pVisor 的 Evidence 等级。配置后的 pChronicle capture 保存 lifecycle fact,且只保存 Gateway 或 lifecycle event record 实际携带的 Evidence。完整 Run Bundle Evidence 清单仍留在本地, 除非另行搬运。 diff --git a/docs/static/img/diagrams/agentvisor/README.txt b/docs/static/img/diagrams/agentvisor/README.txt new file mode 100644 index 00000000..625f9244 --- /dev/null +++ b/docs/static/img/diagrams/agentvisor/README.txt @@ -0,0 +1,13 @@ +AgentVisor category diagrams + +These SVG files illustrate the industry category independently of any product +or repository implementation. + +- agentvisor-stack.svg: where the category sits in the infrastructure stack. +- effect-governance.svg: the lifecycle of an externally meaningful effect. +- execution-continuum.svg: semantic continuity from a personal device to a + secure fleet. + +The SVG files are source assets. Keep terminology aligned with +docs/src/design/agentvisor.md and avoid product names, implementation status, +or repository-specific protocols in this directory. diff --git a/docs/static/img/diagrams/agentvisor/agentvisor-stack.svg b/docs/static/img/diagrams/agentvisor/agentvisor-stack.svg new file mode 100644 index 00000000..768eac65 --- /dev/null +++ b/docs/static/img/diagrams/agentvisor/agentvisor-stack.svg @@ -0,0 +1,141 @@ + + The AgentVisor category in the Agent infrastructure stack + Multiple Agents share a pool of compute, filesystem, network, model, tool, and credential resources through an AgentVisor. Each Agent Run receives an isolated virtual execution environment with its own identity, state, authority, effects, and failure boundary. + + + + + + + + + + + + + + + + + + + + + + + The AgentVisor category + The hypervisor for Agent execution + + + + Independent Agent Runs + Agent A · Agent B · Agent C · different frameworks and goals + + + request an Agent virtual execution environment + + + + AgentVisor + maps shared resources into isolated Agent virtual execution environments + + + + Agent environment A + identity · workspace · authority + Isolated state and effect boundary + + + + Agent environment B + identity · workspace · authority + Isolated state and effect boundary + + + + Agent environment C + identity · workspace · authority + Isolated state and effect boundary + + + + Resource multiplexing + compute · storage · network + Shared pool, bounded consumption + + + + Lifecycle + placement + create · place · suspend · migrate + Stable Run across physical substrates + + + + Continuity + evidence + checkpoint · lineage · outcomes + State and accountability follow the Run + + + + + Identity + human · workload + organization + Policy + intent and constraints + + + + + + Evidence + audit · lineage + attestation + History + durable accountable facts + + + + + capability-aware Attempt placement + + + + Host sandbox + local process boundary + + + Container + shared-kernel isolation + + + MicroVM + dedicated guest kernel + + + Confidential + attested environment + + + Fleet + scheduled remote provider + + + + + + Models · tools · files · data · networks · services · people · physical systems + + Multiple Agents share the infrastructure pool while identity, state, authority, effects, and failures remain isolated. + diff --git a/docs/static/img/diagrams/agentvisor/effect-governance.svg b/docs/static/img/diagrams/agentvisor/effect-governance.svg new file mode 100644 index 00000000..8d23ad99 --- /dev/null +++ b/docs/static/img/diagrams/agentvisor/effect-governance.svg @@ -0,0 +1,108 @@ + + The AgentVisor effect governance loop + An Agent action moves through intent, admission, execution, observation, containment, and a decision to promote, reject, or compensate. Evidence closes the loop. Reversible, transactional, compensatable, and irreversible effects require different controls. + + + + + + + + + + + + + + + + + + + The effect governance loop + Autonomy is useful only when consequences have identity, state, policy, and evidence + + + + + + + + + + Intent + Agent proposes + an action + + + Admit + authority + context + + + Execute + allow · deny + or transform + + + Observe + capture actual + outcome + + + Contain + isolate or hold + when possible + + + + + + Resolve the consequence + promote · reject · expire + rollback · compensate · escalate + The decision depends on reversibility + + + + + + Evidence + accountability + intent · decision · mechanism + outcome · lineage · terminal state + Durable facts close the loop + + + + future admission learns from evidence + + Different effects require different controls + + + Reversible + stage · review · promote · discard + + + Transactional + reserve · validate · commit atomically + + + Compensatable + commit + durable counter-action + + + Irreversible + strong admission · minimal authority + + + Observation proves that something happened. It does not, by itself, make the consequence controllable or reversible. + diff --git a/docs/static/img/diagrams/agentvisor/execution-continuum.svg b/docs/static/img/diagrams/agentvisor/execution-continuum.svg new file mode 100644 index 00000000..7e29c352 --- /dev/null +++ b/docs/static/img/diagrams/agentvisor/execution-continuum.svg @@ -0,0 +1,114 @@ + + The AgentVisor execution continuum + A stable Agent Run identity, delegated authority, semantic checkpoint, effect frontier, lineage, and evidence can continue from a personal device through a team environment to a secure fleet, while the physical execution substrate and operational controls change. + + + + + + + + + + + + + + + + One Agent Run across an execution continuum + Semantic portability preserves authority and accountability while infrastructure changes + + + + What remains stable + + Run identity + intent + + Delegated authority + + Semantic checkpoint + + Effect frontier + + Lineage + + Enforcement + outcome evidence + + + + + promote artifacts and checkpoints + schedule with stronger guarantees + + + + Personal device + Low friction · same-owner trust + + Local AgentVisor + Autonomy inside; controlled promotion outside + + Process + sandbox + + Container + local OCI + + MicroVM + local VM + + + + + Team environment + Shared policy · review · artifacts + + Organizational AgentVisor + Identity, budgets, promotion, and common evidence + + Workstation + managed local + + Team pool + shared compute + + + + + Secure fleet + Multi-tenant · attested · reconciled + + Fleet AgentVisor + Fenced ownership, placement, and node evidence + + MicroVM + tenant pool + + Confidential + attested + + Remote + specialized + + + + + Portable artifacts and accountable history + content digests · checkpoints · effect records · evidence bundles · causal lineage + + + + + + Local-to-fleet is semantic continuity first. Live process-memory or VM migration is an optional provider capability, not the category definition. + diff --git a/docs/static/img/diagrams/persisting/README.txt b/docs/static/img/diagrams/persisting/README.txt new file mode 100644 index 00000000..4076d94f --- /dev/null +++ b/docs/static/img/diagrams/persisting/README.txt @@ -0,0 +1,5 @@ +These SVGs explain the end-to-end Persisting product story. + +Keep the narrative ordered around the stable Run model: +execute one Run, govern effects, orchestrate many Runs, preserve history. +Product-specific implementation details belong in subsystem diagrams. diff --git a/docs/static/img/diagrams/persisting/dataset-catalog.svg b/docs/static/img/diagrams/persisting/dataset-catalog.svg new file mode 100644 index 00000000..c5ef4c6e --- /dev/null +++ b/docs/static/img/diagrams/persisting/dataset-catalog.svg @@ -0,0 +1,18 @@ + + pChronicle Snapshot query pathCLI or server configuration produces Dataset mounts and an immutable Snapshot. The table provider first evaluates source predicates, skips unmatched sources, lazily resolves matched sources once, and constructs an empty, direct, or union execution plan. + + Snapshot: prune first, resolve lazilyA Snapshot fixes membership and source versions; physical data opens only when selected + CLI / Server confignames · roots · format hints + DatasetMount[]normalized mount identity + Catalog snapshotimmutable membershipfixed source version descriptors + Dataset schemasources + stable tablesregistered in DataFusion + CatalogTableProviderevaluate Dataset + _file_ predicatebefore constructing physical scans + matched + LazySource.resolveOnceCell single-flightcache result or error + + Native source providerStoryline · events · fileprojection + filter + limit + + Physical execution plan0 EmptyExec · 1 direct planN sources → UnionExec + unmatched + Skip the sourceno parse · no remote open · no scan + diff --git a/docs/static/img/diagrams/persisting/gateway-dataflow.svg b/docs/static/img/diagrams/persisting/gateway-dataflow.svg new file mode 100644 index 00000000..8833a5e6 --- /dev/null +++ b/docs/static/img/diagrams/persisting/gateway-dataflow.svg @@ -0,0 +1,17 @@ + + Gateway event dataflowThe HTTP capture proxy emits events to a non-blocking event flow. The flow appends canonical events to Lance and independently triggers handlers. Handlers reduce events into Storyline and write AgenticMD, ATIF, and other derived formats. Lance can replay events through the same handlers. + + Gateway dataflowRecord canonical events first; build human and exchange views through independent handlers + Capture proxyHTTP · SSE · protocol adapterforward without waiting on views + emit + Event flowordered append · bounded fan-outcallback never blocks + record + events.lancecanonical source of truthappend + replay + trigger + Handlersinterpret · reduce · retryfailure does not block HTTP + + Storyline hubsession + call normalizationhuman-readable semantics + + ViewsAgenticMDATIF · others + replay + diff --git a/docs/static/img/diagrams/persisting/gateway-request.svg b/docs/static/img/diagrams/persisting/gateway-request.svg new file mode 100644 index 00000000..081d2ba5 --- /dev/null +++ b/docs/static/img/diagrams/persisting/gateway-request.svg @@ -0,0 +1,10 @@ + + Gateway request capture sequenceAn Agent sends a request through the capture proxy. The proxy emits the request event and forwards upstream. Streaming drafts update handlers while SSE continues to the Agent. On cancellation Lance records cancel; on completion Lance records the final response and handlers finalize derived views. + + One captured conversation requestThe response path does not wait for derived-format persistence + AgentCapture proxyEvent flowevents.lanceHandlersUpstream + + REQUESTconversation requestemit request eventappend canonical requesttrigger Storyline / Markdownforward upstream + STREAMstreaming responseoptional draftlive view upsertforward SSE + TERMINALcancel or response completeappend terminal factfinalize views on completion + diff --git a/docs/static/img/diagrams/persisting/libkrun-executor.svg b/docs/static/img/diagrams/persisting/libkrun-executor.svg new file mode 100644 index 00000000..31d90686 --- /dev/null +++ b/docs/static/img/diagrams/persisting/libkrun-executor.svg @@ -0,0 +1,22 @@ + + pVisor libkrun execution path + The host Run controller prepares an OCI or explicit root filesystem and a separate workspace, passes a RunnerSpec to the self-executed pVisor runner and libkrun, then mounts the merged root through virtio-fs into a minimal Linux guest that runs the Agent. + + pVisor libkrun execution pathThe VM replaces the executor; pVisor retains Run ownership and finalization + HOST PVISOR + Run controllerRunId · AttemptId · lease + OCI registry/cacheverified image layersor explicit rootfs + Rootfs OverlayFSimmutable lowerper-Run temporary upper + Host workspaceseparate durable mount + VmExecutorRunnerSpec + GuestSpecCPU · RAM · cwd · env + self-exec pVisor runnerLinux confinement or macOS HVF · watchdog · cancellation + + LIBKRUN VMM + libkrunvCPU · RAM · init + virtio-fsguest root + workspace + + MINIMAL LINUX GUEST + embedded initmount · env · exec + Agentguest process tree + exit · cancel · watchdog → Run controller + diff --git a/docs/static/img/diagrams/persisting/pchronicle-product.svg b/docs/static/img/diagrams/persisting/pchronicle-product.svg new file mode 100644 index 00000000..1dfd7652 --- /dev/null +++ b/docs/static/img/diagrams/persisting/pchronicle-product.svg @@ -0,0 +1,105 @@ + + pChronicle product boundary + Canonical runtime event Sources and pinned local or S3 external trajectory Sources from external evaluators and Agent frameworks enter pChronicle through separate branches and converge at a Snapshot and normalized Dataset views. Supported external files include ATIF, ACTF, OpenAI Messages, and Storyline Sources; they do not become canonical runtime events. CLI import is a separate inbound path that accepts ATIF, ACTF, and OpenAI Messages into a new Dataset. Outbound surfaces provide query and analysis, export including Storyline, revisions, and a read-only Warehouse API and Web interface. + + + + + + + + + + + + + + + + pChronicle product boundary + Dataset-first trajectory data · direct Sources · directional read and exchange surfaces + + + ingest / write + + query / export / read + + + + Canonical event Sources + Gateway · pVisor lifecycle · native writers + + + + + Pinned external Sources + External evaluators · Agent frameworks + local/S3 ATIF · ACTF · OpenAI Messages + Storyline Sources · direct normalization + + + + + CLI import → new Dataset + ATIF · ACTF · OpenAI Messages + + + + + + + + + Snapshot + pin Source versions + preserve Source identity + normalize Dataset views + external files remain + non-event Sources + + + + + + + pChronicle Core + discover · pin Snapshot + normalize Sources · query + persist canonical runtime events + export · revision lineage + + + + + + + + + CLI query + query · analysis + + + + + Export + revisions + ATIF · ACTF · OpenAI + Storyline · revision lineage + + + + + Read-only Warehouse + API · Web + + diff --git a/docs/static/img/diagrams/persisting/pchronicle-web.svg b/docs/static/img/diagrams/persisting/pchronicle-web.svg new file mode 100644 index 00000000..74f7ebc7 --- /dev/null +++ b/docs/static/img/diagrams/persisting/pchronicle-web.svg @@ -0,0 +1,23 @@ + + pChronicle Web build and runtimeDioxus components are bundled into static assets and embedded in the native server. At runtime the browser talks to the Axum REST API, which holds immutable catalog state, source routing, and a read-only query engine over local and object-store sources. + + pChronicle Web: build once, serve read-onlyThe Web application is a consumer of pChronicle, not another source of truth + BUILD AND PACKAGE + Dioxus componentspchronicle-web + dx bundle --releasepre-compressed bundle + web-assets/publicWASM · JS · CSS · HTML + server build.rsgenerated or fallback assets + native binaryassets embedded with include_dir + + LOOPBACK RUNTIME + Dioxus applicationDataset · Runs · timelineevents · tools · filters + + Axum /apiread-only RESTexplicit refresh + + AppStatemount configimmutable catalog snapshotgeneration-scoped routing + + Dataset sourceslocal · S3 · object prefixesevents · ATIF · ACTF · Storyline + Query engineDataset schemassource pruning · read-only SQL + + ViewsRunsevents · spans + diff --git a/docs/static/img/diagrams/persisting/run-lifecycle.svg b/docs/static/img/diagrams/persisting/run-lifecycle.svg new file mode 100644 index 00000000..8a7e953c --- /dev/null +++ b/docs/static/img/diagrams/persisting/run-lifecycle.svg @@ -0,0 +1,47 @@ + + Agent Run lifecycle + A Run moves from created to admitted and running. Running can checkpoint and resume, complete, fail, or cancel. Admitted Runs can also cancel. + + + + + + + Agent Run lifecycle + Run state is monotonic; checkpointed is resumable, not terminal + + + + + createdidentity persisted + + + admittedcapabilities checked + + + runningactive Attempt + + + + checkpointedresume into running + + + + + completed + + + + + + failed + + + + + cancelling + + + cancelled + + diff --git a/docs/static/img/diagrams/persisting/system-products.svg b/docs/static/img/diagrams/persisting/system-products.svg new file mode 100644 index 00000000..e979ebfc --- /dev/null +++ b/docs/static/img/diagrams/persisting/system-products.svg @@ -0,0 +1,105 @@ + + Persisting workflows and optional integration + pVisor runs one Agent with a reviewable execution boundary, while pChronicle queries trajectory Datasets. Execution and history are independent starting points that can be connected by configured capture. + + + + + + + + + + + + + + + + + + + + + + + + Persisting product paths and optional integration + pVisor governs execution; pChronicle preserves queryable history + + Inputs + + + Agent command / task + + + + Pinned external Sources + + + + + + + + EXECUTION PATH + pVisor: controlled execution + + + pVisor: one governed Run per Agent + review, apply, or drop staged changes + + + Host · OCI container · libkrun VM + provider boundary and Evidence recorded with the Run + + + + + HISTORY PATH + pChronicle: trajectory Datasets + + + local/S3 files · Storyline Sources · @alias + + + Snapshot · normalize · query · analyze · exchange + + + + + OPTIONAL CAPTURE + Gateway trajectory events + pVisor lifecycle records + recorded execution context + + + configured capture + + + + + Shared principle + keep reusable state durable; keep completed work inspectable + + diff --git a/docs/src/assets/diagrams/pvisor/README.txt b/docs/static/img/diagrams/pvisor/README.txt similarity index 74% rename from docs/src/assets/diagrams/pvisor/README.txt rename to docs/static/img/diagrams/pvisor/README.txt index 8cbef843..dacd394d 100644 --- a/docs/src/assets/diagrams/pvisor/README.txt +++ b/docs/static/img/diagrams/pvisor/README.txt @@ -1,11 +1,11 @@ pVisor documentation diagrams These SVG files are source assets, not generated build output. They are kept -inside the MkDocs docs_dir so the website and repository README can reference +inside the documentation asset tree so the website and repository README can reference the same versioned diagrams. - agentvisor-architecture.svg: product ownership and the boundary between - pVisor, pPilot, pChronicle, and execution providers. + pVisor, pChronicle, and execution providers. Keep status labels honest when the implementation changes. Product-specific claims belong here; industry-level category diagrams live in the sibling diff --git a/docs/static/img/diagrams/pvisor/agentvisor-architecture.svg b/docs/static/img/diagrams/pvisor/agentvisor-architecture.svg new file mode 100644 index 00000000..5620ed35 --- /dev/null +++ b/docs/static/img/diagrams/pvisor/agentvisor-architecture.svg @@ -0,0 +1,135 @@ + + pVisor AgentVisor architecture + An Agent sends one Run contract into pVisor. pVisor governs lifecycle, capabilities, Effects, checkpoints, lineage, Evidence, and runtime drivers. orchestration orchestrates many Runs, while host, container, VM, and future fleet providers execute Attempts. Configured pChronicle capture receives Gateway trajectory events, pVisor lifecycle records, and their event-carried Evidence; the full Run Bundle and its Artifact, lineage, Effect, and broader Evidence inventory remain local. + + + + + + + + + + + + + + + + + + + + + + + pVisor is an AgentVisor + One governed Agent Run across local and clustered execution providers + + + + + + Autonomous Agent + CLI · coding Agent · evaluation worker + + + RunSpec + capability intent + + + + pVisor + AgentVisor control and containment layer + + + + Lifecycle + Run · Attempt · cancel · terminal + Stable identity above process + + + + Capabilities + read · write · network · tools + Evidence per requested dimension + + + + Effects + observe · stage · apply · drop + Control what becomes real + + + + Checkpoint + quiesce · snapshot · fork · lineage + Logical Agent + workspace state + + + + Evidence + Run Bundle · events · metrics + What ran, changed, and enforced + + + + Drivers + AgentCtl · Gateway · Overlay* + One policy context per Attempt + + + + + orchestration + plan · lease · schedule + retry · reconcile + Many Runs + + + + + + pChronicle + Configured event handoff + Dataset · history + Event-carried facts only + + + Gateway trajectory events + pVisor lifecycle records + carried Evidence + + + Attempt placement + + + + Safe host + Linux · macOS + + + Container + Docker · Podman + + + libkrun VM + KVM · HVF + + + Fleet provider + Product gate + + + AgentVisor defines Agent semantics; execution providers define process, container, VM, and node mechanics. + diff --git a/docs/static/img/logo-mark.svg b/docs/static/img/logo-mark.svg new file mode 100644 index 00000000..a79faab6 --- /dev/null +++ b/docs/static/img/logo-mark.svg @@ -0,0 +1,7 @@ + + PersistingA small constellation of four persistent points + + + + + diff --git a/docs/static/img/screenshots/pchronicle/analysis-sql.jpg b/docs/static/img/screenshots/pchronicle/analysis-sql.jpg new file mode 100644 index 00000000..bf1ddd0a Binary files /dev/null and b/docs/static/img/screenshots/pchronicle/analysis-sql.jpg differ diff --git a/docs/static/img/screenshots/pchronicle/assistant-settings.jpg b/docs/static/img/screenshots/pchronicle/assistant-settings.jpg new file mode 100644 index 00000000..1c6338e1 Binary files /dev/null and b/docs/static/img/screenshots/pchronicle/assistant-settings.jpg differ diff --git a/docs/static/img/screenshots/pchronicle/data-overview.jpg b/docs/static/img/screenshots/pchronicle/data-overview.jpg new file mode 100644 index 00000000..a52d37aa Binary files /dev/null and b/docs/static/img/screenshots/pchronicle/data-overview.jpg differ diff --git a/docs/static/img/screenshots/pchronicle/run-detail.jpg b/docs/static/img/screenshots/pchronicle/run-detail.jpg new file mode 100644 index 00000000..7844afae Binary files /dev/null and b/docs/static/img/screenshots/pchronicle/run-detail.jpg differ diff --git a/docs/static/img/screenshots/pchronicle/runs-browser.jpg b/docs/static/img/screenshots/pchronicle/runs-browser.jpg new file mode 100644 index 00000000..2a925e1f Binary files /dev/null and b/docs/static/img/screenshots/pchronicle/runs-browser.jpg differ diff --git a/docs/static/img/screenshots/pchronicle/storage-layout.jpg b/docs/static/img/screenshots/pchronicle/storage-layout.jpg new file mode 100644 index 00000000..e8c06308 Binary files /dev/null and b/docs/static/img/screenshots/pchronicle/storage-layout.jpg differ diff --git a/docs/static/img/stylesheets/home.css b/docs/static/img/stylesheets/home.css new file mode 100644 index 00000000..84fef74d --- /dev/null +++ b/docs/static/img/stylesheets/home.css @@ -0,0 +1,882 @@ +/* Persisting homepage. + Layout and visual system for the docs landing page (overrides/home.html). + Tokens are scheme-aware: the hero has separately tuned light and dark + recipes rather than one inverted palette. */ + +:root { + /* Keep Material's indigo/pink relationship; Persisting's teal and blue + accents remain inside the page content. */ + --md-primary-fg-color: #3f51b5; + --md-primary-fg-color--light: #7986cb; + --md-primary-fg-color--dark: #303f9f; + --md-accent-fg-color: #ff4081; + + /* Semantic palette: teal marks execution, blue marks history. */ + --ph-exec: #0d9488; + --ph-exec-bright: #2dd4bf; + --ph-hist: #3b82f6; + --ph-hist-bright: #60a5fa; + + --ph-ink: #0f172a; + --ph-muted: #5a677d; + --ph-line: rgba(100, 116, 139, 0.22); + --ph-panel: rgba(148, 163, 184, 0.07); + --ph-card: #ffffff; + + /* Hero, light recipe. */ + --ph-hero-bg: + linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(245, 247, 255, 0.96)); + --ph-hero-ink: #0b1220; + --ph-hero-dim: #46566d; + --ph-hero-eyebrow: #0f766e; + --ph-hero-rule: rgba(15, 23, 42, 0.1); + --ph-btn-fg: #0b1220; + --ph-btn-line: rgba(63, 81, 181, 0.28); + --ph-btn-hover: rgba(15, 23, 42, 0.05); + --ph-shadow: 0 8px 24px rgba(63, 81, 181, 0.14); + --ph-shadow-sm: 0 4px 14px rgba(63, 81, 181, 0.12); + + /* Terminal cards stay dark in both schemes: a shell is a shell. */ + --ph-term-bg: #0b1322; + --ph-term-line: #1e293b; + --ph-term-fg: #cbd5e1; + --ph-term-prompt: #2dd4bf; +} + +[data-md-color-scheme="slate"] { + --ph-ink: #e6edf6; + --ph-muted: #9fb0c6; + --ph-line: rgba(148, 163, 184, 0.2); + --ph-panel: rgba(148, 163, 184, 0.06); + --ph-card: rgba(148, 163, 184, 0.05); + + /* Hero, dark recipe. */ + --ph-hero-bg: + radial-gradient(ellipse 70% 55% at 78% 10%, rgba(45, 212, 191, 0.2), transparent 60%), + radial-gradient(ellipse 65% 55% at 10% 88%, rgba(59, 130, 246, 0.18), transparent 58%), + linear-gradient(168deg, #060d18, #0d1a2c 55%, #0c2a2c); + --ph-hero-ink: #f8fafc; + --ph-hero-dim: #b6c6da; + --ph-hero-eyebrow: #2dd4bf; + --ph-hero-rule: rgba(226, 232, 240, 0.14); + --ph-btn-fg: #f1f5f9; + --ph-btn-line: rgba(226, 232, 240, 0.3); + --ph-btn-hover: rgba(226, 232, 240, 0.09); + --ph-shadow: 0 26px 70px rgba(0, 0, 0, 0.5); + --ph-shadow-sm: 0 12px 32px rgba(0, 0, 0, 0.4); +} + +body { + overflow-x: hidden; +} + +.ph { + color: var(--ph-ink); +} + +.ph-shell { + width: min(1280px, calc(100% - 56px)); + margin: 0 auto; +} + +/* The landing page is a full-width surface. Material's regular content grid + remains in place for documentation pages, but must not squeeze the hero + into the reading column. */ +body:has(.ph) .md-tabs:has(.ph), +body:has(.ph) .md-tabs:has(.ph) .ph { + max-width: none; +} + +body:has(.ph) .md-tabs:has(.ph) { + width: 100%; +} + +/* ---------------------------------------------------------------- hero -- */ + +.ph-hero { + position: relative; + overflow: hidden; + padding: 94px 0 104px; + background: var(--ph-hero-bg); + color: var(--ph-hero-ink); +} + +.ph-hero-copy { + max-width: 780px; + margin: 0 auto; + text-align: center; +} + +.ph-hero .ph-shell { + display: block; +} + +.ph-eyebrow, +.ph-kicker { + margin: 0 0 16px; + color: var(--ph-hero-eyebrow); + font-size: 0.74rem; + font-weight: 750; + letter-spacing: 0.17em; +} + +.ph-wordmark { + margin: 0; + color: var(--ph-hero-ink); + font-size: clamp(3.4rem, 8.5vw, 6.2rem); + font-weight: 780; + letter-spacing: -0.05em; + line-height: 0.96; +} + +.ph-positioning { + margin: 22px 0 0; + color: var(--ph-hero-ink); + font-size: clamp(1.3rem, 2.6vw, 1.95rem); + font-weight: 650; + letter-spacing: -0.022em; + line-height: 1.28; +} + +.ph-hero-copy .ph-positioning + .ph-positioning { + margin-top: 16px; + font-size: clamp(1.05rem, 1.7vw, 1.25rem); + font-weight: 450; + line-height: 1.65; +} + +.ph-lede { + max-width: 640px; + margin: 16px auto 0; + color: var(--ph-hero-dim); + font-size: clamp(1.02rem, 1.7vw, 1.2rem); + line-height: 1.66; +} + +.ph-actions { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 11px; + margin-top: 34px; +} + +.ph-btn { + display: inline-flex; + align-items: center; + padding: 0.72rem 1.2rem; + border: 1px solid var(--ph-btn-line); + border-radius: 8px; + color: var(--ph-btn-fg); + font-size: 0.84rem; + font-weight: 680; + line-height: 1.2; + text-decoration: none; + transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease; +} + +.ph-btn:hover { + border-color: currentcolor; + background: var(--ph-btn-hover); + color: var(--ph-btn-fg); +} + +.ph-btn--primary { + border-color: var(--md-primary-fg-color); + background: var(--md-primary-fg-color); + color: #fff; +} + +.ph-btn--primary:hover { + border-color: var(--md-primary-fg-color--dark); + background: var(--md-primary-fg-color--dark); + color: #fff; +} + +.ph-btn--quiet { + border-color: transparent; + text-decoration: underline; + text-underline-offset: 4px; +} + +/* Dual visual: execution on the left, queryable history on the right. */ + +.ph-stage { + display: grid; + grid-template-columns: minmax(0, 1fr) 62px minmax(0, 1.12fr); + align-items: center; + margin-top: 62px; +} + +.ph-hero-art { + position: relative; + width: 100vw; + min-height: 620px; + overflow: hidden; + border: 1px solid rgba(94, 234, 212, 0.25); + border-radius: 24px; + background: #07101d url('../diagrams/persisting/hero-cyberpunk.svg') center / cover no-repeat; + box-shadow: var(--ph-shadow); + max-width: none; + margin: 58px 0 0; + margin-left: calc(50% - 50vw); + border-radius: 0; + background-size: cover; + background-position: center; +} + +.ph-hero-art__label, +.ph-hero-art__caption { + position: absolute; + left: 24px; + right: 24px; + color: #a7f3d0; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.68rem; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.ph-hero-art__label { top: 22px; } +.ph-hero-art__caption { bottom: 22px; color: #bfdbfe; font-family: inherit; letter-spacing: 0; text-transform: none; line-height: 1.5; } + +.ph-panel { + margin: 0; + min-width: 0; +} + +.ph-panel figcaption { + margin-top: 14px; + font-size: 0.76rem; + font-weight: 700; + letter-spacing: 0.11em; + text-transform: uppercase; +} + +.ph-panel--exec figcaption { + color: var(--ph-exec); +} + +.ph-panel--hist figcaption { + color: var(--ph-hist); +} + +[data-md-color-scheme="slate"] .ph-panel--exec figcaption { + color: var(--ph-exec-bright); +} + +[data-md-color-scheme="slate"] .ph-panel--hist figcaption { + color: var(--ph-hist-bright); +} + +/* The beam carries the eye from execution to history. */ +.ph-beam { + position: relative; + display: block; + height: 2px; + background: linear-gradient(90deg, var(--ph-exec-bright), var(--ph-hist)); + border-radius: 2px; +} + +.ph-beam::after { + content: ""; + position: absolute; + top: 50%; + right: -1px; + width: 9px; + height: 9px; + border-top: 2px solid var(--ph-hist); + border-right: 2px solid var(--ph-hist); + transform: translateY(-50%) rotate(45deg); +} + +/* Terminal card. */ + +.ph-term { + overflow: hidden; + padding: 16px 0 18px; + border: 1px solid var(--ph-term-line); + border-radius: 14px; + background: var(--ph-term-bg); + box-shadow: var(--ph-shadow); +} + +.ph-term-dots { + display: block; + margin: 0 16px 14px; +} + +/* One element, three dots: the base circle plus two shadow copies. */ +.ph-term-dots::before { + content: ""; + display: block; + width: 9px; + height: 9px; + border-radius: 50%; + background: #334155; + box-shadow: 15px 0 0 #334155, 30px 0 0 #334155; +} + +.ph-term pre { + margin: 0; + padding: 0 18px; + overflow-x: auto; + background: none; +} + +.ph-term code { + color: var(--ph-term-fg); + font-size: 0.79rem; + line-height: 1.72; +} + +.ph-l { + display: block; + white-space: pre; +} + +.ph-p { + margin-right: 0.5em; + color: var(--ph-term-prompt); + font-weight: 700; +} + +.ph-term--sm { + box-shadow: var(--ph-shadow-sm); +} + +.ph-term--sm code { + font-size: 0.74rem; + line-height: 1.85; +} + +/* Screenshot in browser chrome, so a light UI does not read as pasted-in. */ + +.ph-window { + overflow: hidden; + padding-top: 16px; + border: 1px solid var(--ph-term-line); + border-radius: 14px; + background: #131c2c; + box-shadow: var(--ph-shadow); +} + +.ph-window img { + display: block; + width: 100%; + height: auto; +} + +.ph-window--sm { + box-shadow: var(--ph-shadow-sm); +} + +/* --------------------------------------------------------------- stats -- */ + +.ph-stats { + border-bottom: 1px solid var(--ph-line); + background: var(--ph-panel); +} + +.ph-stats ul { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 24px; + margin: 0; + padding: 26px 0; + list-style: none; +} + +.ph-stats li { + display: flex; + align-items: baseline; + gap: 9px; + margin: 0; + color: var(--ph-muted); + font-size: 0.9rem; + line-height: 1.45; +} + +.ph-stats strong { + color: var(--ph-exec); + font-size: 1.65rem; + font-weight: 760; + letter-spacing: -0.03em; + line-height: 1; +} + +/* ------------------------------------------------------------ sections -- */ + +.ph-section { + padding: 88px 0; +} + +.ph-section h2 { + max-width: 840px; + margin: 0; + color: var(--ph-ink); + font-size: clamp(1.9rem, 3.6vw, 2.9rem); + font-weight: 700; + letter-spacing: -0.032em; + line-height: 1.16; +} + +.ph-section .ph-kicker { + color: var(--ph-exec); +} + +.ph-lead { + max-width: 700px; + margin: 18px 0 0; + color: var(--ph-muted); + font-size: 1.1rem; + line-height: 1.72; +} + +.ph-note { + margin: 0; + color: var(--ph-muted); + font-size: 0.93rem; + line-height: 1.65; +} + +.ph-section--contrast { + border-block: 1px solid var(--ph-line); + background: var(--ph-panel); +} + +/* Throughline: colour shifts from execution to history across the steps. */ + +.ph-flow { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 20px; + margin: 48px 0 26px; + padding: 0; + list-style: none; +} + +.ph-step { + position: relative; + margin: 0; + padding: 26px 24px 24px; + border: 1px solid var(--ph-line); + border-radius: 16px; + background: var(--ph-card); +} + +.ph-step::before { + content: ""; + position: absolute; + inset: -1px -1px auto; + height: 3px; + border-radius: 16px 16px 0 0; +} + +.ph-step--1::before { + background: var(--ph-exec-bright); +} + +.ph-step--2::before { + background: linear-gradient(90deg, var(--ph-exec-bright), var(--ph-hist)); +} + +.ph-step--3::before { + background: var(--ph-hist); +} + +.ph-step-tag { + font-size: 0.72rem; + font-weight: 760; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +.ph-step--1 .ph-step-tag { + color: var(--ph-exec); +} + +.ph-step--2 .ph-step-tag { + color: #1d8fa6; +} + +.ph-step--3 .ph-step-tag { + color: var(--ph-hist); +} + +.ph-step h3 { + margin: 12px 0 10px; + font-size: 1.14rem; + font-weight: 680; + line-height: 1.35; +} + +.ph-step p { + margin: 0 0 18px; + color: var(--ph-muted); + font-size: 0.96rem; + line-height: 1.68; +} + +/* Material-style feature grid: short, scannable capabilities before the + deeper workflow sections. */ +.ph-capabilities { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin-top: 42px; + overflow: hidden; + border: 1px solid var(--ph-line); + border-radius: 8px; + background: var(--ph-line); +} + +.ph-capabilities article { + min-height: 150px; + padding: 26px 24px; + background: var(--ph-card); +} + +.ph-capabilities h3 { + margin: 0 0 10px; + color: var(--ph-ink); + font-size: 1.02rem; + font-weight: 700; +} + +.ph-capabilities p { + margin: 0; + color: var(--ph-muted); + font-size: 0.92rem; + line-height: 1.6; +} + +/* A concrete first-use path, following the landing-page pattern of showing + the smallest useful workflow before sending readers into the reference. */ +.ph-quickstart { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; + margin-top: 42px; +} + +.ph-quickstart article { + padding: 24px; + border: 1px solid var(--ph-line); + border-radius: 14px; + background: var(--ph-card); +} + +.ph-quickstart h3 { + margin: 0 0 16px; + font-size: 1rem; + font-weight: 700; +} + +.ph-quickstart pre { + min-height: 76px; + margin: 0; + padding: 14px 16px; + overflow-x: auto; + border-radius: 9px; + background: var(--ph-term-bg); +} + +.ph-quickstart code { + color: var(--ph-term-fg); + font-size: 0.76rem; + line-height: 1.65; +} + +.ph-quickstart p { + margin: 16px 0 0; + color: var(--ph-muted); + font-size: 0.9rem; + line-height: 1.6; +} + +/* Wrap rather than scroll: a clipped command reads as broken on a landing page. */ +.ph-step code { + display: block; + padding: 9px 12px; + border-radius: 8px; + background: var(--ph-term-bg); + color: var(--ph-term-fg); + font-size: 0.76rem; + line-height: 1.6; + white-space: pre-wrap; + overflow-wrap: anywhere; +} + +/* Depth panels. */ + +.ph-depth { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 22px; + margin-top: 48px; +} + +.ph-depth-card { + display: flex; + flex-direction: column; + padding: 28px; + border: 1px solid var(--ph-line); + border-radius: 18px; + background: var(--ph-card); +} + +.ph-tag { + font-size: 0.72rem; + font-weight: 760; + letter-spacing: 0.15em; +} + +.ph-depth-card--exec .ph-tag { + color: var(--ph-exec); +} + +.ph-depth-card--hist .ph-tag { + color: var(--ph-hist); +} + +.ph-depth-card > p { + margin: 16px 0 22px; + color: var(--ph-muted); + font-size: 1rem; + line-height: 1.7; +} + +.ph-depth-card > a { + margin-top: 22px; + font-size: 0.94rem; + font-weight: 660; + text-decoration: none; +} + +.ph-depth-card--exec > a { + color: var(--ph-exec); +} + +.ph-depth-card--hist > a { + color: var(--ph-hist); +} + +.ph-depth-card > a:hover { + text-decoration: underline; +} + +/* Quick start. */ + +.ph-start { + display: grid; + grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.4fr); + gap: 26px; + margin-top: 46px; +} + +.ph-start h3 { + margin: 0 0 12px; + font-size: 0.98rem; + font-weight: 700; +} + +.ph-start-paths { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 26px; +} + +.ph-start pre { + margin: 0; + padding: 18px 20px; + overflow-x: auto; + border: 1px solid var(--ph-term-line); + border-radius: 12px; + background: var(--ph-term-bg); +} + +.ph-start code { + color: var(--ph-term-fg); + font-size: 0.79rem; + line-height: 1.9; +} + +.ph-start .ph-note { + margin-top: 14px; + font-size: 0.88rem; +} + +/* Link grid. */ + +.ph-links { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 16px; + margin-top: 44px; +} + +.ph-links a { + display: flex; + min-height: 142px; + flex-direction: column; + justify-content: space-between; + padding: 24px; + border: 1px solid var(--ph-line); + border-radius: 14px; + background: var(--ph-card); + color: inherit; + text-decoration: none; + transition: border-color 150ms ease, transform 150ms ease, box-shadow 150ms ease; +} + +.ph-links a:hover { + transform: translateY(-3px); + border-color: var(--ph-exec); + box-shadow: var(--ph-shadow-sm); +} + +.ph-links strong { + font-size: 1.02rem; + font-weight: 680; +} + +.ph-links span { + color: var(--ph-muted); + font-size: 0.9rem; + line-height: 1.55; +} + +/* Closing statement. */ + +.ph-close { + padding: 84px 0; + background: linear-gradient(150deg, #0a1526, #0f2a2c); + color: #dbe6f2; + text-align: center; +} + +.ph-close h2 { + margin: 0 auto; + max-width: 780px; + color: #f8fafc; + font-size: clamp(1.75rem, 3.2vw, 2.5rem); + font-weight: 700; + letter-spacing: -0.03em; + line-height: 1.2; +} + +.ph-close p { + max-width: 780px; + margin: 22px auto 0; + color: #a8bad0; + font-size: 1.05rem; + line-height: 1.75; +} + +/* --------------------------------------------------------- adaptation -- */ + +@media screen and (min-width: 76.25em) { + .ph ~ .md-main, + body:has(.ph) .md-sidebar--primary { + display: none; + } +} + +@media (max-width: 1020px) { + .ph-stats ul { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .ph-links { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 920px) { + .ph-hero .ph-shell { + grid-template-columns: 1fr; + } + + .ph-hero-art { + min-height: 460px; + } + + /* Stack the dual visual; the beam turns vertical. */ + .ph-stage { + grid-template-columns: 1fr; + gap: 8px; + justify-items: stretch; + } + + .ph-beam { + width: 2px; + height: 46px; + justify-self: center; + background: linear-gradient(180deg, var(--ph-exec-bright), var(--ph-hist)); + } + + .ph-beam::after { + top: auto; + right: 50%; + bottom: -1px; + transform: translateX(50%) rotate(135deg); + } + + .ph-flow, + .ph-capabilities, + .ph-quickstart, + .ph-depth, + .ph-start, + .ph-start-paths { + grid-template-columns: 1fr; + } +} + +@media (max-width: 620px) { + .ph-shell { + width: min(100% - 30px, 1180px); + } + + .ph-hero { + padding: 60px 0 68px; + } + + .ph-hero-art { + min-height: 390px; + } + + .ph-section { + padding: 62px 0; + } + + .ph-close { + padding: 62px 0; + } + + .ph-stats ul { + grid-template-columns: 1fr; + gap: 16px; + padding: 22px 0; + } + + .ph-links { + grid-template-columns: 1fr; + } + + .ph-links a { + min-height: 0; + gap: 8px; + } +} + +@media (prefers-reduced-motion: reduce) { + .ph-btn, + .ph-links a { + transition: none; + } + + .ph-links a:hover { + transform: none; + } +} diff --git a/docs/superpowers/plans/2026-08-30-docs-polish.md b/docs/superpowers/plans/2026-08-30-docs-polish.md deleted file mode 100644 index 875c17ec..00000000 --- a/docs/superpowers/plans/2026-08-30-docs-polish.md +++ /dev/null @@ -1,743 +0,0 @@ -# 文档体系打磨实施计划 - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** 将 Persisting 的 README 与文档体系打磨至顶级开源项目水平,移除令人困惑的文档,为对外发布与增长拉新做准备。 - -**Architecture:** 三层信息架构——顶层 README 负责快速吸引(uv/Ruff 风格),MkDocs 文档站负责分层深入(Overview → Get Started → Concepts → Guides → Design → Reference 契约),组件 README 面向贡献者。遗留重定向桩统一归档至 `docs/archive/legacy-nav/`,pPilot 三页孤立内容接入导航成为第三个产品小节。 - -**Tech Stack:** MkDocs Material + i18n 插件(en/zh 双语,`file.md` / `file.zh.md` 后缀约定)、just(`docs-build` / `docs-links`)、git mv 保留历史。 - -**Spec:** `docs/superpowers/specs/2026-08-30-docs-polish-design.md`(已获用户确认) - -## Global Constraints - -- **AGENTS.md 排除范围**:TTAS、Queue 及 sampler、Search、`persisting-dlcapt` 的文档**内容不修改、不翻译、不重构**。涉及文件:`docs/src/guide/queue.md(.zh.md)`、`docs/src/guide/custom-backends.md(.zh.md)`、`docs/src/api/index.md`、`docs/src/api/queue.md`、`crates/persisting-dlcapt/README.md`。这些文件仅允许随导航/构建健康做最小位移,本轮实际不动。 -- **双语约定**:每个面向用户的页面必须有 `.zh.md` 中文版本;**例外**:`docs/src/rfcs/` 下除 `index.md` 外的 RFC 正文保持英文(ADR 惯例,用户已确认),Queue 排除项保持现状。 -- **术语一致性**:中文译文遵循 `docs/mkdocs.yml` 的 `nav_translations` 与现有译文惯例(Run、Effect、Dataset、Capture 等术语保留英文)。 -- **验证基线**:每个结构性改动后运行 `just docs-build && just docs-links`(strict),必须零警告通过。 -- **README 自动化标记**:`README.md` 中的 `` / `` 块由 `benchmark/pchronicle/bench.py` 自动更新,**必须原样保留标记**。 -- **重定向桩模板**:`template: redirect.html` 来自 Material 主题(`material/templates/redirect.html`),frontmatter 用 `location: <相对URL>`。 -- **交付**:单 PR,每个 Task 一个 commit;commit message 遵循仓库现有风格(观察:`Refactor documentation to ...`、`feat: ...`)。 -- **文档源事实顺序**(来自 docs/README.md):`--help` 输出 > 用户指南/命令参考 > 架构页 > RFC > 研究笔记。命令示例必须与二进制 `--help` 一致。 - ---- - -### Task 1: 提交规格、归档遗留文档、修复 site_url - -**Files:** -- Create: `docs/archive/legacy-nav/`(接收 38 个文件) -- Modify: `docs/mkdocs.yml`(site_url) -- Modify: `docs/archive/README.md` -- Delete: `docs/product/`(空目录) -- Move: `docs/pchronicle-design-review.md` → `docs/superpowers/reviews/2026-08-23-pchronicle-design-review.md` - -- [ ] **Step 1: 提交规格与计划文档** - -```bash -cd /Users/reiase/workspace/Persisting -git add docs/superpowers/specs/2026-08-30-docs-polish-design.md docs/superpowers/plans/2026-08-30-docs-polish.md -git commit -m "docs: add documentation polish spec and implementation plan" -``` - -- [ ] **Step 2: 归档重定向桩** - -```bash -cd /Users/reiase/workspace/Persisting/docs -mkdir -p archive/legacy-nav -git mv src/design archive/legacy-nav/design -git mv src/dev archive/legacy-nav/dev -git mv src/quickstart.md archive/legacy-nav/quickstart.md -# guide/ 下仅移动重定向桩,保留 queue 与 custom-backends 内容页 -mkdir -p archive/legacy-nav/guide -cd src/guide -git mv capture.md capture.zh.md examples.md examples.zh.md history.md history.zh.md \ - index.md index.zh.md orchestrate.md orchestrate.zh.md overlaynet.md overlaynet.zh.md \ - pvisor-execution.md pvisor-execution.zh.md review-apply.md review-apply.zh.md \ - ../../archive/legacy-nav/guide/ -``` - -- [ ] **Step 3: 删除空目录、归位评审文档** - -```bash -cd /Users/reiase/workspace/Persisting/docs -rm -f product/.DS_Store && rmdir product -git mv pchronicle-design-review.md superpowers/reviews/2026-08-23-pchronicle-design-review.md -``` - -- [ ] **Step 4: 修复 mkdocs.yml 的 site_url** - -```yaml -# docs/mkdocs.yml 第 4 行 -site_url: https://deeplink-org.github.io/Persisting/ -``` - -- [ ] **Step 5: 更新 docs/archive/README.md** - -在现有内容后追加: - -```markdown - -## legacy-nav/ - -Redirect stubs from the pre-restructure `/design/`, `/guide/`, `/dev/`, and -`/quickstart` URL space. The current navigation under `pvisor/`, `pchronicle/`, -`ppilot/`, `project/`, and `system-design/` has absorbed their targets, so the -stubs no longer serve external links. Archived 2026-08-30; excluded from the -MkDocs build because they live outside `src/`. -``` - -- [ ] **Step 6: 验证构建** - -Run: `just docs-build && just docs-links` -Expected: 零警告通过;`docs/site/` 中不再生成 `design/`、`dev/`、`quickstart.html` 页面(`guide/` 仍生成 queue 与 custom-backends 两页)。 - -- [ ] **Step 7: Commit** - -```bash -git add -A docs/ -git commit -m "docs: archive legacy redirect stubs and fix mkdocs site_url" -``` - ---- - -### Task 2: pPilot 接入文档站导航 - -**Files:** -- Move: `docs/src/pvisor/guides/orchestrate.md(.zh.md)` → `docs/src/ppilot/guides/orchestrate.md(.zh.md)` -- Move: `docs/src/pvisor/design/orchestration.md` → `docs/src/ppilot/design/orchestration.md` -- Move: `docs/src/pvisor/reference/ppilot-cli.md` → `docs/src/ppilot/reference/cli.md` -- Create: `docs/src/ppilot/index.md`、`docs/src/ppilot/get-started.md` -- Modify: `docs/mkdocs.yml`(nav + nav_translations) - -**Interfaces:** -- Produces: `ppilot/index.md`、`ppilot/get-started.md` 的英文定稿——Task 8 据此翻译中文版本。 - -- [ ] **Step 1: 移动文件** - -```bash -cd /Users/reiase/workspace/Persisting/docs/src -mkdir -p ppilot/guides ppilot/design ppilot/reference -git mv pvisor/guides/orchestrate.md pvisor/guides/orchestrate.zh.md ppilot/guides/ -git mv pvisor/design/orchestration.md ppilot/design/ -git mv pvisor/reference/ppilot-cli.md ppilot/reference/cli.md -``` - -- [ ] **Step 2: 查找并修复入链** - -Run: `rg -n "orchestrate|orchestration|ppilot-cli" docs/src --type md -g '!ppilot/**'` -对每一处指向旧路径的链接,改为新的 `ppilot/...` 相对路径。被移动文件内部的相对链接(如 `ppilot/reference/cli.md` 中的 `../../pchronicle/reference/cli.md`)深度不变,保持有效;逐一打开三个被移动文件确认链接仍然正确。 - -- [ ] **Step 3: 新写 `docs/src/ppilot/index.md`** - -```markdown -# pPilot - -**Durable Run production at scale.** - -pPilot extends the Run model from one execution to a bounded collection of -tasks. It owns planning, bounded concurrency, leases and fencing decisions, -infrastructure retry and recovery, reconciliation, durable result publication, -and task-to-Run mapping. - -It does not redefine the Agent runtime: each task remains an independent -[pVisor Run](../pvisor/concepts/run-model.md), executed by the standalone -`pvisor` binary. - -| Command | Owns | -| --- | --- | -| `ppilot run` | execute a `plan()` / `execute(item)` workload with durable recovery | -| `ppilot produce` | create independent pVisor Runs from a streaming planner | - -## Where to start - -- [Get Started](get-started.md) — run your first parallel plan in five minutes -- [Orchestrate many Agent Runs](guides/orchestrate.md) — planning, workers, resume, and sinks -- [Orchestration design](design/orchestration.md) — leases, fencing, and recovery guarantees -- [pPilot CLI reference](reference/cli.md) — exact flags and exit behavior -``` - -- [ ] **Step 4: 新写 `docs/src/ppilot/get-started.md`** - -```markdown -# Get Started with pPilot - -This page runs the shortest verified pPilot loop: a streaming Python plan -executed by multiple workers, with terminal results written to a durable sink. - -## Install - -pPilot ships in the same component set as `pvisor` and `pchronicle`. From a -source checkout: - -```bash -git clone https://github.com/DeepLink-org/Persisting.git -cd Persisting -just install-cli -ppilot --version -``` - -## Define the work - -Create `plan.py`: - -```python -def plan(): - for value in range(6): - yield {"id": f"square-{value}", "value": value} - - -def execute(item): - return {"square": item["value"] ** 2} -``` - -`plan()` yields work items with stable `id`s; `execute(item)` processes one -item. Stable identity lets an interrupted job resume without repeating -completed work. - -## Run it - -```bash -ppilot run plan.py --workers 2 --per-worker 2 --sink ./results --results ndjson -``` - -## Verify the durable result - -```bash -cat ./results/ready.ndjson -``` - -Expected: six result records, one per task, with squares 0, 1, 4, 9, 16, 25 -(sum 55). A scripted version of this loop lives in -[`examples/ppilot/01-run/`](https://github.com/DeepLink-org/Persisting/tree/main/examples/ppilot/01-run). - -## Where to go next - -- [Orchestrate many Agent Runs](guides/orchestrate.md) — resume, retries, and production sinks -- [pPilot CLI reference](reference/cli.md) — `run` and `produce` flags -``` - -(注:实施时先实际运行一次该示例确认输出格式与 `ready.ndjson` 路径准确——`just install-cli` 后在临时目录执行上述命令。) - -- [ ] **Step 5: 更新 mkdocs.yml 导航** - -在 `nav:` 的 pVisor 小节之后、pChronicle 之前插入: - -```yaml - - pPilot: - - Overview: ppilot/index.md - - Get Started: ppilot/get-started.md - - Guides: - - Orchestrate many Agent Runs: ppilot/guides/orchestrate.md - - Design: - - Orchestration architecture: ppilot/design/orchestration.md - - Reference: - - pPilot CLI: ppilot/reference/cli.md -``` - -在 `nav_translations` 的 zh 段追加(`Overview`/`Get Started`/`Guides`/`Design`/`Reference` 已有翻译,勿重复添加): - -```yaml - Orchestrate many Agent Runs: 编排多个 Agent Run - Orchestration architecture: 编排架构 - pPilot CLI: pPilot CLI -``` - -- [ ] **Step 6: 验证** - -Run: `just docs-build && just docs-links` -Expected: 零警告;导航中出现 pPilot 小节;无指向旧路径的死链。若 strict 构建报告其他页面对旧路径的入链,修复链接;仅当某旧 URL 有外部收录风险时才在原位置留 redirect 桩(默认不留)。 - -- [ ] **Step 7: Commit** - -```bash -git add -A docs/ -git commit -m "docs: add pPilot section to site navigation" -``` - ---- - -### Task 3: 重写顶层 README(uv/Ruff 风格) - -**Files:** -- Modify: `README.md`(整体重写) - -- [ ] **Step 1: 核实 PyPI 发布状态** - -Run: `curl -fsSL https://pypi.org/pypi/persisting/json | head -c 200` -Expected: 返回 JSON 则已发布,README 加 PyPI 徽章;404 则不加(避免死徽章),并在 Step 2 中跳过对应行。 - -- [ ] **Step 2: 写入新 README** - -完整替换 `README.md` 为以下内容(若 Step 1 确认已发布 PyPI,在徽章行追加 -`[![PyPI](https://img.shields.io/pypi/v/persisting.svg)](https://pypi.org/project/persisting/)`): - -```markdown -# Persisting - -**Persistent infrastructure for the Agent era.** - -[![CI](https://github.com/DeepLink-org/Persisting/actions/workflows/ci.yml/badge.svg)](https://github.com/DeepLink-org/Persisting/actions/workflows/ci.yml) -[![Documentation](https://img.shields.io/badge/docs-latest-blue)](https://deeplink-org.github.io/Persisting/) -[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) - -Persisting connects durable model state—parameters and KV caches—with durable -Agent history—trajectories and execution records. The current product provides -two commands: - -- **`pvisor`** runs one Agent in a controlled environment and lets you review - its effects before accepting them; -- **`pchronicle`** browses, queries, exchanges, and serves trajectory Datasets. - -Each works on its own; together they preserve a path from execution to -queryable history. - -![Current Persisting workflows and optional integration](docs/src/assets/diagrams/persisting/system-products.svg) - -## Install - -```bash -pip install persisting[lance] -pvisor --version -pchronicle --version -``` - -The rolling nightly build installs the same commands without a Rust toolchain: - -```bash -curl -fsSL https://raw.githubusercontent.com/DeepLink-org/Persisting/main/scripts/install-nightly.sh | bash -``` - -See the [installation guide](https://deeplink-org.github.io/Persisting/installation/) -for platform requirements and executor setup. - -## Run one Agent and review its changes - -```bash -pvisor run --safe codex -pvisor review last -pvisor apply last --all # or: pvisor drop last -``` - -`--safe` stages workspace changes; nothing enters your project tree before you -accept it. The exact boundary is platform-dependent and recorded with the -Run—consult the [execution guide](https://deeplink-org.github.io/Persisting/pvisor/guides/execution/) -before treating it as a security boundary. - -## Query Agent trajectory history - -```bash -pchronicle onboard -pchronicle onboard query -pchronicle agent codex ./trajectory-data --ask "Which tools fail most often?" -``` - -The onboarding flow creates a temporary example Dataset—no source checkout -required. `pchronicle import` accepts ATIF, ACTF, and OpenAI Messages; -`pchronicle serve` starts a loopback-only, read-only Dataset UI and API. - -## Current maturity - -| Capability | Status | -|---|---| -| pVisor host execution, review, checkpoints, and transactional workspace | Implemented | -| pChronicle local/S3 catalog, bounded SQL, analysis, find, import/export | Implemented | -| pChronicle loopback-only read API and embedded Web UI | Implemented | -| Gateway capture and cooperative proxy policy | Implemented | -| Container/libkrun executors and transparent network boundaries | Platform-dependent; see the pVisor and OverlayNet docs | -| Queue and document Search | Separate stable capabilities | -| Tensor Memory / TTAS | Experimental | - -## Documentation - -- [Choose a workflow](https://deeplink-org.github.io/Persisting/overview/) — pick the entry point that matches your task -- [Run your first Agent](https://deeplink-org.github.io/Persisting/pvisor/get-started/) — the run-review-apply loop -- [Explore durable history](https://deeplink-org.github.io/Persisting/pchronicle/get-started/) — browse and query a trajectory Dataset -- [Project architecture](https://deeplink-org.github.io/Persisting/system-design/) — ownership and delivery boundaries - -Criterion.rs microbenchmarks and hyperfine lifecycle scenarios are compared -against `main` in CI; see the [benchmark contract](benchmark/pchronicle/README.md). - - -No nightly benchmark has been published with the unified report format yet. - - -## License - -[Apache License 2.0](LICENSE). See [`NOTICE`](NOTICE) for third-party -attributions and separately licensed bundled components. -``` - -注意:benchmark 标记块原样保留(含当前占位文本);`bench.py` 会更新其内容。 - -- [ ] **Step 3: 验证链接与命令** - -- 逐一核对 README 中的命令与 `--help`:`pvisor run --help`、`pvisor review --help`、`pvisor apply --help`、`pchronicle onboard --help`、`pchronicle agent --help`; -- 确认 4 个文档站 URL 路径与 `docs/src/` 实际页面一致(`overview/`、`pvisor/get-started/`、`pchronicle/get-started/`、`system-design/`)。 - -- [ ] **Step 4: Commit** - -```bash -git add README.md -git commit -m "docs: rewrite top-level README for first-time evaluators" -``` - ---- - -### Task 4: 文档站入口层打磨(中英同步) - -**Files:** -- Modify: `docs/overrides/home.html`、`docs/src/overview.md(.zh.md)`、`docs/src/installation.md(.zh.md)`、`docs/src/pvisor/get-started.md(.zh.md)`、`docs/src/pchronicle/get-started.md(.zh.md)` - -**Interfaces:** -- Consumes: Task 3 移除的 "Command ownership" 表(迁入 `overview.md`)。 - -- [ ] **Step 1: overview.md 吸收 Command ownership 表** - -在 `overview.md` 的 "Current user workflows" 表格之后插入(中英两版同步): - -```markdown -## Command ownership - -| Command | Primary responsibility | -|---|---| -| `pvisor` | One Run, environments, review, checkpoints, apply/drop | -| `ppilot` | Bounded collections of Runs: planning, concurrency, recovery, sinks | -| `pchronicle` | Dataset catalog, SQL, built-in analysis, find, import/export, read-only serving | -``` - -中文版(`overview.zh.md` 对应位置): - -```markdown -## 命令分工 - -| 命令 | 主要职责 | -|---|---| -| `pvisor` | 单个 Run、执行环境、审查、检查点、apply/drop | -| `ppilot` | 成组的 Run:规划、并发、恢复、结果汇聚 | -| `pchronicle` | Dataset 目录、SQL、内建分析、find、导入导出、只读服务 | -``` - -- [ ] **Step 2: home.html 首页检查** - -以首次评估者视角审读 `docs/overrides/home.html`:hero 文案与 README 新定位保持一致;三个 CTA 按钮目标有效;四个版块(工作流 / 五分钟上手 / 整体关系 / 继续阅读)链接全部指向存活页面。仅在发现不一致时修改,不为改而改。 - -- [ ] **Step 3: installation.md 审计** - -- 核对 `pip install persisting[lance]` 与 README 一致; -- 核对 macFUSE、libkrun、Zig 等平台要求仍然准确(对照 `justfile` 与 `crates/persisting-pvisor` 构建逻辑); -- 确认页面未提及 `ppilot` 安装——在 "CLI component set" 一节补充一句:ppilot 经 `just install-cli` 从源码安装(中英同步)。 - -- [ ] **Step 4: 两个 get-started 审计** - -`pvisor/get-started.md` 与 `pchronicle/get-started.md`:按 Get Started 契约(最短可验证成功循环、步骤可复制执行、每步有预期结果)逐行审读;实际执行其中的命令序列验证可用性;中英两版同步修订发现的问题。 - -- [ ] **Step 5: 验证 + Commit** - -Run: `just docs-build && just docs-links` - -```bash -git add -A docs/ -git commit -m "docs: polish entry-layer pages for first-time evaluators" -``` - ---- - -### Task 5: pVisor 文档区审计 - -**Files:** -- Audit: `docs/src/pvisor/` 全部页面(index、get-started、concepts×4、guides×5、design×3、reference×2,及各自已有 `.zh.md`) - -- [ ] **Step 1: 逐页应用文章类型契约** - -对每一页核对(契约全文见 `docs/README.md` "Each article type has one job" 表): - -| 检查项 | 动作 | -|---|---| -| 页面是否只回答该类型该回答的问题 | 越界内容移至正确类型页面或删除 | -| 命令示例与 `--help` 输出一致 | 运行 `pvisor --help` 逐一核对,修正漂移 | -| 有回链(owning concept/workflow)与前链(下一层) | 缺则补 | -| Design 页中 roadmap/target 内容有显式标注 | 缺则加 `!!! note "Target architecture"` admonition | -| 中英两版内容同步 | 英文改动同步进 `.zh.md`(本任务只改已有中文版的页面) | - -pVisor 命令核对清单:`pvisor run`、`review`、`apply`、`drop`、`checkpoint`(以 `pvisor --help` 实际输出为准增减)。 - -- [ ] **Step 2: 验证 + Commit** - -Run: `just docs-build && just docs-links` - -```bash -git add -A docs/src/pvisor/ -git commit -m "docs: audit pVisor section against article-type contract" -``` - ---- - -### Task 6: pChronicle 文档区审计 - -**Files:** -- Audit: `docs/src/pchronicle/` 全部页面(index、get-started、concepts×3、guides×6、design×5、reference×6,及各自已有 `.zh.md`) - -- [ ] **Step 1: 逐页应用文章类型契约** - -同 Task 5 的检查表。pChronicle 命令核对清单:`pchronicle onboard`、`import`、`export`、`agent`、`serve`、`find`、`query`(以 `pchronicle --help` 实际输出为准)。特别注意: - -- `reference/cli.md` 与 `--help` 逐条对齐(这是参考页的核心职责); -- `reference/query-model.md` 与 RFC-0012 的 find 语法一致性(以代码实现为准,RFC 仅历史参考); -- `guides/serve-gateway.md` 中 Gateway 转发/改写/捕获描述与 `crates/persisting-gateway` 实际行为一致。 - -- [ ] **Step 2: 验证 + Commit** - -Run: `just docs-build && just docs-links` - -```bash -git add -A docs/src/pchronicle/ -git commit -m "docs: audit pChronicle section against article-type contract" -``` - ---- - -### Task 7: Project、System Design 与 RFC 索引审计 - -**Files:** -- Audit: `docs/src/project/`(4 页)、`docs/src/system-design/`(4 页)、`docs/src/rfcs/index.md` - -- [ ] **Step 1: 逐页审计** - -- `project/`:engineering/releasing/examples 面向贡献者,核对命令(`just test`、`just docs-*`、发布流程)与 `justfile`、`.github/workflows/release.yml` 实际一致; -- `system-design/`:四页只回答"哪个产品拥有哪个跨产品对象/转移/失败",发现与产品页重复的实现细节则改为链接; -- `rfcs/index.md`:确认 0001–0013 索引完整(注意无 0011)、状态标注准确;在页面说明 RFC 为历史决策记录、非命令参考(英文版已有则说明一致,中文版在 Task 8 补译时体现)。 - -- [ ] **Step 2: 验证 + Commit** - -Run: `just docs-build && just docs-links` - -```bash -git add -A docs/src/project/ docs/src/system-design/ docs/src/rfcs/index.md -git commit -m "docs: audit project, system-design, and RFC index pages" -``` - ---- - -### Task 8: 双语补译 - -**Files:** -- Create(12 个 `.zh.md`): - - `docs/src/pvisor/design/gateway.zh.md` - - `docs/src/pvisor/design/isolation.zh.md` - - `docs/src/pvisor/design/overlaynet.zh.md` - - `docs/src/pvisor/reference/cli.zh.md` - - `docs/src/ppilot/index.zh.md` - - `docs/src/ppilot/get-started.zh.md` - - `docs/src/ppilot/guides/orchestrate.zh.md`(已存在——从 pvisor 移动而来,核对链接即可,不重译) - - `docs/src/ppilot/design/orchestration.zh.md` - - `docs/src/ppilot/reference/cli.zh.md` - - `docs/src/pchronicle/reference/agenticmd.zh.md` - - `docs/src/project/engineering.zh.md` - - `docs/src/project/releasing.zh.md` - - `docs/src/rfcs/index.zh.md` - -**Interfaces:** -- Consumes: Task 2 的 `ppilot/index.md`、`ppilot/get-started.md` 英文定稿;Task 5–7 审计后的英文定稿。 - -**反向对齐(Task 6 审计发现)**:以下 4 个页面的 `.md`(英文位)当前实为全中文内容,与 `.zh.md` 完全相同。本任务需将 `.md` **重写为地道英文**(以 `.zh.md` 为中文源,`.zh.md` 本身不动): -- `docs/src/pchronicle/design/catalog.md` -- `docs/src/pchronicle/design/trajectory-storage.md` -- `docs/src/pchronicle/design/storyline-lance.md` -- `docs/src/pchronicle/reference/agenticmd.md` - -- [ ] **Step 1: 翻译 pPilot 与 pVisor 页面** - -翻译规范: -- 术语保留英文:Run、Effect、Dataset、Capture、Gateway、OverlayFS、OverlayNet、lease、fencing、sink; -- 代码块、命令、文件路径不翻译; -- frontmatter 与相对链接保持与英文版一致(链接目标不本地化); -- 参照 `pvisor/guides/orchestrate.zh.md` 的既有风格。 - -- [ ] **Step 2: 翻译 pchronicle/project/rfcs 页面** - -`rfcs/index.zh.md` 中必须包含说明:RFC 正文保持英文,因为它们是历史决策快照,翻译会产生两个可能漂移的副本。 - -- [ ] **Step 3: 验证 + Commit** - -Run: `just docs-build && just docs-links`,并抽查 3 个页面的中文渲染(`just docs-serve` 或构建后检查 `docs/site/zh/` 下对应 HTML 存在)。 - -```bash -git add -A docs/src/ -git commit -m "docs: add Chinese translations for user-facing pages" -``` - ---- - -### Task 9: 组件 README 统一 - -**Files:** -- Modify(按模板套用,内容为精简对齐而非重写): - - crates(8 个):`persisting-agentctl`、`persisting-gateway`、`persisting-overlayfs`、`persisting-overlaynet`、`persisting-pchronicle`、`persisting-pchronicle-cli`、`persisting-ppilot`、`persisting-pvisor` 的 `README.md` - - examples(12 个):`examples/README.md`、`examples/data/README.md`、`examples/pchronicle/README.md` + 6 个子示例、`examples/ppilot/README.md` + 2 个子示例、`examples/pvisor/README.md` + 4 个子示例 - - benchmark(5 个):`benchmark/README.md`、`benchmark/gateway/README.md`、`benchmark/langfuse-pchronicle-review/README.md`、`benchmark/pchronicle/README.md`、`benchmark/pvisor/README.md` - - tests(3 个):`tests/regression/README.md`、`tests/regression/gateway-echo/README.md`、`tests/regression/gateway-fuzz/README.md` - - web(1 个):`pchronicle-web/README.md` -- 不动:`crates/persisting-dlcapt/README.md`(排除范围)、`crates/*/tests/fixtures/**/README.md`(fixture 数据说明)、`docs/`、`benchmark` 下非 README 文件 - -模板(按类型裁剪): - -```markdown -# <组件名> - -**<一句话职责>.** - -<边界段:拥有什么;不拥有什么(链向拥有者)。> - -## - -<命令或步骤> - -## Links - -- <文档站对应页或相邻组件> -``` - -- [ ] **Step 1: crates README(8 个)** - -逐一核对:一句话职责与 crate 实际边界一致(对照 `Cargo.toml` description 与代码);构建/测试命令可执行(如 `cargo build -p persisting-pvisor --bin pvisor`);链向文档站对应 Design 页。`persisting-ppilot/README.md` 已有较好的职责段,保留主体、补 Links 段。 - -- [ ] **Step 2: examples README(12 个)** - -每个示例 README 核对:`run.sh` 可执行、预期输出描述与实际一致(抽查 `examples/ppilot/01-run/run.sh` 与 `examples/pvisor/01-filesystem-isolation/run.sh`);顶部有一句话"问题:…可复现结论:…"(现有风格,保留并统一)。 - -- [ ] **Step 3: benchmark 与 tests README(8 个)** - -核对复现命令与 `justfile` 配方一致(`just benchmark-pvisor`、`just benchmark-gateway` 等);报告契约说明与 `benchmark/pchronicle/bench.py` 实际输出一致。 - -- [ ] **Step 4: pchronicle-web README** - -核对开发命令(`npm`/`pnpm` 脚本)与 `pchronicle-web/package.json` 一致;补边界段(embedded Web UI 的前端源,构建产物由 `persisting-pchronicle` 嵌入——以代码实际为准)。 - -- [ ] **Step 5: Commit** - -注意:工作区可能存在用户的未提交 WIP(如 `crates/persisting-pchronicle/src/`),**禁止 `git add -A crates/`**,只精确添加 README 文件: - -```bash -git add crates/*/README.md crates/persisting-gateway/tests/README.md \ - examples/ benchmark/ tests/regression/ pchronicle-web/README.md -git status --short # 确认暂存区只有 README 与 examples/benchmark/tests 文档改动 -git commit -m "docs: standardize component READMEs on ownership template" -``` - ---- - -### Task 10: i18n 检查脚本与最终验收 - -**Files:** -- Create: `scripts/check-docs-i18n.py` - -- [ ] **Step 1: 创建检查脚本** - -```python -#!/usr/bin/env python3 -"""Fail if any translatable docs page lacks a Chinese counterpart. - -RFC bodies (historical decision records) and Queue-subsystem pages -(out of documentation scope per AGENTS.md) are intentionally English-only. -""" -from pathlib import Path -import sys - -SRC = Path(__file__).resolve().parent.parent / "docs" / "src" - -EN_ONLY = { - "api/index.md", - "api/queue.md", - "guide/custom-backends.md", - "guide/queue.md", -} - -def is_translatable(rel: str) -> bool: - if rel in EN_ONLY: - return False - if rel.startswith("rfcs/") and rel != "rfcs/index.md": - return False - return True - -missing = [] -for page in sorted(SRC.rglob("*.md")): - if page.name.endswith(".zh.md"): - continue - rel = page.relative_to(SRC).as_posix() - if not is_translatable(rel): - continue - if not page.with_name(page.name[:-3] + ".zh.md").exists(): - missing.append(rel) - -if missing: - print("Missing Chinese translations:") - for rel in missing: - print(f" {rel}") - sys.exit(1) -print("All translatable pages have Chinese counterparts.") -``` - -- [ ] **Step 2: 运行脚本** - -Run: `python3 scripts/check-docs-i18n.py` -Expected: `All translatable pages have Chinese counterparts.`(若有遗漏,回到 Task 8 补齐) - -- [ ] **Step 3: 最终验收清单** - -依次执行并确认: -1. `just docs-build` — 零警告; -2. `just docs-links` — strict 通过; -3. `python3 scripts/check-docs-i18n.py` — 通过; -4. README 链接可达性:核对 4 个 Pages URL 与 `docs/src/` 页面一一对应; -5. 归档完整性:`docs/src/` 下不再存在 `design/`、`dev/`、`quickstart.md`;`git log --follow docs/archive/legacy-nav/design/index.md` 可见历史延续; -6. `git status` — 工作区干净,全部改动已提交。 - -- [ ] **Step 4: Commit** - -```bash -git add scripts/check-docs-i18n.py -git commit -m "docs: add i18n coverage check for documentation site" -``` - ---- - -### Task 8b: 叙事对齐(宣发主角决策后的入口层修订) - -**背景**:用户在执行期间确认了宣发主角为**链路**——"从执行到可查询历史的完整基础设施"。叙事原则(来自用户提供的分析):pVisor 对外一句话定位收敛为"产生可持久化、可审查事实的执行器";不并列多个旗号;强调 run → review/apply → capture → 可查询 Dataset 的贯通路径,同时保留"两者可独立使用"的灵活性说明。 - -**Files:** -- Modify: `README.md`、`docs/src/overview.md(.zh.md)`、`docs/overrides/home.html` - -- [ ] **Step 1: README 叙事调整** - -保持 uv/Ruff 式简洁,仅调整叙事层: -- 开篇定位段:从"two commands"并列改为链路叙事——pVisor 让 Agent 执行产生可审查的事实(staged Effects、执行记录),pChronicle 让这些事实成为可查询的历史;两者各自独立可用,连起来构成从执行到查询的完整路径; -- 两个快速上手小节保留,在 pChronicle 小节末尾或其后增加一行贯通提示(capture 配置后 pVisor Run 事件可进入 pChronicle Dataset,链向 `pvisor/guides/capture/`); -- 不重排成熟度表、不动 benchmark 标记块。 - -- [ ] **Step 2: overview.md 叙事调整** - -- "Optional integration" 一节升级表述:从"可选集成"改为"贯通路径"(the throughline),作为页面叙事收束而非附属说明;"两者独立可用"保留为灵活性说明而非开场主张; -- 中英同步。 - -- [ ] **Step 3: home.html hero 检查** - -hero 已有 "One persistence story, two ways to start" 与 "Composable, not a mandatory pipeline" 版块——按链路主角口径审视:"Composable, not a mandatory pipeline" 的措辞强调"非强制流水线",与链路主角叙事张力过大时,调整为"独立可用,连通更强"类表述(保持事实准确:两者确实可独立使用)。中英同步。 - -- [ ] **Step 4: 验证 + Commit** - -Run: `just docs-build && just docs-links` - -```bash -git add README.md docs/src/overview.md docs/src/overview.zh.md docs/overrides/home.html -git commit -m "docs: align entry narrative on the execution-to-history throughline" -``` - ---- - -## Self-Review 记录 - -- **Spec 覆盖**:规格第 3–8 节分别映射到 Task 3、1/2/4、5–7、8、9、10;规格第 9 节实施顺序与 Task 1–10 顺序一致。无遗漏。 -- **占位符扫描**:Task 5–7 的审计类步骤以检查表 + 命令清单为可执行内容(审计工作的产出取决于逐页读到的现状,无法预先给出定稿文案);所有新建内容(README、ppilot 页面、脚本、nav YAML)均含完整文本。 -- **类型一致性**:`ppilot/index.md`/`get-started.md` 在 Task 2 定义英文定稿,Task 8 消费同一文件名;`check-docs-i18n.py` 的排除清单与 Global Constraints 的排除范围一致。 diff --git a/docs/superpowers/reviews/2026-08-23-four-page-prototype-review.md b/docs/superpowers/reviews/2026-08-23-four-page-prototype-review.md deleted file mode 100644 index 084a1368..00000000 --- a/docs/superpowers/reviews/2026-08-23-four-page-prototype-review.md +++ /dev/null @@ -1,168 +0,0 @@ -# 四页原型 review:还不理想的地方 - -> Review 对象:`pchronicle-four-pages.html` 中的 Overview / Explore / Traces / Analysis 四页原型。 -> 判断标准:昨天讨论的新品类方向——Agent 的飞行记录仪 + 时间旅行调试器,而不是 observability dashboard。 - -## 整体判断 - -这个原型的骨架是对的:dataset snapshot → source → traces → analysis 的主线清晰,pin-to-compare 和 evidence/interpretation/limitation 三段式结论都是好结构。但**它仍然被 observability dashboard 的语言主导**——时间序列 KPI、"Behavior health"、"terminal failures"、"latency P95"——这些词适合监控在线服务,不适合分析离线语料。 - -如果 pChronicle 要开新品类,最大的一块缺口在 **Trace 页**:它现在还只是"turn 列表 + 摘要",没有提供"模型在那一刻看到了什么"的状态重建,也没有 scrubber/断点/重放。真正的新形态要在这里发生。 - ---- - -## Overview 页 - -![Overview 原型](./assets/pc-proto-overview.png) - -### 做得对的 - -- Dataset snapshot + sources/projection/coverage 状态条非常好,把"数据就绪性"变成了一等概念。 -- Signals 列表直接给出可点击的调查入口(Repeated tool loop / Missing terminal event / Task completion drift),这比图表更接近"调试器"心智。 -- Cohort 表格(agent-v3 vs agent-v4)是页面下半部分最值钱的内容,但它被压在了 fold 下面。 - -### 还不理想 - -1. **"Outcome and behavior trend" 用日期横轴是错的心智模型** - - 这批数据是 import 的 corpus / benchmark 结果,不是按天流动的生产流量。日期条形图暗示"服务随时间变化",但用户真正想问的是"v4 比 v3 差在哪"。 - - 建议:把 cohort 对比做成页面的核心图,按 agent_version / model / source 分组,而不是按日期。 - -2. **KPI 卡片的语言还是 monitoring 的** - - "Traces 1,284 +9.4% from prior period"、"Latency P95" 对离线分析没有解释力。 - - 建议:改成"v3 vs v4 完成率差 8.1pt"、" tool loop 影响 42 条 traces"、"82 条 traces 缺业务指标被排除"。每个数字都指向一个可调查的 cohort 或 signal。 - -3. **Signals 的 badge 颜色语义弱** - - "3 active" 是 warn 色,但三个 signal 里只有 Missing terminal event 是 capture 问题,另外两个是行为问题。混在一起会让用户误判优先级。 - ---- - -## Explore 页 - -![Explore 原型](./assets/pc-proto-explore.png) - -### 做得对的 - -- Source inventory 表把 format / revision / projection / state 放在一起,符合 data lineage 需求。 -- Treemap 给了源规模的直观感受。 - -### 还不理想 - -1. **Explore 页缺少"问题意识"** - - 用户来这一页不是想看方块大小,而是想确认"我的数据能不能回答我想问的问题"。 - - 建议:右侧 selected source 面板除了 metadata,应该列出"基于该 source 可问的典型问题"或"已知限制"(例如 OpenAI messages source 的 60 条 trace 有 1 issue,具体是什么 issue?能不能一键修复?)。 - -2. **Treemap 颜色无意义** - - 当前所有 tile 都是同一蓝色,只是按大小分。颜色应该编码 agent_version、format 或 readiness state——让"哪块数据有问题"一眼可见。 - -3. **"Analyze dataset" 和 "Open traces" 两个按钮没有区别感** - - 从 Explore 打开 Traces 后用户要干什么?从 Explore 打开 Analysis 后又该问什么?入口需要带默认问题/scope,而不是空跳。 - ---- - -## Traces 页 - -![Traces 原型](./assets/pc-proto-traces.png) -![Trace diff 原型](./assets/pc-proto-diff.png) - -### 做得对的 - -- Pinbar + "Compare with pinned" 是极好的交互。它让"同一 root 下两个版本对比"变成了显式操作,不再是 power user 的暗能力。 -- Diff 视图用 changed / repeated / added 标注,直接对应用户想找的因果线索。 - -### 还不理想 - -1. **单条 trace 的详情仍然是事件摘要,不是调试器** - - 当前详情区只有 user/agent/tool 的简短摘要 + token/latency 条。用户点进来真正想问的是:"模型在第 17 步为什么会调用 execute_bash 5 次?" - - 缺的核心原语:**步进 scrubber + 该步的上下文重建 + 与上一步的 diff 高亮**。这是昨天"时间旅行调试器"形态的关键,原型里完全没有。 - - 建议:详情区至少有两个 tab:Summary(当前)和 Replay/Context(新)。Replay tab 用底部 scrubber,主区域显示模型在该步看到的完整上下文,新增消息高亮。 - -2. **Behavior signals 列没有链接到具体位置** - - "tool loop" badge 在列表里只是一枚标签,点击后应该直接跳到 trace 中 loop 发生的 step,并把上下文展开。 - -3. **Pinbar 的 copy 太弱** - - "Pin another trace while browsing" 没有说明价值。建议改成"Pin a second trace to diff against",并自动推荐同一 root 的其他 run。 - ---- - -## Analysis 页 - -![Analysis 页下半部原型](./assets/pc-proto-analysis-bottom.png) - -### 做得对的 - -- "Reviewed plan → Evidence → Interpretation" 三段式是核心竞争力。它把 LLM 分析的可验证性做进了界面(Observed / Inference / Limitation)。 -- Advanced SQL 可展开,兼顾平民用户和 power user。 - -### 还不理想 - -1. **Schema 浏览器占用了左侧主边栏** - - 分析流程的起点是问题("Why did task completion fall..."),不是表结构。把 schema 放在默认展开位置,会让首次进入的用户困惑。 - - 建议:左侧边栏默认折叠,或在 question 输入框里提供"schema 提示"(例如 `@` 唤起字段),只在编辑 SQL 时才展开完整 schema。 - -2. **"Promote rule to Signal" 被埋在底部** - - 这个动作其实是分析闭环的关键:把一次调查得到的规律变成可复用的检测规则。但它和 "Export evidence report"、"Rerun on new snapshot" 并列,视觉权重相同。 - - 建议:把 "Promote to Signal" 作为 Evidence 卡片的主要 action,甚至可以叫 "Watch this"——让分析产出自动回流到 Overview 的 signals 列表。 - -3. **Interpretation 的三种状态需要更强的 epistemic 设计** - - 现在 Observed / Inference / Limitation 只是三个小标题。Limitation("82 traces excluded")和 Inference("candidate explanation")的置信度差异很大,但视觉上平级。 - - 建议:给每个结论加置信度标识,例如 Observed = 已验证(绿色),Inference = 待验证(黄色,可点击"在 traces 中验证"),Limitation = 已知缺口(灰色)。 - ---- - -## 跨页问题 - -1. **Snapshot 概念很重要,但只在 header 作为 badge 出现** - - 如果 pChronicle 要往"飞行记录仪"走,snapshot 应该可命名、可比较、可在新 snapshot 上重跑 analysis。现在它像是一个只读时间戳。 - -2. **Rail 里 "Copilot" 的身份不清晰** - - 它是全局浮层?是某一页?图标是一颗菱形,用户不知道点开会发生什么。如果 Copilot 是"在任意页问我一个问题",应该做成 FAB 或右下角面板,而不是和四页并列的 nav item。 - -3. **"Read only" badge 是防御性文案** - - 对本地文件系统来说 read-only 是合理的,但 badge 本身没有解释 why 或 what I can do。建议改为更积极的说明:"Local snapshot · refresh to update",并把刷新频率/手动刷新入口放在一起。 - -4. **Overview / Explore / Traces / Analysis 的命名对新人不够自解释** - - 尤其是 Explore 和 Overview 容易混淆。如果按新品类重新命名,可以考虑: - - Overview → Summary(或 Health → 但 avoid monitoring connotation) - - Explore → Sources(数据血缘) - - Traces → Inspector(调试器语义) - - Analysis → Ask(问题驱动) - - 命名改动有成本,但方向是减少 dashboard 暗示、增加 debugger/lab 暗示。 - ---- - -## 与品类方向的对齐 - -| 新品类方向 | 原型现状 | 下一步 | -|---|---|---| -| 数据:完整录制 = 黑匣子 | snapshot/source lineage 已有 | 让 snapshot 可命名、可比较、可重跑 analysis | -| 回放:任意步的状态重建 | 只有 turn 摘要 | 加 scrubber + context reconstruction + step diff | -| 断点:SQL 即条件 | Signals 列表已出现 | 把 signal 和 SQL plan 打通,signal 从 analysis 一键 promote | -| 实验:fork & rerun | Compare diff 已有 | 从 diff 直接跳到"在 v3 的 prompt/工具结果下重跑 v4"的实验入口 | - ---- - -## 优先级建议 - -**P0 — 改心智模型,不是改样式** -- Overview 移除日期趋势图,把 cohort 对比(agent-v3 vs v4)提升为核心视图。 -- 所有 KPI 文案从"monitoring 指标"改为"调查入口"。 - -**P1 — 把 Trace 页从"查看器"改成"调试器"** -- 单条 trace 详情增加 Replay/Context tab:scrubber + 上下文重建 + diff 高亮。 -- Behavior signals badge 可点击跳转到对应 step。 - -**P1 — 理顺 Analysis 的入口和信息层级** -- Schema 默认折叠;问题输入区更突出。 -- "Promote to Signal" 提升为 Evidence 卡片主 action。 -- 给 Interpretation 加置信度/验证状态。 - -**P2 — 跨页一致** -- Snapshot 可比较、可重跑。 -- Copilot 不要放在 rail 里。 -- Explore 的 source tile 用颜色编码状态/格式。 - ---- - -## 一句话 - -这个原型已经站在了正确的结构(snapshot → source → traces → analysis)上,但**设计语言还没从"监控大屏"切换到"飞行记录仪/调试器"**。最大的单一改进是:**让 Trace 详情页支持步进 + 上下文重建 + step diff**——做到这一点,整个产品的品类主张才会在界面上成立。 diff --git a/docs/superpowers/reviews/2026-08-23-frontend-product-review.md b/docs/superpowers/reviews/2026-08-23-frontend-product-review.md deleted file mode 100644 index e34236e2..00000000 --- a/docs/superpowers/reviews/2026-08-23-frontend-product-review.md +++ /dev/null @@ -1,104 +0,0 @@ -# pChronicle 前端产品整体 review - -日期:2026-08-23 -范围:运行中的 Dioxus WASM 前端(当前命令为 `pchronicle serve ./data`,26 runs 真实数据)+ 已收敛的产品方向(时间旅行调试器叙事 v2) -方法:agent-browser 逐页实测截图(8 张,存 `assets/2026-08-23-frontend/`) - -![Catalog 页:单数据集 tile 拉伸撑满](assets/2026-08-23-frontend/pc-fe-1-catalog.png) - -![Runs 页](assets/2026-08-23-frontend/pc-fe-2-runs.png) - -![Analyze 页](assets/2026-08-23-frontend/pc-fe-3-analyze.png) - -![详情页 Trace](assets/2026-08-23-frontend/pc-fe-4-detail.png) - -![详情页 Steps 视图](assets/2026-08-23-frontend/pc-fe-5-steps.png) - -![展开 step 仅一行摘要 + 0 ev](assets/2026-08-23-frontend/pc-fe-7-turn-expand.png) - -![Copilot 抽屉](assets/2026-08-23-frontend/pc-fe-6-copilot.png) - -![详情页 Analysis tab](assets/2026-08-23-frontend/pc-fe-8-detail-analysis.png) - -## 结论摘要 - -当前前端是一个**完成度不错的 trajectory workbench**:Data / Runs / Analyze 三段式清晰,SQL 工作台扎实,详情页的指标与组成分析信息量大。但它整体讲的是 **observability 语言**("检查执行、延迟、显式失败"),而不是已经定稿的**时间旅行调试器语言**("模型在那一刻看到了什么")。最硬的两处证据: - -1. 详情页点开一个 step,展开的只有一行摘要和 "0 ev"——**数据层录了完整上下文,界面上却看不到任何重建**; -2. 详情页第一眼看到的是 UUID 和 ACTIVE 状态——**第一视角是系统,不是模型**。 - -界面骨架是对的四段(Data → Runs → 详情 → Analyze),但每一段的叙事都还是旧的。 - -## 现状地图(实测) - -| Rail | 页面 | 实测状态 | 截图 | -|---|---|---|---| -| Data | Catalog 数据集树 | 单数据集时 tile 拉伸撑满整屏(视觉破损) | pc-fe-1 | -| Runs | run 列表 + 路径树 | 正常,表格信息完整 | pc-fe-2 | -| Analyze | 问题 + SQL 编辑器 + catalog 侧栏 | 正常,starting points 好 | pc-fe-3 | -| Runs → 详情 | 指标行 + 组成卡 + Trace(Chats/Steps) / Analysis tab | 功能在,叙事旧 | pc-fe-4/5/7/8 | -| Copilot | 抽屉,read-only | 需要配置模型才能用 | pc-fe-6 | - -## 发现(P0 / P1 / P2) - -### P0 — 直接破损或与新品类主张正面冲突 - -**P0-1 Catalog 页大蓝块(pc-fe-1)—— ✅ 已修复(2026-08-23)** -`default` 数据集 tile 拉伸占满整个视口,只剩 "default" 字样和角标 "26"。疑似 grid `minmax` + 单卡片时的布局 bug。作为用户进入应用的第一屏(默认 page=catalog),这是门面问题。 - -修复:根因在 treemap——`children ≤ 2` 时单 tile 必占满 `flex:1` 的容器。`CatalogMosaic` 在子项 ≤2 时切换为 compact 卡片模式(260×120 固定卡片流),`catalog.rs` + `catalog.css`。验证截图 `pc-fix-1-catalog.png`。 - -**P0-2 详情页看不到"模型所见"(pc-fe-7)—— ✅ 已修复(2026-08-23)** -展开 step #4 得到的只有一行内联摘要(`AGENT #4 autonomous I'll start by exploring…`)+ "0 ev"。warehouse 里明明录着该步完整上下文(evidence SQL 可查),界面却不做重建。这是 v2 叙事的核心原语("回到那一刻是字面操作")在现有界面上**完全缺席**——不只是没做,而是当前 UI 结构里没有它的位置。 - -修复:新增 **Context at this step** 上下文重建面板——打开任一 turn 时,从 `/api/storyline` 拉取完整录制轨迹,按顺序重放该步之前的全部消息(角色 chip + #id + 字数 + 长文可展开),底部标注 "turn #N decided with the context above ↓"。改动:`model.rs`(`StorylineSnapshot`)、`api.rs`(`storyline()`)、`workspace.rs`(独立加载、不阻塞主工作区、失败静默降级)、`components.rs`(`ContextRebuild`/`ContextMessage` + 切片单测)。验证截图 `pc-fix-2-context.png` / `pc-fix-3-context-open.png`(展开 system prompt 全文可见)。 - -### P1 — 叙事与信息架构偏差 - -**P1-1 详情页 header 是系统语言(pc-fe-4)** -标题是 session UUID + ACTIVE badge + root id。用户在调试时脑子里想的是"这个 agent 在执行什么任务、哪一步出了问题",界面却不回答。建议:标题放任务首句(user turn 0),UUID 降级为小字。 - -**P1-2 EVIDENCE 列全 "0 ev" 无降级(pc-fe-4/5)** -该数据集所有 chat/step 的 evidence 均为 0,列形同虚设但占着宝贵宽度。空态应隐藏列或明确说明"该数据未捕获 events",而不是让用户面对一列零。 - -**P1-3 详情页左侧 Run paths 树空间浪费(pc-fe-4)** -已进入单条 run 的详情,左栏仍是完整的路径树(26 个节点),与本页任务无关。这列正是未来 **step 导航 / 时间轴**该在的位置(对应调试器原型的左栏)。空间被导航占用,核心工作面反而没有。 - -**P1-4 "Analyze this run" 入口关系含糊(pc-fe-4)** -详情页内已有 Analysis tab(pc-fe-8),顶部又有 "Analyze this run" 按钮跳全局 Analyze 页。三个"分析"入口(详情 tab、顶部按钮、rail Analyze)职责边界不清。应明确:详情 Analysis tab = 该 run 的自动画像;按钮 = 携带 scope 跳转到 SQL 工作台。 - -**P1-5 Copilot 是旁观者,不是现场工具(pc-fe-6)** -Copilot 自述 "Read-only · minimal evidence",未配置模型时是空抽屉。按 v2 叙事,自然语言入口应该嵌在"现场"里("在 step N 问为什么"),而不是一个与当前步无关的全局抽屉。现状它与用户选中的 step/turn 没有联动。 - -### P2 — 打磨项 - -- **P2-1** 键盘操作只有 `⌘J`(Copilot)。详情页应支持 `←/→` 或 `j/k` 步进——时间旅行的标志性交互目前一个键都没有。 -- **P2-2** Runs 表 Session 列是截断 UUID,无可读标识(pc-fe-2)。可加任务首句作为副标题。 -- **P2-3** Sequence/Occupancy strip 是时间轴的雏形(pc-fe-4/5),但语义是 "occupancy" 且不可拖——距 scrubber 一步之遥,值得重构成可交互时间轴。 -- **P2-4** Coverage 卡片里 "unavailable 6"(MODELS)这类裸词无解释,需 tooltip 或文案说明。 -- **P2-5** rail 图标用字符(▣◫⌁◇),与四页原型的 SVG 图标体系不一致,视觉语言有代差。 - -## 与时间旅行调试器叙事的对齐度 - -| 叙事主张(v2) | 现有前端最接近的落点 | 差距 | -|---|---|---| -| 回到那一刻是字面操作 | Sequence strip + 展开 step | 无上下文重建,无 scrubber | -| 界面以模型视角为第一视角 | 无 | header/详情全是系统视角 | -| 每个异常是入口 | EXPLICIT ERRORS 指标卡 | 只是数字,不可点 | -| 断点设在条件上 | Analyze 页 SQL | SQL 能力在,但未与轨迹视图联动(查询结果无法"跳到现场") | -| fork 重演验证因果 | 无 | 全新能力 | - -**判断:现有前端与新品类方向不冲突,但还停留在它的"走廊层"。** Data/Runs/Analyze 三段是通往现场的走廊,质量够用(除 P0-1);真正缺的是"现场"本身——详情页需要从"证据陈列"升级为"时间旅行调试"。这与四页原型 review、调试器原型的结论一致。 - -## 建议行动序 - -1. **P0-1**(半天):修 catalog 单卡片拉伸 bug —— 门面。 -2. **P0-2**(核心迭代):详情页 step 展开 → 上下文重建面板(对齐调试器原型 Context tab)。这是新品类的第一块基石,优先于一切 P1。 -3. **P1-3 + P2-3**(同一迭代):详情页左栏改 step 列表,sequence strip 升级为可拖 scrubber——把调试器原型的左栏和底栏落进真实页面。 -4. **P1-1/P1-2/P1-4/P1-5**:叙事与入口清理,随 #3 一起改。 -5. P2 项随时穿插。 - -## 遗留风险 - -- 详情页改造会触碰 `workspace.rs`(1862 行,单文件巨石)——改 step 列表/scrubber 时建议先拆组件,否则回归面大。 -- "0 ev" 数据集说明本地样例数据证据覆盖率低,调试用数据需要一份含完整 events 的样例,否则上下文重建做出来也看不到效果。 diff --git a/docs/superpowers/reviews/2026-08-23-pchronicle-design-review.md b/docs/superpowers/reviews/2026-08-23-pchronicle-design-review.md deleted file mode 100644 index f1da4941..00000000 --- a/docs/superpowers/reviews/2026-08-23-pchronicle-design-review.md +++ /dev/null @@ -1,294 +0,0 @@ -# pChronicle 设计与实现深度评审 - -> 视角:分布式系统与存储。重点:过度设计识别与"刀法"建议。 -> 范围:`crates/persisting-pchronicle`(约 109 个 Rust 文件)+ `crates/persisting-pchronicle-cli`(约 7.3 万行合计,含测试)。 -> 日期:2026-08-23 - ---- - -## 0. 一句话总评 - -pChronicle 的**核心数据模型和写入路径是健康的**(append-only events → 单向投影 → Lance 三表),但它在三个维度上系统性超配:**用多写者分布式协议保护一个单机嵌入存储、用 9 种格式服务一个 1:1 的 schema、用手写查询优化器绕过已有的成熟优化器**。估算总代码中约 1.2–1.5 万行(近 20%)服务于边际收益极低的需求,且这些复杂度集中在最容易腐烂的并发协议与格式转换上。 - -## 1. 架构骨架(先说清楚它是什么) - -``` -capture 回调 - → append_queue(有界 mpsc + 专用线程 + 2-worker tokio runtime) - → events.lance(per-run,append-only,事实层) - → projection(单向投影为 StorylineDocument) - → storyline store(runs/steps/tool_calls 三表 + objects.lance 内容寻址) - → CURRENT 指针 CAS 发布 -读取:DataFusion (ChronicleQueryEngine) → DocumentSourceImpl → 4 种 datasource -CLI/server:import/export、query、explorer HTTP API、acceleration 内存索引、analysis compile -``` - -亮点(必须承认做得好的部分): - -- ** Lance 单引擎决策正确**。没有自研存储格式,MVCC/索引/compaction 全部复用 Lance,Arrow/DataFusion 打通内存与查询。这是整个项目最值钱的一个取舍。 -- **trait 使用克制**。crate 自有 trait 仅 2 个(`ChronicleEventRecordExt`,`formats/events.rs:48`;`QueryDocumentSource`,`document_source.rs:28`,pub(crate)),没有 trait 爆炸。注:另有 5 处 `impl TableProvider`(storyline/datafusion、catalog/provider、files、events/datafusion、agenticmd_datafusion),那是对 DataFusion 外部 trait 的实现而非自有抽象——但它们正是 §2.6 合并刀口的对象,两处结论自洽。 -- **写入路径的 epoch fence 思路正确**:旧 epoch 只能产生垃圾、不能产生可见数据。 -- **测试文化健康**:CLI 层测试与实现约 2:1,且以端到端行为测试为主(import 原子性、预算截断、错误策略),不是镜像内部结构的脆测试。 - -问题不在骨架,在骨头上长的赘肉。以下按"砍掉的收益/风险比"排序。 - ---- - -## 2. 过度设计清单(按动刀优先级排序) - -### 2.1 多写者分布式 lease 协议保护单机存储 —— 最大的刀口 - -**现状与证据**: - -| 组件 | 行数 | 职责 | -|---|---|---| -| `store/writer_control.rs` | 628 | 完整 writer lease:acquire/renewal/takeover/CAS publish | -| `store/events/manifest.rs` | 1006 | epoch fence + 分层 segment 压缩 + 64 次 CAS 重试 | -| `store/run_control.rs` | 858 | per-run lease/commit CAS | -| 其他 | — | root_write_lock、dataset_write_lock、index_build_gate、append_queue 双检 | - -加起来 **2500+ 行并发协议代码**,外加 4 组 `#[cfg(test)]` 全局 barrier/故障注入 hook——分布在 `store/storyline/mod.rs:292-317`(`CREATE_AFTER_EMPTY_READ_BARRIER`、`REPLACEMENT_AFTER_CURRENT_READ_BARRIER`)和 `projection/storyline.rs:28-32`(`BUILD_BEFORE_PUBLICATION_BARRIER`、`PROJECT_SOURCE_READ_FAILURE`)——**并发协议复杂到必须注入故障注入点才能测试,这本身就是复杂度失控的信号**。 - -**为什么过了**:对象存储后端(s3://az://gs://)是这套协议唯一真正的存在理由,而它只是 `open_uri` 注释里预留的插件点(`store/mod.rs:435-439`)。单机嵌入场景下,代码里其实**已经存在正解**:`acquire_write_guard` 的 flock(`store/mod.rs:504-539`)+ `write_local_current` 的原子 rename(L1535)。lease/takeover/CAS 全部是在为一个尚未接入的后端买单。 - -**刀法**: -- 现在:本地路径走 flock + rename,writer_control 整体降级为一个 feature-gated 模块或直接删除,对象存储支持声明为"roadmap"。省约 1000–1500 行,并消掉全部 takeover/cleanup 分支和故障注入 hook。 -- 真到接 S3 那天:用 Lance 自身的外部 manifest store(它本来就支持 commit 抽象),不要自己写 CAS 协议。 -- **原则**:分布式协议的复杂度不能"预埋"。预埋的协议代码不是资产,是每轮重构都要搬运的负债。 - -### 2.2 9 种数据表示、5 种轨迹表示 —— schema 是 1:1 的,表示却是 1:5 的 - -**口径说明**:`DocumentFormat` 枚举为 7 个变体(`format.rs:11-26`:CanonicalEvent / Storyline / StorylineLance / AgenticMd / Atif / OpenaiMsg / Actf);"9 种"的完整口径 = 7 个登记变体 + 2 个未登记表示(`formats/llm.rs` 的 LLM payload、`convert/actf.rs` 内藏的 OpenClaw 事件日志子格式)。另有 3 种控制面 JSON(manifest / CURRENT / run-control)未计入。 - -**证据**(`format.rs:11-26` + 逐字段对比): - -- **Storyline JSON ≈ ATIF,几乎是字段改名**。`AtifStep{step_id, timestamp, source, message, reasoning_content, ...}` 对照 `StorylineTurn{id, ts, src, msg, reason, ...}`(`formats/storyline.rs:121-161`),`lib.rs:5` 自认"与 ATIF v1.7 对齐"。`convert/atif.rs` 943 行大部分在做 rename + 短键映射。 -- **ACTF 概念泄漏进 hub**:`StorylineTaskResult`(storyline.rs:364-393)的 `correct/final_answer/ground_truth/score/...` 14 个字段是纯 benchmark 打分语义,hub 被 ACTF 污染。 -- **ACTF 内部还藏着第三种格式**:untagged `ActfTrajectoryWire::Events` + `convert/actf.rs:297-587` 的 openclaw_* 函数族,一个未被 `DocumentFormat` 承认的 event-log 格式。 -- **边界混乱**:openai_msg 的双向转换不在 `convert/` 而在 `formats/openai_corpus.rs`(含约 450 行反向 synthesize);`pointer_join` 出现 3 次、`message_text` 2 次、`insert_*_map` 3 份。 -- **文档与实现矛盾**:lib.rs 声称 events→Storyline 是单向投影,但 `storyline_to_events` 存在并被 `store/catalog/mod.rs:413,430` 用于重建 events。 - -**刀法**:交换格式 5 砍到 2——保留 **ATIF**(外部标准,Harbor RFC 0001)和 **AgenticMD**(人类可读)。Storyline JSON 退化为内部类型别名(不再作为交换格式暴露),ACTF/OpenAI Msg 语料移出核心、降级为独立 import 工具或声明有损导入。省约 3000 行,且 hub schema 从此只需要对齐一个外部标准。 - -### 2.3 unknown_fields 机制:2500+ 行为一个弱需求 - -**证据**:`formats/unknown_fields.rs` 1318 行,实现"把源格式中 hub 不认识的字段按 `(source_format, document_id, JSON pointer)` 三元组保留、导出时写回原位置",外加每个转换器里的寄生 capture/restore 逻辑(actf.rs:664-836 约 170 行、openai_corpus 约 250 行、agenticmd restore),总成本 **2500+ 行**。 - -**为什么过了**:同 crate 里 `atif.rs:30-31` 已经用 `#[serde(flatten)] unknown: Map` 廉价解决了同一问题;而且 `storyline.rs:19` 全部结构体 `deny_unknown_fields`——**权威模型本身根本不需要这套保留机制**。为一个"roundtrip 不丢陌生字段"的弱需求付出一套分布式追踪级别的基础设施。 - -**刀法**:全面改用 `#[serde(flatten)]` 的 per-struct unknown map(同 format 内 roundtrip 即可),跨格式转换时仅告警不保留。省 2000+ 行,语义对 99% 用户无差别。 - -### 2.4 acceleration.rs:手写了一个 miniature 查询优化器 - -**证据**:`crates/persisting-pchronicle-cli/src/server/acceleration.rs` 1762 行(**CLI crate 的 server 子模块,非核心存储 crate**)——用 sqlparser 解析用户 SQL(`AnalyzedQuery`),保守注入 `_file_ IN (...)` 谓词做 source 裁剪;自建三套内存索引(run 摘要缓存、run 路由索引、上限各 100 万行的 value→source 指纹索引)。其注释声明 persistent Catalog 仍是 source of truth、裁剪失败时回退原查询,即它是一个保守可降级的加速层——位置与可降级性使其影响面小于核心查询引擎内嵌优化器,但不改变下面的结论。 - -**为什么过了**:DataFusion 自带谓词下推与分区裁剪,Lance 自带标量索引。手写 SQL 重写器是在和一个成熟优化器赛跑,而且只能"保守地"跑——典型的负和博弈:写 1762 行,换来的是 DataFusion 升级时必须跟着维护的 AST 分析代码。 - -**刀法**:`_file_` 裁剪下推给 DataFusion/Lance;value→source 映射持久化为一张小物化表,用普通 SQL join 实现;run 摘要缓存退化为简单的 TTL cache。省约 1400 行。 - -### 2.5 "分析"功能的三份实现 - -同一个"按 agents/models/tools 维度聚合"的需求(证据链完整,均可直接跳转): - -1. CLI 的 4 条硬编码 SQL 常量:`pchronicle-cli/src/lib.rs:1944-2028`(`ANALYSIS_OVERVIEW_SQL` / `ANALYSIS_AGENTS_SQL` / `ANALYSIS_MODELS_SQL` / `ANALYSIS_TOOLS_SQL`,由 L1852-1855 的 `AnalysisCommand` 分派消费) -2. `pchronicle-cli/src/server/explorer.rs` 的 Rust 侧聚合:`analyze`(L440)+ `dimension_aggregates`(L782),直方图/百分位/维度聚合 -3. spec→SQL 编译管线:`analysis_compile.rs`(核心 crate)+ 前端 `analysis.rs`(2538 行) + `analysis_session.rs`(2332 行) + `analysis_agent.rs`(1528 行) - -**刀法**:统一到 analysis compile 管线(它已有 stale_snapshot/EXPLAIN 校验,最严谨),CLI `analysis` 子命令改为调 compile,删硬编码 SQL 与 explorer 的 Rust 聚合。顺带把 `analysis_compile.rs`(1068 行)从存储 crate 移到 CLI crate——它唯一的调用方就在 CLI,存储 crate 不该为 LLM 分析功能背书。 - -### 2.6 catalog 多 mount 查询层 - -**证据**:`store/catalog/`(6 文件约 3000 行)实现多 mount union + LazySource + 第五套 DataFusion TableProvider + `_file_` 谓词下推。 - -**刀法**:要求数据先投影进单一 Storyline store,用 DataFusion 原生 `UNION ALL` 视图替代 LazySource/provider 体系。五套 TableProvider(storyline/datafusion、events/datafusion、files、agenticmd_datafusion、catalog/provider)合并为至多两套(events + storyline),样板代码随之消失。 - -### 2.7 功能面赘肉(单项不大,合计可观) - -- **`onboard.rs`(1087 行 + 3 份内嵌资产)**:教程不该是可执行代码,还要进程内回调 `run_list/run_query` 捕获输出再渲染。换成静态 Markdown 文档 + `pchronicle demo` 生成示例数据集。 -- **`echo` 子命令**:测试工具混进产品 CLI,移到 gateway crate 的 dev-bin。 -- **`/export/har`、`/export/otlp`、`/revisions` 三个单用途端点**:合并为 `/api/export?format=har|otlp`;revisions 前端未调用(`api.rs` 无引用),删。 -- **`/api` 与 `/api/v1` 双前缀**(`server/mod.rs:184-211` 等价路由注册两遍):留其一。 -- **`QueryDocumentSource` trait**(`document_source.rs:28`):唯一实现者就是同文件的 `DocumentSourceImpl` enum,方法全部委托回 enum match——trait+enum 双重抽象,删 trait 无损失。 -- **四层 re-export 门面**(lib.rs → storage.rs → store/mod.rs → storyline/mod.rs):同一符号转出口 4 次,收敛到 2 层。 -- **agenticmd 写路径**:自称"非权威 debug 视图"却有 `fs.rs`(814 行)的 upsert/索引/元数据重写 + 专属 TableProvider。debug 视图不该有写路径,砍 `fs.rs` 只留渲染。 -- **objects.lance 内容寻址**(`content.rs` 1121 行的 externalize/hydrate/prune + GC):Lance blob 列或提高阈值直存大 JSON 即可覆盖大多数场景,`prune_unreferenced_objects` 随之消失。这条优先级最低,因为它确实解决大 payload 问题,但值得重新标定阈值验证收益。 - -### 2.8 serve 三合一编排 - -`serve` 把 Warehouse HTTP + Control JSONL/TCP 写协议 + LLM Gateway 编排进一个进程,配套 110 行 shutdown 状态机 + `projection_supervisor` 539 行 per-source 重试状态机。单一职责拆分:Gateway/Control 独立子命令,Warehouse 只做读;投影收敛用一次性 `converge_before_readiness` + 后台定时任务即可。 - ---- - -## 3. 刀法汇总:砍/留/改 - -| 优先级 | 动作 | 目标 | 预估省代码 | 风险 | -|---|---|---|---|---| -| P0 | 砍 | writer_control lease + 对象存储预留(改 flock+rename) | ~1500 行 | 低,未来接 S3 用 Lance commit 抽象 | -| P0 | 砍 | unknown_fields 机制(改 serde flatten) | ~2000 行 | 低,跨格式 roundtrip 变有损(可接受) | -| P0 | 砍 | acceleration.rs(下推给 DataFusion + 物化小表) | ~1400 行 | 中,需验证查询延迟回归 | -| P1 | 合并 | 交换格式 5→2(ATIF + AgenticMD) | ~3000 行 | 中,外部用户迁移成本 | -| P1 | 合并 | analysis 三份实现 → compile 管线 | ~1500 行 | 低 | -| P1 | 合并 | catalog 层 → DataFusion 原生 union;TableProvider 5→2 | ~2000 行 | 中 | -| P2 | 移动 | analysis_compile.rs → CLI crate;agenticmd 砍写路径;onboard 改静态文档 | ~2000 行移出核心 | 低 | -| P2 | 清理 | 双 API 前缀、QueryDocumentSource trait、4 层 re-export、echo/revisions | ~500 行 | 低 | - -**合计:约 1.2–1.4 万行从核心链路移除(当前总量 7.3 万行含测试),核心 crate 预计瘦身 25–30%,且砍掉的全是故障率最高的并发协议与格式转换代码。** - -## 4. 边际收益曲线视角的总结 - -这个项目的复杂度分布呈现一个清晰的模式:**每一项过度设计都对应一个"未来可能要"的需求**——对象存储、多写者、五种交换格式、无损 roundtrip、手写优化器——而这些需求至今没有一个真实落地。与之相对,真正落地的需求(单机嵌入、ATIF 交换、DataFusion 查询)都已经有更简单的现成解。 - -刀法精准的判据只有一条:**为已验证的需求付复杂度,不为想象中的需求付复杂度;当简单方案(flock、serde flatten、DataFusion 下推)已经存在于代码库自身时,它就是正确答案的证据,而不是权宜之计。** - -好消息是骨架不用动:events 事实层 + 单向投影 + Lance 三表这个核心是对的。所有的刀都落在附加层上,这也是为什么上面的每项砍除风险都只有"低"或"中"——它们本来就不该在关键路径上。 - ---- - -## 5. 第二轮意见的吸收(2026-08-23 补充) - -另一份评审对本文档提出了三点修正和若干新发现。经逐条代码核实,**其新发现全部属实,其修正我接受两条半**。核实证据与合并后的结论如下。 - -### 5.1 核实通过的新发现 - -**(a) 三套逐行同构的 CAS store —— 确认,且比本文档 §2.1 的定性更精确。** - -`store/attempt_registry.rs`(409 行,第一轮漏看)、`store/run_control.rs`、`store/events/manifest.rs` 三段代码结构完全一致,证据链: - -| 元素 | attempt_registry.rs | run_control.rs | manifest.rs | -|---|---|---|---| -| `CAS_RETRIES` | L20 (=32) | L22 (=32) | L24 (=64) | -| `enum Backend {Local, Object}` | L48 | L43 | 隐含于 mutate_with_mode | -| `async fn mutate` 闭包模式 | L216 | L368 | L498 (`mutate_with_mode`) | -| `PutMode::Create` / `Update(version)` | L257-258 | L412-413 | L554-556 | -| `read_local_*` / `write_local_*`(tmp+rename) | L315/328 | L478/491 | L603/615 | -| `encoded_id` 路径编码 | L294 | 同款 | — | - -第二份意见的定性是对的:**这不是"三个系统重复解决一个问题",而是"一个正确性论证(读-改-CAS 写)被抄了三遍"**。问题在抽象缺失,不在职责重复。这把 §2.1 的行动建议从"砍 lease"修正为"先抽象"——见 §5.3。 - -**(b) `SingleWriter` 双写模式 —— 确认。** `manifest.rs:27-33` 定义 `Conditional`/`SingleWriter` 双轨,为"不支持条件替换的 S3 提供商"准备,在 RFC-0007 已定调本地 loopback sidecar 的当前阶段无真实使用者。属提前工程,归入 §2.1 同一刀口。 - -**(c) ATIF 的 unknown 被处理两遍 —— 确认,比我第一轮说的更严重。** `src/atif.rs` 的 5 个结构体全部自带 `#[serde(flatten)] unknown: Map`(L30/44/74/87/94),而 `convert/atif.rs:287` 又手写 `capture_atif_unknowns` 用 JSON pointer 再捕获一遍。声明式 flatten 与手写指针捕获语义重叠、各自维护。这强化了 §2.3 的结论:unknown_fields 机制不是"可以更便宜",而是"在同一格式内部就已经自相重复"。 - -**(d) 两个空 `mapping/` 死目录 —— 确认。** `src/mapping/` 与 `src/agenticmd/mapping/` 均为空(2026-08-17 重构残留),直接删。 - -### 5.2 接受的修正 - -| 第一轮判断 | 修正后 | -|---|---| -| §2.1:"砍 writer_control lease 体系,省约 1000 行" | **降级为两步**:先抽 `cas_store` 原语消除三份同构(约 600 行重复下沉),对象存储后端是否删除另作独立决策。直接删 lease 会把"防本地多进程"的真实保护一起删掉,风险被低估 | -| §2.7:"objects.lance 内容寻址值得重新标定阈值验证收益" | **撤回,改为明确保留**。它是作用于三表全部宽列的通用 content-addressed 大对象层,解决 `reasoning_content`/`message_json` 的行宽与重复痛点,是刀刃上的钢。第二轮意见对"它是 unknown-fields 去重附属品"的反驳成立 | -| epoch fence 语义 | 两论一致:**保留**。这是写入路径正确性的核心 | - -### 5.3 合并后的刀法清单 v2 - -| 优先级 | 动作 | 省代码 | 性质 | -|---|---|---|---| -| **P0** | 抽 `cas_store` 原语(read-if-match + 重试,本地锁/对象 store 双后端),三个 store 下沉复用 | ~600 行 | 消除冗余(两份意见汇合后的第一刀) | -| **P0** | 收敛格式:`atif.rs` 的 flatten `unknown` 与 `capture_atif_unknowns` 合并为一条路径;unknown_fields 全局机制改 serde flatten | ~2000 行 | 冗余 | -| **P0** | 砍 acceleration.rs(下推 DataFusion + 物化小表) | ~1400 行 | 过度设计(仅第一轮提出,第二轮未反对) | -| **P1** | 格式收敛:2 个存储权威(Events Lance + Storyline Lance)+ 其余降级为纯 import codec,砍掉 5 个 codec 的 DataFusion provider 与 7 分支能力矩阵(`document_source.rs:260-326`) | ~3000 行 | 冗余+过度设计(两论方向一致,第二轮的"砍 query provider 但保留 import codec"比第一轮的"砍格式"更稳妥,采纳) | -| **P1** | 删 `SingleWriter` 双写模式;catalog 层 → DataFusion 原生 union | ~2500 行 | 过度设计 | -| **P2** | analysis 三份实现合一;analysis_compile.rs 移到 CLI;agenticmd 砍写路径;onboard 改静态文档 | ~2000 行移出核心 | 第一轮提出,第二轮未涉及,保留 | -| **P2** | 删空 `mapping/` 目录 ×2;评估 Storyline writer lease 续约退化为单写者断言 | ~100 行 | 冗余/过度设计 | - -**保留清单(两论一致)**:Lance 单引擎、events→Storyline 单向投影、epoch fence、`content.rs` content-addressed 层、CLI 行为测试套件。 - -### 5.4 两轮意见的关系 - -第二轮的价值不在于推翻第一轮,而在于**把"过度设计"拆成了两个性质不同的桶**: - -- **冗余(复制粘贴)**:三套 CAS、两套 unknown 捕获、空目录——这类问题解法是抽象,风险极低,应最先动; -- **提前工程(为未出现场景的复杂度)**:SingleWriter、lease 续约、多跳 envelope、acceleration、多 codec provider——这类问题解法是做减法和降级,需要逐项验证无真实使用者。 - -第一轮按"砍多少行"排序,第二轮按"问题性质"分类。合并后的正确顺序是:**先做零风险的抽象(CAS 原语、unknown 单路径),再做需要验证的减法(provider、SingleWriter、lease 降级)**——这正是边际收益曲线上"先摘低垂果实"的标准打法。 - ---- - -## 6. 第三轮交叉核验的裁决(2026-08-23 补充) - -第三轮核验者对本报告 §0-§4 提出 2 处事实性质疑和 3 处口径质疑。经逐条回到代码钉死,**裁决如下:本文档 2 处措辞不精确(已修正),1 处双方各对一半,3 个数字口径全部补证成立**。 - -### 6.1 数字口径的补证(第三轮的三个"待补证"全部落实) - -| 被质疑论断 | 裁决 | 证据 | -|---|---|---| -| "analysis 三份实现"证据链断裂 | **成立,证据链已补齐**(§2.5 已更新行号)。第三轮只找到 1 份是因为漏了 CLI 的 4 条硬编码 SQL 常量(`pchronicle-cli/src/lib.rs:1944-2028`,由 L1852-1855 的 `AnalysisCommand` 分派消费)和 `explorer.rs` 的 `analyze`(L440)+`dimension_aggregates`(L782)。三份=CLI 硬编码 SQL + explorer Rust 聚合 + compile 管线,置信度升为**高** | 见 §2.5 | -| "9 种格式"口径不明 | **口径钉死**:7 个 `DocumentFormat` 登记变体(`format.rs:11-26`,第三轮实测一致)+ 2 个未登记表示(`formats/llm.rs` LLM payload、ACTF 内藏 OpenClaw 子格式)= 9。§2.2 已补充口径说明 | `format.rs:11-26` | -| "全 crate 仅 2 个 trait"会被抓漏洞 | **第三轮的提醒成立,已修正措辞**:自有 trait 2 个(`ChronicleEventRecordExt` pub、`QueryDocumentSource` pub(crate)),另有 5 处对 DataFusion 外部 trait `TableProvider` 的实现。§1 亮点已改为带口径的表述 | `formats/events.rs:48`、`document_source.rs:28`、5 处 impl | - -### 6.2 事实性裁决 - -**(a) 故障注入 hook 的位置——双方各对一半,真相是更多。** - -- 本文档第一版写"`store/mod.rs:301-406`",实际路径是 `store/storyline/mod.rs:292-317`(路径截断笔误,已修正); -- 第三轮写"hook 在 `projection/storyline.rs:28-34`,`writer_control.rs` 里没有"——`projection/storyline.rs` 的 hook 属实,但第三轮漏掉了 `store/storyline/mod.rs` 里的另外两组(`CREATE_AFTER_EMPTY_READ_BARRIER` L302、`REPLACEMENT_AFTER_CURRENT_READ_BARRIER` L313); -- **事实全貌:4 组全局 barrier/故障注入 hook,分布在 2 个文件,都不在 `writer_control.rs`**。本文档从未把 hook 归于 writer_control(第三轮引用的"安到 writer_control"是对本文档 §2.1 的误读),但路径确实写错过。实质观察(并发协议需要故障注入才能测试)经三轮核实**反而被加强**——hook 比任何一方说的都多。 - -**(b) acceleration.rs 的位置与定性。** - -本文档自始至终引用的是 `server/acceleration.rs`(即 CLI crate 的 server 子模块),第三轮先误判本文档"说它在核心 crate",随后自行纠正并确认位置——**此项无分歧**。接受第三轮的两点改进并已并入 §2.4:标注完整 crate 路径;补充"保守可降级加速层、Catalog 仍是 source of truth"的定性。该定性微调**不改变结论**:1762 行的 sqlparser 重写器 + 3 套内存索引对"物化小表让 DataFusion 自己剪"仍是负和账,但它位于 CLI 层、可整体丢弃、不污染核心,因此 v2 清单中其优先级维持 P0(收益/风险比高)而非升级为"核心引擎问题"。 - -### 6.3 三轮汇合后的最终刀法(置信度标注版) - -| 优先级 | 动作 | 置信度 | 汇合情况 | -|---|---|---|---| -| P0 | 抽 `cas_store` 原语,三 store 下沉复用 | 高 | 三方独立证实同构 | -| P0 | unknown_fields → serde flatten 单路径 | 高 | 三方独立证实 flatten 已存在 | -| P0 | acceleration → DataFusion 下推 + 物化小表(CLI 层) | 高 | 第一轮提出,第三轮确认位置与定性 | -| P1 | 交换格式收敛:2 存储权威 + 其余降级纯 import codec | 高 | 三轮方向一致 | -| P1 | TableProvider 5→2(catalog → DataFusion 原生 union) | 高 | 第一轮提出,第三轮验证 5 处 impl 存在 | -| P1 | analysis 三份实现 → 统一 compile 管线 | **高**(证据链已补齐) | 第一轮提出,第三轮质疑后补证成立 | -| P1 | 删 SingleWriter 双写模式 | 高 | 第二轮发现,未受质疑 | -| P2 | ACTF benchmark 语义剥离出 hub | 中 | 三方证实泄漏,剥离方案待设计 | -| P2 | 空 mapping 目录、双 API 前缀、onboard 静态化等 | 高 | 低垂果实 | - -**三轮核验的元结论**:本报告的所有 P0/P1 刀口均已被至少两方独立核实;第三轮的全部质疑已闭环——要么是口径问题(已钉死),要么是双方各对一半(hook 位置,真相更强)。没有任何一刀因交叉核验而被撤销,反而有两刀(analysis 三份、hook 信号)因质疑而被加强。可以进入重构提案阶段。 - ---- - -## 7. 施工清单 Review(§6.3 的可执行性审查) - -以 §6.3 为施工蓝本逐条审查。**总评:刀口选择正确、置信度可信,但作为施工列表缺三样东西——依赖顺序、验收标准、以及 2 个在前几轮丢失/倒挂的条目。** 直接照单施工会在两处卡住。 - -### 7.1 逐条裁决 - -| 条目 | 施工裁决 | 问题 | -|---|---|---| -| P0 cas_store 原语 | ✅ 可施工,**但需前置一个小 PR** | ① SingleWriter 删除(P1)应**前移进本刀**:否则原语必须参数化一个即将死掉的模式,提取面凭空变大。② `CAS_RETRIES` 三个 store 为 32/32/64,统一值需显式决策(manifest 的 64 是有意的还是随手写的,无从考证——建议统一为 64 并留注释)。③ 抓手确认:三个 store 各有独立测试 mod(attempt_registry:376、run_control:540、manifest 内),行为保持型重构可验收 | -| P0 unknown → flatten | ⚠️ **顺序有坑** | 与 P1 格式收敛存在依赖倒挂:若先做 flatten,要改写 `convert/actf.rs` 等约 170 行×若干的捕获逻辑——而这些文件在格式收敛后**整个被删**,纯返工。正确顺序:先做格式收敛的**范围决策**(哪些 codec 幸存),再对幸存者做 flatten | -| P0 acceleration | ✅ 可施工,**但验收标准缺失** | 已核实前端 5 个文件(`llm_settings.rs`/`analysis.rs`/`result_explorer.rs`/`analysis_agent.rs`/`components.rs`)真实消费 evidence 接口——这不是无人使用的死代码。拆除必须有**延迟回归门槛**(fixture 数据集 p50/p95 前后对比),否则是盲拆。与 P1 catalog 合并有隐含依赖:acceleration 注入的 `_file_` 谓词由 catalog provider 下推消费,先砍 acceleration、后并 catalog 的顺序是对的,但清单未写明 | -| P1 格式收敛 + P1 TableProvider 5→2 | ⚠️ **应合并为一个 epic** | 5 个 codec provider 的删除本来就是格式收敛的组成部分,拆成两条独立 P1 会造成大量中间态(codec 还在、provider 已删,或反之)。另缺**外部兼容策略**:`DocumentFormat` 是公开枚举、import/export 是 CLI 公开接口,需要一个 deprecation/alias 计划,否则是 breaking change | -| P1 analysis 三合一 | ✅ 可施工,**与 P2 有一条顺序倒挂** | 应先做纯机械的 `analysis_compile.rs` 移 crate(P2、零行为变化),再做三合一(行为变化)。否则统一工作要在错误的位置做一遍再搬家。验收标准建议:CLI `analysis` 子命令对 fixture 数据集做 **golden diff**(统一前后 SQL 结果等价) | -| P2 各项 | ✅ 无异议 | 空目录、双前缀这类可随手热身 | - -### 7.2 清单缺漏(三轮评审中有、施工清单中丢了的) - -1. **多跳 `_storyline` envelope 删除**——第二轮 P1 明确提出("unknown 无损降为单跳"),§6.3 里丢失了。应并入格式收敛 epic。 -2. **`openai_corpus.rs` 的转换逻辑移入 `convert/`**——第一、二轮都点名的边界统一,属格式收敛 epic 的子任务。 -3. **横切验收基建**:整个清单没有一条性能回归门。建议先建一个最小 benchmark fixture(现成的 benchmark/ 目录数据即可)+ p50/p95 报告脚本,作为 P0-3 和 P1 catalog 两刀的共享门槛。 -4. **构建耦合提示**:CLI 通过 build.rs `include_dir!` 嵌入前端 WASM,所有动 CLI server 层的 PR 构建失败会连带前端——施工顺序上应先解耦(asset 改运行时加载或 feature-gate),否则每个 server 层 PR 都背负双端构建。 - -### 7.3 修正后的 PR 序列 - -``` -PR0 热身:删空 mapping/ 目录 ×2、/api 双前缀留一、echo→dev-bin、revisions 删 - (~150 行,零风险,验证 CI 通路) -PR1 删 SingleWriter 双写模式(独立小 PR,缩小 cas_store 提取面) -PR2 cas_store 原语 + 三 store 迁移(1 个新模块 PR + 3 个迁移 PR) - 验收:现有测试全绿 + 原语单测(并发互斥/CAS 重试/本地锁)+ 三 store 测试不动 -PR3 analysis_compile.rs 移到 CLI crate(纯移动,零行为变化) -PR4 格式收敛 RFC(决定 2 权威 + import codec 幸存清单 + deprecation 计划) - → 执行 PR:codec 降级 + provider 5→2 + unknown flatten(对幸存者)+ envelope 删除 - + openai_corpus 移 convert/ -PR5 性能门基建(benchmark fixture + p50/p95 报告) ← 可与 PR1-4 并行 -PR6 acceleration 拆除(验收:PR5 门槛内 + 前端 evidence 功能回归) -PR7 analysis 三合一(验收:golden diff) -PR8 catalog → DataFusion 原生 union(依赖 PR6:_file_ 裁剪的归宿先定) -PR9 P2 余项:agenticmd 砍写路径、onboard 静态化、lease 续约降级评估 -``` - -依赖关系:PR1→PR2→(PR4 可并行);PR5→PR6→PR8;PR3→PR7。关键路径 = PR0→PR1→PR2→PR4,约占总收益的一半以上。 - -### 7.4 范围合规 - -全部条目落在 `persisting-pchronicle` / `persisting-pchronicle-cli` 两个 crate 及 `pchronicle-web` 构建配置内,符合 AGENTS.md 默认 scope(不触碰 queue/search/TTAS/dlcapt)。验收命令建议用 `-p persisting-pchronicle -p persisting-pchronicle-cli` 定向跑,避免拉入排除子系统。 diff --git a/docs/superpowers/reviews/2026-08-23-product-phase-review.md b/docs/superpowers/reviews/2026-08-23-product-phase-review.md deleted file mode 100644 index e8b9fb51..00000000 --- a/docs/superpowers/reviews/2026-08-23-product-phase-review.md +++ /dev/null @@ -1,114 +0,0 @@ -# 产品阶段性 Review:定位、架构与功能暴露路线 - -## Status - -- 评审时间:2026-08-23 -- 覆盖范围:pChronicle Web 全部功能面(后端 17 条路由、前端 12 个模块、20 份 spec)、`pchronicle serve` 数据链路、Datasets / Runs / Run Detail / Analyze 四个界面(基于 2026-08-23 实机截图) -- 评审视角:产品定位(PM)+ 分布式系统 / 存储 + Agent 生态竞品(LangSmith、Laminar、Langfuse、Phoenix) -- 性质:项目执行阶段 review,结论供下一阶段排期参考 - -## 结论摘要 - -pChronicle 当前的形态是「单二进制本地 Agent 轨迹仓库 + 分析工作台」:files-first、SQL-first、WASM 前端内嵌、Copilot 兜底。三个核心判断: - -1. **定位差异化成立**。竞品全是 SaaS pipeline-first,数据在他们云上;pChronicle 数据永远在用户磁盘上。对企业内部数据、科研数据集是刚需,SaaS 方案在这些场景无法进入。 -2. **架构是「存储正确」的**。Dataset mount + Warehouse 虚拟根 + `_file_` 前缀是干净的数据湖抽象;Report 错误策略让坏数据降级而不阻塞;bounded query 在引擎层做了资源边界。 -3. **最大的杠杆不在建新能力,而在暴露已建成的能力**。后端约一半能力(导出、revisions、events、multi-storage、compare)已建成或已有 spec,但没有 UI 入口,产品回报为零。 - -## 现状盘点:能力分层与 UI 暴露度 - -![pChronicle 能力分层与 UI 暴露度](assets/2026-08-23-capability-layers.svg) - -约一半的后端能力已建成(或已有 spec)但没有 UI 入口,产品回报为零。逐项明细: - -| 层 | 能力 | UI 暴露状态 | -|---|---|---| -| L1 数据与存储 | dataset mounts、catalog treemap | ✅ 已暴露(Datasets 页) | -| L1 | error sources | ⚠️ 部分暴露(红色横幅,无管理操作) | -| L1 | `/revisions` 数据集快照 | ❌ 后端已有,无 UI | -| L1 | 多 Dataset 挂载 | ❌ spec 已批准(2026-08-23),未实现 | -| L2 查询引擎 | query console(tables + SQL) | ✅ 已暴露 | -| L2 | evidence bounded 查询 | ✅ 已暴露(Analyze agent 消费) | -| L2 | `/export/har`、`/export/otlp` | ❌ 后端已有,无 UI | -| L3 派生视图 | explorer runs / tree / turns、storyline、trace + span timeline | ✅ 已暴露 | -| L3 | `/events` 原始事件流 | ❌ 后端已有,无 UI | -| L3 | trajectory compare | ❌ spec 已写(2026-08-22),未实现 | -| L4 分析与协作 | analyze agent(plan-review-run)、analysis sessions | ✅ 已暴露(Analyze 页) | -| L4 | signals 检测器(Laminar 式) | ❌ 仅有产品讨论,无 spec | -| L4 | deep link / 分享 / 报告导出 | ❌ 未建设 | - -## Review 发现 - -### 产品定位层 - -- **在「轨迹查看器」与「分析平台」之间摇摆**。Span Timeline、Trace、JSON renderer 是世界级的查看体验;但分析侧(Analyze agent、Query Console)的能力密度没有透出来。用户第一印象会是「好看的 trace viewer」,而非「能回答质量问题的分析平台」。 -- **两个 AI 入口的关系没有交代**。Copilot(对话式问答)与 Analyze(plan-review-run 可复算取证)能力重叠,用户不知道何时用哪个。建议明确分工叙事并在两个入口互相引流。 -- **Query Console 是埋没的杀手锏**。「对轨迹数据写 SQL」是对 SaaS 竞品最硬的差异,但藏在开发者角落:无 schema 引导、无示例、无保存。 - -### 架构层(分布式 / 存储) - -做对了的: - -1. Dataset mount / `_file_` 前缀抽象,天然支持多数据集与路径钻取(catalog treemap 是其直接产物);multi-storage spec 使其成为 CLI 一等公民。 -2. Report 错误策略 + error sources 显式暴露(624MB 超限文件降级为 error source 而非炸掉启动,2026-08-22 修复)——「坏数据不阻塞好数据」。 -3. Bounded query(max_rows / max_bytes)引擎层资源上限;SQL 执行错误映射为带详情的 400(2026-08-22 修复),查询路径已工程化成熟。 - -架构债: - -1. **数据新鲜度是手动的且不可见**。`POST /catalog` 刷新存在,但 UI 无「我看到的是哪个快照 / 是否有新文件」的心智模型。分布式系统用户对 staleness 极其敏感。 -2. **单用户单进程**。无并发写、无协作故事。短期可接受,产品叙事只能停留在「个人 / 小队工具」。 -3. **`/revisions` 已付工程成本但未收产品回报**。 - -### 界面交互层(基于 2026-08-23 实机截图) - -主链路 Datasets → Runs → Run Detail(Trace / Analysis)→ Analyze 通畅,「先看分布再钻取」心智正确。详细交互问题见当日会话记录(P0 loading 反馈缺失、tile 颜色无语义、URL 不反映状态等)。产品层级补充: - -- **P1**:Analyze 页首屏价值密度低——大标题 + 空的 Recent analysis 把核心能力(问题输入)推到中下区域。 -- **P1**:Run Detail 加载 >10s 仅显示 "Building trajectory evidence…",需要分阶段 skeleton。 -- **P2**:Coverage 卡 0 值行、Duration/Tokens "—" 缺解释,属视觉噪音。 - -## 行动项 - -候选功能按「用户价值 × 实现成本」排布如下: - -![候选功能价值-成本矩阵](assets/2026-08-23-feature-priority-matrix.svg) - -### 立即做(高价值低成本:给已有 API 加 UI) - -| ID | 行动项 | 优先级 | 验收标准 | -|---|---|---|---| -| A1 | Run Detail 工具栏增加导出 HAR / OTLP 按钮 | P0 | 任一 run 可一键下载 HAR 与 OTLP 文件 | -| A2 | 全局 URL 状态(page / dataset / run / catalog 路径),刷新与分享不丢状态 | P0 | 复制 URL 打开还原同一视图 | -| A3 | 顶部 catalog 快照状态条:快照时间 + 新文件待扫描提示 + 手动/自动刷新 | P1 | staleness 可见且可操作 | -| A4 | Query Console 侧栏 schema 浏览器:列级说明 + 示例值 + 一键插入 | P1 | 不读文档即可写出正确 SQL | -| A5 | error source 管理面板:失败原因(如超 max_file_bytes)+ 调整上限重试 | P1 | 624MB 文件可通过面板处理后入库 | - -### 规划做(高价值高成本:产品叙事下一级台阶) - -| ID | 行动项 | 优先级 | 说明 | -|---|---|---|---| -| B1 | trajectory compare 工作区 | P1 | spec 已完成(2026-08-22),Pin + 对齐 diff;A/B 评估前置 | -| B2 | signals 检测器(Failure / Logic / Task / Friction / Hallucination / Intent) | P1 | 参照 Laminar 模板;先落 Failure + Task,Runs 列表加信号列,CompactOverviewStrip 加 risk badges | -| B3 | revisions 时间旅行 UI | P2 | `/revisions` 已有;数据集版本切换,配 B1 可做版本差异审计 | -| B4 | 分析报告导出(Markdown / HTML) | P2 | Analyze 产出脱离 session,完成「取证→结论→交付」闭环 | - -### 顺手做 - -| ID | 行动项 | 说明 | -|---|---|---| -| C1 | 多 dataset 切换器 | 依赖 multi-storage spec 落地 | -| C2 | SQL 收藏 / 模板 | Query Console 增强 | -| C3 | `/events` 原始事件流视图 | power user 排障 | - -## 附录:竞品参照——Laminar Signal 角色分工 - -行动项 B2(signals 检测器)的产品化参照。Laminar 把 agent trace 的自动分析拆成 6 个「专职检测员」,横轴是问题阶段(意图理解 / 推理与执行 / 输出验证),纵轴是受影响对象(agent / 用户 / 任务)。关键启示:**Friction Detector 把 UX 问题从「任务是否完成」中独立出来**——agent 可能完成了任务但用户已被糟糕交互折磨,这是 trajectory 分析工具最容易忽略的维度。pChronicle 落地顺序建议:先 Failure Detector(Behavior 已有基础)与 Task Evaluator(直接回答完成度),再 Friction Detector,LLM judge 类(Hallucination / Logic / Intent)后置。 - -![Laminar 6 Signal 角色分工矩阵](assets/2026-08-23-laminar-signal-roles.svg) - -## 遗留与风险 - -- 既有失败测试 `status_reports_projection_stale_and_safe_errors`(已验证与近期改动无关),需单独排查。 -- 2026-08-22 报告的 WASM panic 疑似卡死状态伴生现象,未复现;若再出现需保留完整控制台堆栈。 -- Analyze 页与 Copilot 的双入口叙事未定,影响 B2 的入口设计,需在 signals spec 前决策。 -- 单用户架构是有意选择还是过渡状态,影响 B4(报告导出)之后的协作类功能排序,建议下阶段明确。 diff --git a/docs/superpowers/reviews/2026-08-28-pchronicle-design-impl-review.md b/docs/superpowers/reviews/2026-08-28-pchronicle-design-impl-review.md deleted file mode 100644 index d154f4b8..00000000 --- a/docs/superpowers/reviews/2026-08-28-pchronicle-design-impl-review.md +++ /dev/null @@ -1,162 +0,0 @@ -# pChronicle 设计与实现整体 Review - -## Status - -| 项 | 内容 | -|---|---| -| 评审时间 | 2026-08-28 | -| 覆盖范围 | `crates/persisting-pchronicle`(约 51k 行 Rust / 99 个源文件)全部非 `search` 源码,含 `README.md` 与 `docs/src/rfcs/0003-pchronicle-ownership.md` 的对照核实 | -| 排除范围 | `src/search/`、`src/operations/`(search 适配层)按项目默认约定排除;`persisting-dlcapt` 不在范围 | -| 评审方式 | 五个子系统并行探查后交叉核对,对关键断言逐条读原文核实(见文末「核实清单」) | -| 关联消费者 | `persisting-pchronicle-cli`、`persisting-gateway`(pPilot / pVisor 通过 spawn `pchronicle` 二进制消费,不链接库) | - -## 结论摘要 - -pChronicle 的核心设计是对的,而且好得超出预期。真正的债务不在概念层,而在**执行一致性**:对外承诺的能力位(streaming、filter exact)和预算(unknown fields limits、查询行数)有相当一部分没有在实现里落地;README 描述的四模块门面没有编译约束;几个核心模块已经膨胀到 2000 行量级。这不是一个需要重新设计的系统,而是一个需要把已经写在文档里的承诺补齐、然后拆文件的系统。 - -三个最重要的判断: - -1. **单枢纽格式转换 + epoch-fenced 事实层 + CURRENT 原子发布 + watermark 投影,这四件事都做扎实了**,还配了真实竞争的并发测试。这是这个 crate 值得保留的资产,任何重构都不该破坏它们。 -2. **唯一能被外部输入直接触发的资源耗尽路径是 SQL 查询入口**:`query()` / `query_jsonl()` 全量 collect 且默认无内存上限。有预算的流式路径已经写好了,只是便捷 API 绕过了它。 -3. **README 写得非常具体(承诺了无损边界、能力矩阵、预算行为、门面结构),这是优点**——但具体的承诺一旦漂移,代价比含糊的文档更大,因为下游会当契约用。目前有 5 处明确漂移。 - -## 现状盘点 - -### 分层评分 - -设计 = 抽象与边界是否成立;实现 = 代码是否兑现了该抽象。 - -| 子系统 | 设计 | 实现 | 最该关注的一件事 | -|---|:---:|:---:|---| -| 格式转换枢纽 `formats/` + `convert/` | A | B | capabilities 里的 `streaming_input` 与 codec 内部无界 unknown limits 都不是实话 | -| unknown fields 保真 | A | A− | 机制本身可证明;缺 proptest(最复杂的不变量只有单测) | -| 事实层 `events.lance` + manifest | A | A− | `FilterPushdown::Exact` 无条件上报;replay 两趟 scan | -| Storyline Lance + CURRENT | A− | B | `mod.rs` 已 1940 行;local CURRENT 写入不做 etag 比较,跨进程只靠 flock | -| 投影管线 `projection/` | A− | B+ | watermark / lineage 逻辑扎实,但缺 kill -9 中途 sync 的恢复测试 | -| 写入队列 `append_queue` | B+ | B | `in_flight` 语义错位 + 忙等;maintenance channel 满时静默丢工作 | -| 查询引擎 `query_engine` | B+ | C+ | 只读门禁与 `_file_` join 守卫是好设计,但便捷 API 无预算、默认无内存上限 | -| AgenticMD 编解码 | B+ | B | byte-span upsert 很漂亮;无 `length` 时的 marker 截断是唯一真 fragility | -| `layout/` + `resolve` 路径推断 | C+ | C+ | 800 行启发式,行为由文件系统驱动,无性质测试 | -| 公共 API 门面 | B | C | 四模块是文档意图,不是编译约束;CLI 深度绑定 storage 全表面 | - -### 已建成的设计资产 - -| 资产 | 位置 | 说明 | -|---|---|---| -| 单枢纽格式转换 | `convert/mod.rs:1-12` | 所有外围格式只与 `StorylineDocument` 互转,转换复杂度 O(N) 而非格式两两组合的 O(N²)。`TrajectoryFormat` trait + 静态 registry 让新增 codec 只需 impl + 注册 | -| unknown fields 无损机制 | `formats/unknown_fields.rs:362-401`、`815-817` | RFC 6901 JSON Pointer + 按源格式命名空间 + version-1 `_storyline` envelope + 冲突一律 fail closed。跨格式多跳有集成测试 | -| 事实层 epoch fencing | `store/events/manifest.rs:187-251`、`472-477` | writer 先写私有 segment 再做 epoch-fenced CAS 发布;崩溃在发布前只留不可达的 Lance 版本,读者 pin manifest 完全免受影响 | -| CURRENT 原子发布 | `store/storyline/mod.rs:943-975`、`991-1022` | 三表 + objects 版本全部就绪才移动 CURRENT;失败释放 lease 并删除未提交 generation。读者永远看到完整快照 | -| 投影 lineage 保守优先 | `projection/storyline.rs:430-432`、`237-240`、`271-274` | watermark 用 `fact_version` / `fact_rows`,纯 compaction 的 `layout_revision` 变化不算 stale;recipe 变更或 watermark 非单调时返回 `RequiresRebuild` 而不是猜 | -| content offload + 延迟物化 | `store/storyline/datafusion.rs:191-200` | 大 payload 进 `objects.lance`,表内只留 preview/ref,查询走 `ContentHydrationExec`。这一层最实在的性能设计 | -| 时间戳保留源形态 | `formats/timestamp.rs:7-17` | `StorylineTimestamp` 同时保留 wire scalar 和 canonical instant,拒绝亚纳秒精度。比统一转 RFC3339 字符串高明一档 | -| bounded 流式解析 | `formats/common/json_stream.rs:77-196`、`205-291` | 手写 depth / string escape 跟踪 + 复用 buffer 的 `read_bounded_json_object`,安全与性能兼顾,有 proptest | -| analysis 编译器分层正确 | `analysis_compile.rs:4-5`、`196-379` | `AnalysisSpec` → 只读 SQL,白名单 intent / grain / measure / dimension,明确不碰 DataFusion 执行 | -| 测试约定写进文档并被遵守 | `tests/README.md:52-62`、`store/events/manifest.rs:777-801` | 明确禁止「用进程级 `root_write_lock` 把并发测试串行化后宣称覆盖了 CAS」,要求断言精确计数、回归测试先证明 bug;有 32-writer CAS 竞争测试 | - -## Review 发现 - -### P0 —— 正确性与资源,建议尽快处理 - -| ID | 问题 | 位置 | 影响 | -|---|---|---|---| -| P0-1 | SQL 查询入口无行/字节预算,默认无内存上限 | `store/query_engine.rs:348-370`(`query` / `query_jsonl` 全量 collect)、`442-481`(`memory_limit_bytes` 默认 `None`) | 对外暴露 SQL 等于暴露 DoS 面。流式有预算的路径 `write_query_jsonl_bounded` 已实现且 CLI 在用,但便捷 API 无任何上限,也没有 query timeout | -| P0-2 | unknown fields 预算没有贯通到各 codec | `formats/atif.rs:328`、`formats/actf/mod.rs:173`、`formats/openai_corpus.rs:230` 硬编码 `UnknownFieldLimits::default()`(= `usize::MAX`);`document.rs:76` 在 decode 之后才校验 `DocumentCodecOptions` | 畸形输入的超大 unknown payload 会先完整进内存,最后才可能被拒。README 承诺的「显式配置的有限上限」在 codec 内部拿不到 | -| P0-3 | 解码路径存在静默数据丢失 | `formats/codex.rs:145`、`formats/claude_code.rs:148`(`from_rfc3339(..).ok()` 丢弃非法时间戳);`formats/common/jsonl.rs:99`(JSON 解析失败降级为整段 string)、`:49`(multimodal 数组拼成单字符串) | 与 crate 其他部分一贯的 fail-closed 风格直接矛盾。事实层丢时间戳 / 丢结构且不报错,下游无从发现 | -| P0-4 | 每次调用新建 Tokio runtime | `discovery.rs:95-100` `expand_story_locations_blocking` | 在已有 runtime 的线程上调用会嵌套 runtime(panic)或阻塞 worker;每次调用还付一次多线程 runtime 构建成本 | - -### P1 —— 设计一致性与可维护性 - -| ID | 问题 | 位置 | 影响 | -|---|---|---|---| -| P1-1 | 四模块公共门面只是文档意图,不是编译约束 | `lib.rs:31` `pub mod analysis_compile`;`lib.rs:71-81` search feature 下 `pub use messages::*` / `operations::*`;`tests/public_api.rs` 只是正向编译测试 | README 声称「默认功能面只通过四个模块组织」,实际默认就有 5 个公开模块,search 开启后 6 个 + 一批 crate 根 re-export。没有 `compile_fail` 守卫,回归无法拦住 | -| P1-2 | capabilities 上报与实现脱节 | `formats/actf/mod.rs:42-48` 声明 `streaming_input: true` 但 `:145-153` 是 `read_to_string` 全量读(Storyline / OpenAI 同);`store/events/datafusion.rs:124-127` 对任意 `Expr` 无条件返回 `FilterPushdown::Exact` | README 把「能力由实际打开的 `DocumentSource` 报告,不按格式名推断」当设计卖点,但报告值本身有部分不可信。Exact 是否成立取决于 Lance 对该 Expr 的完整求值,缺验证测试 | -| P1-3 | 多个模块已超过可维护体量 | `store/storyline/mod.rs` ≈1940 行(`replace_storyline_stream_with_projection` 单函数 ~330 行)、`formats/actf/convert.rs` ≈1961、`formats/openai_corpus.rs` ≈1915、`store/catalog/mod.rs` ≈920、`store/events/mod.rs` ≈1095、`layout/resolve.rs` ≈824 | 读写路径、DataFusion 适配、lease、maintain 混在同一文件,改动半径大,评审成本高 | -| P1-4 | append 队列的关停语义靠隐式顺序 + 忙等 | `append_queue.rs:132-151`(`in_flight` 只覆盖 `try_send` 窗口)、`:166-168` 与 `:535-537`(`yield_now` 自旋);`:490-493`(maintenance channel 满时只 warn) | `in_flight` 名字暗示「未完成的工作量」,实际不表示队列深度;`finish()` 等到 0 也不代表队列已空,正确性依赖 `Finish` 消息顺序而非计数。compaction 可能长期滞后 | -| P1-5 | AgenticMD 缺 `length` 时按 marker 子串截断 body | `agenticmd/codec.rs:249-253`;`docs/src/pchronicle/reference/agenticmd.md:25-27` 明确允许省略 length | 手工编辑过的文件若正文含 `