ALPHA: wire is a tool to deploy nixos systems wire.althaea.zone/

add tutorial and rearrange guides (#286)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

authored by

marshmallow
autofix-ci[bot]
and committed by
GitHub
faabba14 0a3628ac

+1189 -519
+5
CHANGELOG.md
··· 25 25 - Data integrity of keys have been greatly improved 26 26 - Unknown SSH keys will be immediately rejected unless `--ssh-accept-host` is passed. 27 27 28 + ### Documented 29 + 30 + - Added a real tutorial, and seperated many how-to guides. 31 + The tutorial leads the user through creating and deploying a Wire Hive. 32 + 28 33 ## [0.5.0] - 2025-09-18 29 34 30 35 ### Added
+1 -1
README.md
··· 6 6 7 7 wire is a tool to deploy nixos systems. its usage is inspired by colmena however it is not a fork. 8 8 9 - Read the [The Guide](https://wire.althaea.zone/guide/wire.html), or continue reading this readme for development information. 9 + Read the [The Guide](https://wire.althaea.zone/guides/installation.html), or continue reading this readme for development information. 10 10 11 11 ## Tree Layout 12 12
+70 -18
doc/.vitepress/config.ts
··· 27 27 // https://vitepress.dev/reference/default-theme-config 28 28 nav: [ 29 29 { text: "Home", link: "/" }, 30 - { text: "Guide", link: "/guide/wire" }, 30 + { text: "Tutorial", link: "/tutorial/overview" }, 31 + { text: "Guides", link: "/guides/installation" }, 31 32 { text: "Reference", link: "/reference/cli" }, 32 33 { 33 34 text: pkg.version, ··· 41 42 ], 42 43 43 44 sidebar: { 44 - "/guide/": [ 45 + "/": [ 45 46 { 46 - text: "Introduction", 47 + text: "Tutorial", 48 + collapsed: false, 47 49 items: [ 48 - { text: "What is Wire?", link: "/guide/wire" }, 49 - { text: "Getting Started", link: "/guide/getting-started" }, 50 - { text: "Flakes", link: "/guide/flakes" }, 51 - { text: "Applying Your Config", link: "/guide/apply" }, 52 - { text: "Targeting Nodes", link: "/guide/targeting" }, 50 + { text: "Overview", link: "/tutorial/overview" }, 51 + { 52 + text: "Part One", 53 + items: [ 54 + { 55 + text: "Nix Setup", 56 + link: "/tutorial/part-one/nix-setup", 57 + }, 58 + { 59 + text: "Preparing Repo & Shell", 60 + link: "/tutorial/part-one/repo-setup", 61 + }, 62 + { 63 + text: "Creating a Virtual Machine", 64 + link: "/tutorial/part-one/vm-setup", 65 + }, 66 + { 67 + text: "Basic Hive & Deployment", 68 + link: "/tutorial/part-one/basic-hive", 69 + }, 70 + ], 71 + }, 72 + { 73 + text: "Part Two", 74 + items: [ 75 + { 76 + text: "Basic Deployment Keys", 77 + link: "/tutorial/part-two/basic-keys", 78 + }, 79 + { 80 + text: "Encrypted Deployment Keys", 81 + link: "/tutorial/part-two/encryption", 82 + }, 83 + ], 84 + }, 53 85 ], 54 86 }, 55 87 { 56 - text: "Features", 88 + text: "How-to Guides", 89 + collapsed: false, 57 90 items: [ 58 - { text: "Secret management", link: "/guide/keys" }, 59 - { text: "Parallelism", link: "/guide/parallelism" }, 60 - { text: "hive.default", link: "/guide/hive-default" }, 61 - { text: "Magic Rollback", link: "/guide/magic-rollback" }, 91 + { text: "Install wire", link: "/guides/installation" }, 92 + { text: "Apply your Config", link: "/guides/apply" }, 93 + { text: "Target Nodes", link: "/guides/targeting" }, 94 + { 95 + text: "Flakes", 96 + items: [ 97 + { text: "Use Flakes", link: "/guides/flakes/overview" }, 98 + { 99 + text: "Keep Using nixos-rebuild", 100 + link: "/guides/flakes/nixos-rebuild", 101 + }, 102 + ], 103 + }, 104 + { 105 + text: "Features", 106 + items: [ 107 + { text: "Manage Secrets", link: "/guides/keys" }, 108 + { text: "Use Parallelism", link: "/guides/parallelism" }, 109 + { text: "Use hive.default", link: "/guides/hive-default" }, 110 + ], 111 + }, 62 112 ], 63 113 }, 64 - { 65 - text: "Use cases", 66 - items: [{ text: "Tailscale", link: "/guide/tailscale" }], 67 - }, 114 + { text: "CLI & Module Reference", link: "/reference/cli.html" }, 68 115 ], 69 116 "/reference/": [ 70 117 { ··· 91 138 markdown: { 92 139 config: (md) => { 93 140 md.use(markdownItFootnote); 94 - md.use(groupIconMdPlugin); 141 + md.use(groupIconMdPlugin, { 142 + titleBar: { includeSnippet: true }, 143 + }); 95 144 }, 96 145 }, 97 146 vite: { ··· 107 156 "hive.nix": "vscode-icons:file-type-nix", 108 157 "flake.nix": "vscode-icons:file-type-nix", 109 158 "module.nix": "vscode-icons:file-type-nix", 159 + "vm.nix": "vscode-icons:file-type-nix", 160 + "shell.nix": "vscode-icons:file-type-nix", 161 + "secrets.nix": "vscode-icons:file-type-nix", 110 162 home: localIconLoader(import.meta.url, "../assets/homemanager.svg"), 111 163 ".conf": "vscode-icons:file-type-config", 112 164 },
+2 -2
doc/guide/apply.md doc/guides/apply.md
··· 1 1 --- 2 2 comment: true 3 - title: Applying Your Config 3 + title: Apply your Config 4 4 description: How to apply a node with wire. 5 5 --- 6 6 ··· 10 10 11 11 ## What does it mean to 'apply'? 12 12 13 - Once you have [created a hive](./getting-started), you can now "apply" your 13 + Once you have created a hive, you can now "apply" your 14 14 configuration to nodes in your hive. Simply, "applying" is the term used by wire to describe **deploying the 15 15 config**. 16 16
+3 -24
doc/guide/flakes.md doc/guides/flakes/nixos-rebuild.md
··· 1 1 --- 2 2 comment: true 3 - title: Flakes 4 - description: Learn how to output a hive from a flake. 3 + title: How-to Keep Using nixos-rebuild 4 + description: How to combine outputs.nixosConfigurations with outputs.wire 5 5 --- 6 6 7 7 # {{ $frontmatter.title }} 8 8 9 9 {{ $frontmatter.description }} 10 10 11 - ## Output a hive 12 - 13 - ::: tip 14 - If you have skipped ahead, please read the previous page to understand the 15 - concept of a hive. 16 - ::: 17 - 18 - You can use wire with a flake by outputting a hive with the `wire` flake output. 19 - Just like when using a `hive.nix`, you must provide `meta.nixpkgs` which will 20 - come from an input. 21 - 22 - ::: code-group 23 - <<< @/snippets/getting-started/flake.nix [flake.nix] 24 - ::: 25 - 26 - ``` 27 - ❯ nix flake show 28 - git+file:///some/path 29 - └───colmena: unknown 30 - ``` 31 - 32 - ## How to keep using `nixos-rebuild` 11 + ## An Example 33 12 34 13 You can provide `makeHive` with your `nixosConfigurations` with the `inherit` 35 14 nix keyword. `makeHive` will merge any nodes and nixosConfigurations that share
-112
doc/guide/getting-started.md
··· 1 - --- 2 - comment: true 3 - title: Getting Started 4 - description: Getting started with Wire Tool! 5 - --- 6 - 7 - # {{ $frontmatter.title }} 8 - 9 - ## Installation 10 - 11 - Wire can be heavy to compile. You should enable the substituter `wires.cachix.org`. 12 - 13 - ::: code-group 14 - 15 - <<< @/snippets/getting-started/cache.nix [module.nix] 16 - <<< @/snippets/getting-started/nix.conf 17 - 18 - ::: 19 - 20 - ### Supported Nix & NixOS versions 21 - 22 - Wire is currently _tested_ against `unstable`, `24.11` and `25.05`. 23 - For each channel, it is tested against the given channel's `pkgs.lix`. 24 - 25 - There is currently a bug when our VM tests are ran with nixcpp. Nixcpp will try 26 - to download a file in a network sandbox, whereas Lix will not. We don't know 27 - how to solve it. Please see [#126](https://github.com/wires-org/wire/issues/126) 28 - 29 - ### NixOS / Home Manager 30 - 31 - ::: code-group 32 - 33 - <<< @/snippets/getting-started/nixos.flake.nix [flake.nix (NixOS)] 34 - <<< @/snippets/getting-started/hm.flake.nix [flake.nix (Home Manager)] 35 - <<< @/snippets/getting-started/configuration.nix 36 - <<< @/snippets/getting-started/home.nix 37 - 38 - ::: 39 - 40 - ## Your First Hive 41 - 42 - Wire groups your machines into _nodes_, which are NixOS configurations with 43 - additional information for deployment. Start by creating a `hive.nix` in the same directory as your 44 - `configuration.nix`. 45 - 46 - ::: info 47 - 48 - To include wire in these examples, we are using 49 - [npins](https://github.com/andir/npins). To create this setup you 50 - would run `npins add github wires-org wire`. 51 - 52 - ::: 53 - 54 - A `hive.nix` is an attribute set with NixOS configurations, each with a unique 55 - name. Add a node for your local machine: 56 - 57 - ```nix:line-numbers [hive.nix] 58 - let 59 - sources = import ./npins; 60 - wire = import sources.wire; 61 - in wire.makeHive { 62 - meta.nixpkgs = import sources.nixpkgs { }; 63 - 64 - my-local-machine = { 65 - imports = [./configuration.nix]; 66 - 67 - # If you don't know, find this value by running 68 - # `nix eval --expr 'builtins.currentSystem' --impure` 69 - nixpkgs.hostPlatform = "x86_64-linux"; 70 - }; 71 - } 72 - ``` 73 - 74 - ### A Remote Machine 75 - 76 - Lets add another node to your hive! This one is an example of a remote machine. 77 - 78 - ```nix:line-numbers [hive.nix] 79 - let 80 - sources = import ./npins; 81 - wire = import sources.wire; 82 - in wire.makeHive { 83 - meta.nixpkgs = import sources.nixpkgs { }; 84 - 85 - my-local-machine = { 86 - imports = [./local-machine/configuration.nix]; 87 - nixpkgs.hostPlatform = "x86_64-linux"; 88 - }; 89 - 90 - my-remote-machine = { 91 - deployment = { 92 - # buildOnTarget defaults to `false`, enable this 93 - # if the machine is strong enough to build itself. 94 - buildOnTarget = true; 95 - target = { 96 - # Some IP or host that this node is reachable by ssh under, 97 - # defaults to "my-remote-machine" (node name). 98 - host = "10.1.1.2"; 99 - # A user you can non-interactively login through ssh by, 100 - # defaults to "root". 101 - user = "root"; 102 - }; 103 - }; 104 - imports = [./remote-machine/configuration.nix]; 105 - nixpkgs.hostPlatform = "x86_64-linux"; 106 - }; 107 - } 108 - ``` 109 - 110 - > [!TIP] 111 - > Read more options in [the reference](/reference/module#deployment-target) to adjust options such as 112 - > ssh port.
+1 -1
doc/guide/hive-default.md doc/guides/hive-default.md
··· 1 1 --- 2 2 comment: true 3 - title: hive.default 3 + title: Use hive.default 4 4 description: Deduplicate options with default node configuration. 5 5 --- 6 6
+1 -1
doc/guide/keys.md doc/guides/keys.md
··· 1 1 --- 2 2 comment: true 3 - title: Secret Management 3 + title: Manage Secrets 4 4 description: Keys, files, and other out-of-store paths with Wire Tool. 5 5 --- 6 6
-3
doc/guide/magic-rollback.md
··· 1 - # Magic Rollback 2 - 3 - Magic Rollback is unimplemented.
+1 -1
doc/guide/parallelism.md doc/guides/parallelism.md
··· 1 1 --- 2 2 comment: true 3 - title: Parallelism 3 + title: Use Parallelism 4 4 description: A deeper dive into parallelism with Wire Tool. 5 5 --- 6 6
-1
doc/guide/tailscale.md
··· 1 - # Wire & Tailscale
+1 -1
doc/guide/targeting.md doc/guides/targeting.md
··· 1 1 --- 2 2 comment: true 3 - title: Targeting Nodes 3 + title: Target Nodes 4 4 description: Tags, nodes, and how to target them with Wire Tool. 5 5 --- 6 6
-49
doc/guide/wire.md
··· 1 - --- 2 - comment: true 3 - --- 4 - 5 - # What is Wire? 6 - 7 - <p style="display: flex; gap: 8px"> 8 - <a href="https://github.com/wires-org/wire/actions/workflows/test.yml?query=branch%3Amain"> 9 - <img alt="Rust Tests Status" src="https://img.shields.io/github/actions/workflow/status/wires-org/wire/test.yml?branch=main&style=flat-square&label=Rust%20Tests"> 10 - </a> 11 - 12 - <a href="https://hydra.althaea.zone/jobset/wire/main"> 13 - <img alt="BuildBot Build & VM Test Status" src="https://img.shields.io/github/checks-status/wires-org/wire/main?style=flat-square&label=BuildBot%20Build%20%26%20VM%20Tests"> 14 - </a> 15 - 16 - <a href="https://github.com/wires-org/wire/actions/workflows/pages.yml?query=branch%3Amain"> 17 - <img alt="Documentation Status" src="https://img.shields.io/github/actions/workflow/status/wires-org/wire/pages.yml?branch=main&style=flat-square&label=Documentation"> 18 - </a> 19 - </p> 20 - 21 - Wire is a tool to deploy NixOS systems. Its usage is inspired by [colmena](https://colmena.cli.rs/). In many places it's configuration attempts to remain a superset[^1] of colmena, however it is **not** a fork. 22 - 23 - [^1]: A lot of your colmena module options will continue to work with wire, but wire has additional ergonomic changes you can take advantage of. 24 - 25 - ::: warning 26 - Wire is alpha software, please use at your own risk. Many features listed in this documentation may not be complete / implemented. 27 - ::: 28 - 29 - <div class="tip custom-block" style="padding-top: 8px"> 30 - 31 - Ready? Skip to the [Quickstart](./getting-started). 32 - 33 - </div> 34 - 35 - ## Why Wire? 36 - 37 - ::: info 38 - The following is the goal for a stable release and not fully implemented. 39 - ::: 40 - 41 - | Features | Wire | Colmena | 42 - | ------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------- | 43 - | Secret Management | :white_check_mark: | :white_check_mark: | 44 - | Parallel Evaluation | :white_check_mark: | [Experimental](https://colmena.cli.rs/unstable/features/parallelism.html#parallel-evaluation-experimental) | 45 - | Node Tagging | :white_check_mark: | :white_check_mark: | 46 - | Pipeline Support | :white_check_mark: | :x:[^2] | 47 - | Magic Rollback | :white_check_mark: (Planned) | :x: | 48 - 49 - [^2]: You need to write custom nix code to use Colmena hive metadata inside environments like CI pipelines, bash scripting, etc., which requires a knowledge of its internals.
+30
doc/guides/flakes/overview.md
··· 1 + --- 2 + comment: true 3 + title: Flakes 4 + description: How to output a hive from a flake. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + {{ $frontmatter.description }} 10 + 11 + ## Output a hive 12 + 13 + ::: tip 14 + If you have skipped ahead, please read the previous page to understand the 15 + concept of a hive. 16 + ::: 17 + 18 + You can use wire with a flake by outputting a hive with the `wire` flake output. 19 + Just like when using a `hive.nix`, you must provide `meta.nixpkgs` which will 20 + come from an input. 21 + 22 + ::: code-group 23 + <<< @/snippets/getting-started/flake.nix [flake.nix] 24 + ::: 25 + 26 + ``` 27 + ❯ nix flake show 28 + git+file:///some/path 29 + └───colmena: unknown 30 + ```
+5
doc/guides/installation.md
··· 1 + --- 2 + comment: false 3 + --- 4 + 5 + # Install Wire
+4 -4
doc/index.md
··· 8 8 # tagline: My great project tagline 9 9 actions: 10 10 - theme: brand 11 - text: Read Guide 12 - link: /guide/wire 11 + text: Read Tutorial 12 + link: /tutorial/overview 13 13 - theme: alt 14 - text: Reference 15 - link: /reference/cli 14 + text: Guides 15 + link: /guides/installation 16 16 17 17 features: 18 18 - title: Parallelism
+1 -1
doc/package.nix
··· 51 51 pnpmDeps = pnpm.fetchDeps { 52 52 inherit (finalAttrs) pname version src; 53 53 fetcherVersion = 1; 54 - hash = "sha256-fFQ2/APhVCA3tSi3BsVB+Ym/N7eJZZoD/+lO04lf63g="; 54 + hash = "sha256-bcjSzdG8AwqjWlCy3eN/Z7nKZ6pr13XXu2tJlWKBkgc="; 55 55 }; 56 56 patchPhase = '' 57 57 cat ${optionsDoc} >> ./reference/module.md
+280 -296
doc/pnpm-lock.yaml
··· 16 16 version: 1.1.15(vue@3.5.22) 17 17 vitepress-plugin-group-icons: 18 18 specifier: ^1.6.3 19 - version: 1.6.3(markdown-it@14.1.0)(vite@5.4.19) 19 + version: 1.6.3(markdown-it@14.1.0)(vite@5.4.20) 20 20 devDependencies: 21 21 mermaid: 22 22 specifier: ^11.12.0 23 23 version: 11.12.0 24 24 vitepress: 25 25 specifier: ^1.6.4 26 - version: 1.6.4(@algolia/client-search@5.35.0)(postcss@8.5.6)(search-insights@2.17.3) 26 + version: 1.6.4(@algolia/client-search@5.40.0)(postcss@8.5.6)(search-insights@2.17.3) 27 27 vitepress-plugin-mermaid: 28 28 specifier: ^2.0.17 29 - version: 2.0.17(mermaid@11.12.0)(vitepress@1.6.4(@algolia/client-search@5.35.0)(postcss@8.5.6)(search-insights@2.17.3)) 29 + version: 2.0.17(mermaid@11.12.0)(vitepress@1.6.4(@algolia/client-search@5.40.0)(postcss@8.5.6)(search-insights@2.17.3)) 30 30 vue: 31 31 specifier: ^3.5.22 32 32 version: 3.5.22 33 33 34 34 packages: 35 35 36 - '@algolia/abtesting@1.1.0': 37 - resolution: {integrity: sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==} 36 + '@algolia/abtesting@1.6.0': 37 + resolution: {integrity: sha512-c4M/Z/KWkEG+RHpZsWKDTTlApXu3fe4vlABNcpankWBhdMe4oPZ/r4JxEr2zKUP6K+BT66tnp8UbHmgOd/vvqQ==} 38 38 engines: {node: '>= 14.0.0'} 39 39 40 40 '@algolia/autocomplete-core@1.17.7': ··· 57 57 '@algolia/client-search': '>= 4.9.1 < 6' 58 58 algoliasearch: '>= 4.9.1 < 6' 59 59 60 - '@algolia/client-abtesting@5.35.0': 61 - resolution: {integrity: sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==} 60 + '@algolia/client-abtesting@5.40.0': 61 + resolution: {integrity: sha512-qegVlgHtmiS8m9nEsuKUVhlw1FHsIshtt5nhNnA6EYz3g+tm9+xkVZZMzkrMLPP7kpoheHJZAwz2MYnHtwFa9A==} 62 62 engines: {node: '>= 14.0.0'} 63 63 64 - '@algolia/client-analytics@5.35.0': 65 - resolution: {integrity: sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==} 64 + '@algolia/client-analytics@5.40.0': 65 + resolution: {integrity: sha512-Dw2c+6KGkw7mucnnxPyyMsIGEY8+hqv6oB+viYB612OMM3l8aNaWToBZMnNvXsyP+fArwq7XGR+k3boPZyV53A==} 66 66 engines: {node: '>= 14.0.0'} 67 67 68 - '@algolia/client-common@5.35.0': 69 - resolution: {integrity: sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==} 68 + '@algolia/client-common@5.40.0': 69 + resolution: {integrity: sha512-dbE4+MJIDsTghG3hUYWBq7THhaAmqNqvW9g2vzwPf5edU4IRmuYpKtY3MMotes8/wdTasWG07XoaVhplJBlvdg==} 70 70 engines: {node: '>= 14.0.0'} 71 71 72 - '@algolia/client-insights@5.35.0': 73 - resolution: {integrity: sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==} 72 + '@algolia/client-insights@5.40.0': 73 + resolution: {integrity: sha512-SH6zlROyGUCDDWg71DlCnbbZ/zEHYPZC8k901EAaBVhvY43Ju8Wa6LAcMPC4tahcDBgkG2poBy8nJZXvwEWAlQ==} 74 74 engines: {node: '>= 14.0.0'} 75 75 76 - '@algolia/client-personalization@5.35.0': 77 - resolution: {integrity: sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==} 76 + '@algolia/client-personalization@5.40.0': 77 + resolution: {integrity: sha512-EgHjJEEf7CbUL9gJHI1ULmAtAFeym2cFNSAi1uwHelWgLPcnLjYW2opruPxigOV7NcetkGu+t2pcWOWmZFuvKQ==} 78 78 engines: {node: '>= 14.0.0'} 79 79 80 - '@algolia/client-query-suggestions@5.35.0': 81 - resolution: {integrity: sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==} 80 + '@algolia/client-query-suggestions@5.40.0': 81 + resolution: {integrity: sha512-HvE1jtCag95DR41tDh7cGwrMk4X0aQXPOBIhZRmsBPolMeqRJz0kvfVw8VCKvA1uuoAkjFfTG0X0IZED+rKXoA==} 82 82 engines: {node: '>= 14.0.0'} 83 83 84 - '@algolia/client-search@5.35.0': 85 - resolution: {integrity: sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==} 84 + '@algolia/client-search@5.40.0': 85 + resolution: {integrity: sha512-nlr/MMgoLNUHcfWC5Ns2ENrzKx9x51orPc6wJ8Ignv1DsrUmKm0LUih+Tj3J+kxYofzqQIQRU495d4xn3ozMbg==} 86 86 engines: {node: '>= 14.0.0'} 87 87 88 - '@algolia/ingestion@1.35.0': 89 - resolution: {integrity: sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==} 88 + '@algolia/ingestion@1.40.0': 89 + resolution: {integrity: sha512-OfHnhE+P0f+p3i90Kmshf9Epgesw5oPV1IEUOY4Mq1HV7cQk16gvklVN1EaY/T9sVavl+Vc3g4ojlfpIwZFA4g==} 90 90 engines: {node: '>= 14.0.0'} 91 91 92 - '@algolia/monitoring@1.35.0': 93 - resolution: {integrity: sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==} 92 + '@algolia/monitoring@1.40.0': 93 + resolution: {integrity: sha512-SWANV32PTKhBYvwKozeWP9HOnVabOixAuPdFFGoqtysTkkwutrtGI/rrh80tvG+BnQAmZX0vUmD/RqFZVfr/Yg==} 94 94 engines: {node: '>= 14.0.0'} 95 95 96 - '@algolia/recommend@5.35.0': 97 - resolution: {integrity: sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==} 96 + '@algolia/recommend@5.40.0': 97 + resolution: {integrity: sha512-1Qxy9I5bSb3mrhPk809DllMa561zl5hLsMR6YhIqNkqQ0OyXXQokvJ2zApSxvd39veRZZnhN+oGe+XNoNwLgkw==} 98 98 engines: {node: '>= 14.0.0'} 99 99 100 - '@algolia/requester-browser-xhr@5.35.0': 101 - resolution: {integrity: sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==} 100 + '@algolia/requester-browser-xhr@5.40.0': 101 + resolution: {integrity: sha512-MGt94rdHfkrVjfN/KwUfWcnaeohYbWGINrPs96f5J7ZyRYpVLF+VtPQ2FmcddFvK4gnKXSu8BAi81hiIhUpm3w==} 102 102 engines: {node: '>= 14.0.0'} 103 103 104 - '@algolia/requester-fetch@5.35.0': 105 - resolution: {integrity: sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==} 104 + '@algolia/requester-fetch@5.40.0': 105 + resolution: {integrity: sha512-wXQ05JZZ10Dr642QVAkAZ4ZZlU+lh5r6dIBGmm9WElz+1EaQ6BNYtEOTV6pkXuFYsZpeJA89JpDOiwBOP9j24w==} 106 106 engines: {node: '>= 14.0.0'} 107 107 108 - '@algolia/requester-node-http@5.35.0': 109 - resolution: {integrity: sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==} 108 + '@algolia/requester-node-http@5.40.0': 109 + resolution: {integrity: sha512-5qCRoySnzpbQVg2IPLGFCm4LF75pToxI5tdjOYgUMNL/um91aJ4dH3SVdBEuFlVsalxl8mh3bWPgkUmv6NpJiQ==} 110 110 engines: {node: '>= 14.0.0'} 111 111 112 112 '@antfu/install-pkg@1.1.0': 113 113 resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} 114 114 115 - '@antfu/utils@9.2.0': 116 - resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} 115 + '@antfu/utils@9.3.0': 116 + resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} 117 117 118 118 '@babel/helper-string-parser@7.27.1': 119 119 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} ··· 322 322 '@iconify-json/logos@1.2.9': 323 323 resolution: {integrity: sha512-G6VCdFnwZcrT6Eveq3m43oJfLw/CX8plwFcE+2jgv3fiGB64pTmnU7Yd1MNZ/eA+/Re2iEDhuCfSNOWTHwwK8w==} 324 324 325 - '@iconify-json/simple-icons@1.2.47': 326 - resolution: {integrity: sha512-wa/2O7G4sBmwSEWWLh5C+HeY00lVOoWYRKJOYQtk7lAbQrHUReD1ijiGOyTynV1YavxtNueL1CBA1UZmYJfOrQ==} 325 + '@iconify-json/simple-icons@1.2.54': 326 + resolution: {integrity: sha512-OQQYl8yC5j3QklZOYnK31QYe5h47IhyCoxSLd53f0e0nA4dgi8VOZS30SgSAbsecQ+S0xlGJMjXIHTIqZ+ML3w==} 327 327 328 - '@iconify-json/vscode-icons@1.2.29': 329 - resolution: {integrity: sha512-ByqO3YPYs0n7hakQ/ZUXltJQnYibeOv41H1AdciOs7Pmba5/OsKKK1/oOjcBmvXrYuENO+IvIzORYkl6sFXgqA==} 328 + '@iconify-json/vscode-icons@1.2.31': 329 + resolution: {integrity: sha512-lVb4R5CxosCsnGnQQ3NzrXWLgSeQoq+I2sYCowveVNHFwO2fGGbVmUTc6ApFkjxlqT1i43lNgM9zZuhnkL64hQ==} 330 330 331 331 '@iconify/types@2.0.0': 332 332 resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 333 333 334 - '@iconify/utils@3.0.1': 335 - resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==} 336 - 337 334 '@iconify/utils@3.0.2': 338 335 resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} 339 336 ··· 349 346 '@mermaid-js/mermaid-mindmap@9.3.0': 350 347 resolution: {integrity: sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw==} 351 348 352 - '@mermaid-js/parser@0.6.2': 353 - resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==} 349 + '@mermaid-js/parser@0.6.3': 350 + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} 354 351 355 - '@rollup/rollup-android-arm-eabi@4.46.2': 356 - resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} 352 + '@rollup/rollup-android-arm-eabi@4.52.4': 353 + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} 357 354 cpu: [arm] 358 355 os: [android] 359 356 360 - '@rollup/rollup-android-arm64@4.46.2': 361 - resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} 357 + '@rollup/rollup-android-arm64@4.52.4': 358 + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} 362 359 cpu: [arm64] 363 360 os: [android] 364 361 365 - '@rollup/rollup-darwin-arm64@4.46.2': 366 - resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} 362 + '@rollup/rollup-darwin-arm64@4.52.4': 363 + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} 367 364 cpu: [arm64] 368 365 os: [darwin] 369 366 370 - '@rollup/rollup-darwin-x64@4.46.2': 371 - resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} 367 + '@rollup/rollup-darwin-x64@4.52.4': 368 + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} 372 369 cpu: [x64] 373 370 os: [darwin] 374 371 375 - '@rollup/rollup-freebsd-arm64@4.46.2': 376 - resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} 372 + '@rollup/rollup-freebsd-arm64@4.52.4': 373 + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} 377 374 cpu: [arm64] 378 375 os: [freebsd] 379 376 380 - '@rollup/rollup-freebsd-x64@4.46.2': 381 - resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} 377 + '@rollup/rollup-freebsd-x64@4.52.4': 378 + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} 382 379 cpu: [x64] 383 380 os: [freebsd] 384 381 385 - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 386 - resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} 382 + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 383 + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} 387 384 cpu: [arm] 388 385 os: [linux] 389 386 390 - '@rollup/rollup-linux-arm-musleabihf@4.46.2': 391 - resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} 387 + '@rollup/rollup-linux-arm-musleabihf@4.52.4': 388 + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} 392 389 cpu: [arm] 393 390 os: [linux] 394 391 395 - '@rollup/rollup-linux-arm64-gnu@4.46.2': 396 - resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} 392 + '@rollup/rollup-linux-arm64-gnu@4.52.4': 393 + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} 397 394 cpu: [arm64] 398 395 os: [linux] 399 396 400 - '@rollup/rollup-linux-arm64-musl@4.46.2': 401 - resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} 397 + '@rollup/rollup-linux-arm64-musl@4.52.4': 398 + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} 402 399 cpu: [arm64] 403 400 os: [linux] 404 401 405 - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 406 - resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} 402 + '@rollup/rollup-linux-loong64-gnu@4.52.4': 403 + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} 407 404 cpu: [loong64] 408 405 os: [linux] 409 406 410 - '@rollup/rollup-linux-ppc64-gnu@4.46.2': 411 - resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} 407 + '@rollup/rollup-linux-ppc64-gnu@4.52.4': 408 + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} 412 409 cpu: [ppc64] 413 410 os: [linux] 414 411 415 - '@rollup/rollup-linux-riscv64-gnu@4.46.2': 416 - resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} 412 + '@rollup/rollup-linux-riscv64-gnu@4.52.4': 413 + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} 417 414 cpu: [riscv64] 418 415 os: [linux] 419 416 420 - '@rollup/rollup-linux-riscv64-musl@4.46.2': 421 - resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} 417 + '@rollup/rollup-linux-riscv64-musl@4.52.4': 418 + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} 422 419 cpu: [riscv64] 423 420 os: [linux] 424 421 425 - '@rollup/rollup-linux-s390x-gnu@4.46.2': 426 - resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} 422 + '@rollup/rollup-linux-s390x-gnu@4.52.4': 423 + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} 427 424 cpu: [s390x] 428 425 os: [linux] 429 426 430 - '@rollup/rollup-linux-x64-gnu@4.46.2': 431 - resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} 427 + '@rollup/rollup-linux-x64-gnu@4.52.4': 428 + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} 432 429 cpu: [x64] 433 430 os: [linux] 434 431 435 - '@rollup/rollup-linux-x64-musl@4.46.2': 436 - resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} 432 + '@rollup/rollup-linux-x64-musl@4.52.4': 433 + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} 437 434 cpu: [x64] 438 435 os: [linux] 439 436 440 - '@rollup/rollup-win32-arm64-msvc@4.46.2': 441 - resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} 437 + '@rollup/rollup-openharmony-arm64@4.52.4': 438 + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} 439 + cpu: [arm64] 440 + os: [openharmony] 441 + 442 + '@rollup/rollup-win32-arm64-msvc@4.52.4': 443 + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} 442 444 cpu: [arm64] 443 445 os: [win32] 444 446 445 - '@rollup/rollup-win32-ia32-msvc@4.46.2': 446 - resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} 447 + '@rollup/rollup-win32-ia32-msvc@4.52.4': 448 + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} 447 449 cpu: [ia32] 448 450 os: [win32] 449 451 450 - '@rollup/rollup-win32-x64-msvc@4.46.2': 451 - resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} 452 + '@rollup/rollup-win32-x64-gnu@4.52.4': 453 + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} 454 + cpu: [x64] 455 + os: [win32] 456 + 457 + '@rollup/rollup-win32-x64-msvc@4.52.4': 458 + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} 452 459 cpu: [x64] 453 460 os: [win32] 454 461 ··· 644 651 peerDependencies: 645 652 vue: 3.5.22 646 653 647 - '@vue/shared@3.5.18': 648 - resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} 649 - 650 654 '@vue/shared@3.5.22': 651 655 resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} 652 656 ··· 705 709 engines: {node: '>=0.4.0'} 706 710 hasBin: true 707 711 708 - algoliasearch@5.35.0: 709 - resolution: {integrity: sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==} 712 + algoliasearch@5.40.0: 713 + resolution: {integrity: sha512-a9aIL2E3Z7uYUPMCmjMFFd5MWhn+ccTubEvnMy7rOTZCB62dXBJtz0R5BZ/TPuX3R9ocBsgWuAbGWQ+Ph4Fmlg==} 710 714 engines: {node: '>= 14.0.0'} 711 715 712 716 argparse@2.0.1: 713 717 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 714 718 715 - birpc@2.5.0: 716 - resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} 719 + birpc@2.6.1: 720 + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} 717 721 718 722 ccount@2.0.1: 719 723 resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} ··· 921 925 dayjs@1.11.18: 922 926 resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} 923 927 924 - debug@4.4.1: 925 - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 926 - engines: {node: '>=6.0'} 927 - peerDependencies: 928 - supports-color: '*' 929 - peerDependenciesMeta: 930 - supports-color: 931 - optional: true 932 - 933 928 debug@4.4.3: 934 929 resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 935 930 engines: {node: '>=6.0'} ··· 1015 1010 resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 1016 1011 engines: {node: '>=12.13'} 1017 1012 1018 - katex@0.16.22: 1019 - resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} 1013 + katex@0.16.23: 1014 + resolution: {integrity: sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==} 1020 1015 hasBin: true 1021 1016 1022 1017 khroma@2.1.0: ··· 1067 1062 resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} 1068 1063 hasBin: true 1069 1064 1070 - marked@16.3.0: 1071 - resolution: {integrity: sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==} 1065 + marked@16.4.0: 1066 + resolution: {integrity: sha512-CTPAcRBq57cn3R8n3hwc2REddc28hjR7RzDXQ+lXLmMJYqn20BaI2cGw6QjgZGIgVfp2Wdfw4aMzgNteQ6qJgQ==} 1072 1067 engines: {node: '>= 20'} 1073 1068 hasBin: true 1074 1069 ··· 1096 1091 micromark-util-types@2.0.2: 1097 1092 resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 1098 1093 1099 - minisearch@7.1.2: 1100 - resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} 1094 + minisearch@7.2.0: 1095 + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} 1101 1096 1102 1097 mitt@3.0.1: 1103 1098 resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} ··· 1119 1114 oniguruma-to-es@3.1.1: 1120 1115 resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} 1121 1116 1122 - package-manager-detector@1.3.0: 1123 - resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} 1117 + package-manager-detector@1.4.0: 1118 + resolution: {integrity: sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw==} 1124 1119 1125 1120 path-data-parser@0.1.0: 1126 1121 resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} ··· 1150 1145 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1151 1146 engines: {node: ^10 || ^12 || >=14} 1152 1147 1153 - preact@10.27.0: 1154 - resolution: {integrity: sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==} 1148 + preact@10.27.2: 1149 + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} 1155 1150 1156 1151 property-information@7.1.0: 1157 1152 resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} ··· 1178 1173 robust-predicates@3.0.2: 1179 1174 resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} 1180 1175 1181 - rollup@4.46.2: 1182 - resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} 1176 + rollup@4.52.4: 1177 + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} 1183 1178 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1184 1179 hasBin: true 1185 1180 ··· 1263 1258 vfile@6.0.3: 1264 1259 resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 1265 1260 1266 - vite@5.4.19: 1267 - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} 1261 + vite@5.4.20: 1262 + resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} 1268 1263 engines: {node: ^18.0.0 || >=20.0.0} 1269 1264 hasBin: true 1270 1265 peerDependencies: ··· 1354 1349 1355 1350 snapshots: 1356 1351 1357 - '@algolia/abtesting@1.1.0': 1352 + '@algolia/abtesting@1.6.0': 1358 1353 dependencies: 1359 - '@algolia/client-common': 5.35.0 1360 - '@algolia/requester-browser-xhr': 5.35.0 1361 - '@algolia/requester-fetch': 5.35.0 1362 - '@algolia/requester-node-http': 5.35.0 1354 + '@algolia/client-common': 5.40.0 1355 + '@algolia/requester-browser-xhr': 5.40.0 1356 + '@algolia/requester-fetch': 5.40.0 1357 + '@algolia/requester-node-http': 5.40.0 1363 1358 1364 - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.3)': 1359 + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': 1365 1360 dependencies: 1366 - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.3) 1367 - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) 1361 + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) 1362 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) 1368 1363 transitivePeerDependencies: 1369 1364 - '@algolia/client-search' 1370 1365 - algoliasearch 1371 1366 - search-insights 1372 1367 1373 - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.3)': 1368 + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': 1374 1369 dependencies: 1375 - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) 1370 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) 1376 1371 search-insights: 2.17.3 1377 1372 transitivePeerDependencies: 1378 1373 - '@algolia/client-search' 1379 1374 - algoliasearch 1380 1375 1381 - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)': 1376 + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': 1382 1377 dependencies: 1383 - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) 1384 - '@algolia/client-search': 5.35.0 1385 - algoliasearch: 5.35.0 1378 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) 1379 + '@algolia/client-search': 5.40.0 1380 + algoliasearch: 5.40.0 1386 1381 1387 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)': 1382 + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': 1388 1383 dependencies: 1389 - '@algolia/client-search': 5.35.0 1390 - algoliasearch: 5.35.0 1384 + '@algolia/client-search': 5.40.0 1385 + algoliasearch: 5.40.0 1391 1386 1392 - '@algolia/client-abtesting@5.35.0': 1387 + '@algolia/client-abtesting@5.40.0': 1393 1388 dependencies: 1394 - '@algolia/client-common': 5.35.0 1395 - '@algolia/requester-browser-xhr': 5.35.0 1396 - '@algolia/requester-fetch': 5.35.0 1397 - '@algolia/requester-node-http': 5.35.0 1389 + '@algolia/client-common': 5.40.0 1390 + '@algolia/requester-browser-xhr': 5.40.0 1391 + '@algolia/requester-fetch': 5.40.0 1392 + '@algolia/requester-node-http': 5.40.0 1398 1393 1399 - '@algolia/client-analytics@5.35.0': 1394 + '@algolia/client-analytics@5.40.0': 1400 1395 dependencies: 1401 - '@algolia/client-common': 5.35.0 1402 - '@algolia/requester-browser-xhr': 5.35.0 1403 - '@algolia/requester-fetch': 5.35.0 1404 - '@algolia/requester-node-http': 5.35.0 1396 + '@algolia/client-common': 5.40.0 1397 + '@algolia/requester-browser-xhr': 5.40.0 1398 + '@algolia/requester-fetch': 5.40.0 1399 + '@algolia/requester-node-http': 5.40.0 1405 1400 1406 - '@algolia/client-common@5.35.0': {} 1401 + '@algolia/client-common@5.40.0': {} 1407 1402 1408 - '@algolia/client-insights@5.35.0': 1403 + '@algolia/client-insights@5.40.0': 1409 1404 dependencies: 1410 - '@algolia/client-common': 5.35.0 1411 - '@algolia/requester-browser-xhr': 5.35.0 1412 - '@algolia/requester-fetch': 5.35.0 1413 - '@algolia/requester-node-http': 5.35.0 1405 + '@algolia/client-common': 5.40.0 1406 + '@algolia/requester-browser-xhr': 5.40.0 1407 + '@algolia/requester-fetch': 5.40.0 1408 + '@algolia/requester-node-http': 5.40.0 1414 1409 1415 - '@algolia/client-personalization@5.35.0': 1410 + '@algolia/client-personalization@5.40.0': 1416 1411 dependencies: 1417 - '@algolia/client-common': 5.35.0 1418 - '@algolia/requester-browser-xhr': 5.35.0 1419 - '@algolia/requester-fetch': 5.35.0 1420 - '@algolia/requester-node-http': 5.35.0 1412 + '@algolia/client-common': 5.40.0 1413 + '@algolia/requester-browser-xhr': 5.40.0 1414 + '@algolia/requester-fetch': 5.40.0 1415 + '@algolia/requester-node-http': 5.40.0 1421 1416 1422 - '@algolia/client-query-suggestions@5.35.0': 1417 + '@algolia/client-query-suggestions@5.40.0': 1423 1418 dependencies: 1424 - '@algolia/client-common': 5.35.0 1425 - '@algolia/requester-browser-xhr': 5.35.0 1426 - '@algolia/requester-fetch': 5.35.0 1427 - '@algolia/requester-node-http': 5.35.0 1419 + '@algolia/client-common': 5.40.0 1420 + '@algolia/requester-browser-xhr': 5.40.0 1421 + '@algolia/requester-fetch': 5.40.0 1422 + '@algolia/requester-node-http': 5.40.0 1428 1423 1429 - '@algolia/client-search@5.35.0': 1424 + '@algolia/client-search@5.40.0': 1430 1425 dependencies: 1431 - '@algolia/client-common': 5.35.0 1432 - '@algolia/requester-browser-xhr': 5.35.0 1433 - '@algolia/requester-fetch': 5.35.0 1434 - '@algolia/requester-node-http': 5.35.0 1426 + '@algolia/client-common': 5.40.0 1427 + '@algolia/requester-browser-xhr': 5.40.0 1428 + '@algolia/requester-fetch': 5.40.0 1429 + '@algolia/requester-node-http': 5.40.0 1435 1430 1436 - '@algolia/ingestion@1.35.0': 1431 + '@algolia/ingestion@1.40.0': 1437 1432 dependencies: 1438 - '@algolia/client-common': 5.35.0 1439 - '@algolia/requester-browser-xhr': 5.35.0 1440 - '@algolia/requester-fetch': 5.35.0 1441 - '@algolia/requester-node-http': 5.35.0 1433 + '@algolia/client-common': 5.40.0 1434 + '@algolia/requester-browser-xhr': 5.40.0 1435 + '@algolia/requester-fetch': 5.40.0 1436 + '@algolia/requester-node-http': 5.40.0 1442 1437 1443 - '@algolia/monitoring@1.35.0': 1438 + '@algolia/monitoring@1.40.0': 1444 1439 dependencies: 1445 - '@algolia/client-common': 5.35.0 1446 - '@algolia/requester-browser-xhr': 5.35.0 1447 - '@algolia/requester-fetch': 5.35.0 1448 - '@algolia/requester-node-http': 5.35.0 1440 + '@algolia/client-common': 5.40.0 1441 + '@algolia/requester-browser-xhr': 5.40.0 1442 + '@algolia/requester-fetch': 5.40.0 1443 + '@algolia/requester-node-http': 5.40.0 1449 1444 1450 - '@algolia/recommend@5.35.0': 1445 + '@algolia/recommend@5.40.0': 1451 1446 dependencies: 1452 - '@algolia/client-common': 5.35.0 1453 - '@algolia/requester-browser-xhr': 5.35.0 1454 - '@algolia/requester-fetch': 5.35.0 1455 - '@algolia/requester-node-http': 5.35.0 1447 + '@algolia/client-common': 5.40.0 1448 + '@algolia/requester-browser-xhr': 5.40.0 1449 + '@algolia/requester-fetch': 5.40.0 1450 + '@algolia/requester-node-http': 5.40.0 1456 1451 1457 - '@algolia/requester-browser-xhr@5.35.0': 1452 + '@algolia/requester-browser-xhr@5.40.0': 1458 1453 dependencies: 1459 - '@algolia/client-common': 5.35.0 1454 + '@algolia/client-common': 5.40.0 1460 1455 1461 - '@algolia/requester-fetch@5.35.0': 1456 + '@algolia/requester-fetch@5.40.0': 1462 1457 dependencies: 1463 - '@algolia/client-common': 5.35.0 1458 + '@algolia/client-common': 5.40.0 1464 1459 1465 - '@algolia/requester-node-http@5.35.0': 1460 + '@algolia/requester-node-http@5.40.0': 1466 1461 dependencies: 1467 - '@algolia/client-common': 5.35.0 1462 + '@algolia/client-common': 5.40.0 1468 1463 1469 1464 '@antfu/install-pkg@1.1.0': 1470 1465 dependencies: 1471 - package-manager-detector: 1.3.0 1466 + package-manager-detector: 1.4.0 1472 1467 tinyexec: 1.0.1 1473 1468 1474 - '@antfu/utils@9.2.0': {} 1469 + '@antfu/utils@9.3.0': {} 1475 1470 1476 1471 '@babel/helper-string-parser@7.27.1': {} 1477 1472 ··· 1510 1505 1511 1506 '@docsearch/css@3.8.2': {} 1512 1507 1513 - '@docsearch/js@3.8.2(@algolia/client-search@5.35.0)(search-insights@2.17.3)': 1508 + '@docsearch/js@3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3)': 1514 1509 dependencies: 1515 - '@docsearch/react': 3.8.2(@algolia/client-search@5.35.0)(search-insights@2.17.3) 1516 - preact: 10.27.0 1510 + '@docsearch/react': 3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3) 1511 + preact: 10.27.2 1517 1512 transitivePeerDependencies: 1518 1513 - '@algolia/client-search' 1519 1514 - '@types/react' ··· 1521 1516 - react-dom 1522 1517 - search-insights 1523 1518 1524 - '@docsearch/react@3.8.2(@algolia/client-search@5.35.0)(search-insights@2.17.3)': 1519 + '@docsearch/react@3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3)': 1525 1520 dependencies: 1526 - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.3) 1527 - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) 1521 + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) 1522 + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) 1528 1523 '@docsearch/css': 3.8.2 1529 - algoliasearch: 5.35.0 1524 + algoliasearch: 5.40.0 1530 1525 optionalDependencies: 1531 1526 search-insights: 2.17.3 1532 1527 transitivePeerDependencies: ··· 1610 1605 dependencies: 1611 1606 '@iconify/types': 2.0.0 1612 1607 1613 - '@iconify-json/simple-icons@1.2.47': 1608 + '@iconify-json/simple-icons@1.2.54': 1614 1609 dependencies: 1615 1610 '@iconify/types': 2.0.0 1616 1611 1617 - '@iconify-json/vscode-icons@1.2.29': 1612 + '@iconify-json/vscode-icons@1.2.31': 1618 1613 dependencies: 1619 1614 '@iconify/types': 2.0.0 1620 1615 1621 1616 '@iconify/types@2.0.0': {} 1622 1617 1623 - '@iconify/utils@3.0.1': 1624 - dependencies: 1625 - '@antfu/install-pkg': 1.1.0 1626 - '@antfu/utils': 9.2.0 1627 - '@iconify/types': 2.0.0 1628 - debug: 4.4.1 1629 - globals: 15.15.0 1630 - kolorist: 1.8.0 1631 - local-pkg: 1.1.2 1632 - mlly: 1.8.0 1633 - transitivePeerDependencies: 1634 - - supports-color 1635 - 1636 1618 '@iconify/utils@3.0.2': 1637 1619 dependencies: 1638 1620 '@antfu/install-pkg': 1.1.0 1639 - '@antfu/utils': 9.2.0 1621 + '@antfu/utils': 9.3.0 1640 1622 '@iconify/types': 2.0.0 1641 1623 debug: 4.4.3 1642 1624 globals: 15.15.0 ··· 1665 1647 non-layered-tidy-tree-layout: 2.0.2 1666 1648 optional: true 1667 1649 1668 - '@mermaid-js/parser@0.6.2': 1650 + '@mermaid-js/parser@0.6.3': 1669 1651 dependencies: 1670 1652 langium: 3.3.1 1671 1653 1672 - '@rollup/rollup-android-arm-eabi@4.46.2': 1654 + '@rollup/rollup-android-arm-eabi@4.52.4': 1673 1655 optional: true 1674 1656 1675 - '@rollup/rollup-android-arm64@4.46.2': 1657 + '@rollup/rollup-android-arm64@4.52.4': 1676 1658 optional: true 1677 1659 1678 - '@rollup/rollup-darwin-arm64@4.46.2': 1660 + '@rollup/rollup-darwin-arm64@4.52.4': 1679 1661 optional: true 1680 1662 1681 - '@rollup/rollup-darwin-x64@4.46.2': 1663 + '@rollup/rollup-darwin-x64@4.52.4': 1682 1664 optional: true 1683 1665 1684 - '@rollup/rollup-freebsd-arm64@4.46.2': 1666 + '@rollup/rollup-freebsd-arm64@4.52.4': 1685 1667 optional: true 1686 1668 1687 - '@rollup/rollup-freebsd-x64@4.46.2': 1669 + '@rollup/rollup-freebsd-x64@4.52.4': 1688 1670 optional: true 1689 1671 1690 - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': 1672 + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 1691 1673 optional: true 1692 1674 1693 - '@rollup/rollup-linux-arm-musleabihf@4.46.2': 1675 + '@rollup/rollup-linux-arm-musleabihf@4.52.4': 1694 1676 optional: true 1695 1677 1696 - '@rollup/rollup-linux-arm64-gnu@4.46.2': 1678 + '@rollup/rollup-linux-arm64-gnu@4.52.4': 1697 1679 optional: true 1698 1680 1699 - '@rollup/rollup-linux-arm64-musl@4.46.2': 1681 + '@rollup/rollup-linux-arm64-musl@4.52.4': 1700 1682 optional: true 1701 1683 1702 - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': 1684 + '@rollup/rollup-linux-loong64-gnu@4.52.4': 1703 1685 optional: true 1704 1686 1705 - '@rollup/rollup-linux-ppc64-gnu@4.46.2': 1687 + '@rollup/rollup-linux-ppc64-gnu@4.52.4': 1706 1688 optional: true 1707 1689 1708 - '@rollup/rollup-linux-riscv64-gnu@4.46.2': 1690 + '@rollup/rollup-linux-riscv64-gnu@4.52.4': 1709 1691 optional: true 1710 1692 1711 - '@rollup/rollup-linux-riscv64-musl@4.46.2': 1693 + '@rollup/rollup-linux-riscv64-musl@4.52.4': 1712 1694 optional: true 1713 1695 1714 - '@rollup/rollup-linux-s390x-gnu@4.46.2': 1696 + '@rollup/rollup-linux-s390x-gnu@4.52.4': 1715 1697 optional: true 1716 1698 1717 - '@rollup/rollup-linux-x64-gnu@4.46.2': 1699 + '@rollup/rollup-linux-x64-gnu@4.52.4': 1718 1700 optional: true 1719 1701 1720 - '@rollup/rollup-linux-x64-musl@4.46.2': 1702 + '@rollup/rollup-linux-x64-musl@4.52.4': 1721 1703 optional: true 1722 1704 1723 - '@rollup/rollup-win32-arm64-msvc@4.46.2': 1705 + '@rollup/rollup-openharmony-arm64@4.52.4': 1724 1706 optional: true 1725 1707 1726 - '@rollup/rollup-win32-ia32-msvc@4.46.2': 1708 + '@rollup/rollup-win32-arm64-msvc@4.52.4': 1727 1709 optional: true 1728 1710 1729 - '@rollup/rollup-win32-x64-msvc@4.46.2': 1711 + '@rollup/rollup-win32-ia32-msvc@4.52.4': 1712 + optional: true 1713 + 1714 + '@rollup/rollup-win32-x64-gnu@4.52.4': 1715 + optional: true 1716 + 1717 + '@rollup/rollup-win32-x64-msvc@4.52.4': 1730 1718 optional: true 1731 1719 1732 1720 '@shikijs/core@2.5.0': ··· 1915 1903 1916 1904 '@ungap/structured-clone@1.3.0': {} 1917 1905 1918 - '@vitejs/plugin-vue@5.2.4(vite@5.4.19)(vue@3.5.22)': 1906 + '@vitejs/plugin-vue@5.2.4(vite@5.4.20)(vue@3.5.22)': 1919 1907 dependencies: 1920 - vite: 5.4.19 1908 + vite: 5.4.20 1921 1909 vue: 3.5.22 1922 1910 1923 1911 '@vue/compiler-core@3.5.22': ··· 1957 1945 '@vue/devtools-kit@7.7.7': 1958 1946 dependencies: 1959 1947 '@vue/devtools-shared': 7.7.7 1960 - birpc: 2.5.0 1948 + birpc: 2.6.1 1961 1949 hookable: 5.5.3 1962 1950 mitt: 3.0.1 1963 1951 perfect-debounce: 1.0.0 ··· 1990 1978 '@vue/shared': 3.5.22 1991 1979 vue: 3.5.22 1992 1980 1993 - '@vue/shared@3.5.18': {} 1994 - 1995 1981 '@vue/shared@3.5.22': {} 1996 1982 1997 1983 '@vueuse/core@12.8.2': ··· 2023 2009 2024 2010 acorn@8.15.0: {} 2025 2011 2026 - algoliasearch@5.35.0: 2012 + algoliasearch@5.40.0: 2027 2013 dependencies: 2028 - '@algolia/abtesting': 1.1.0 2029 - '@algolia/client-abtesting': 5.35.0 2030 - '@algolia/client-analytics': 5.35.0 2031 - '@algolia/client-common': 5.35.0 2032 - '@algolia/client-insights': 5.35.0 2033 - '@algolia/client-personalization': 5.35.0 2034 - '@algolia/client-query-suggestions': 5.35.0 2035 - '@algolia/client-search': 5.35.0 2036 - '@algolia/ingestion': 1.35.0 2037 - '@algolia/monitoring': 1.35.0 2038 - '@algolia/recommend': 5.35.0 2039 - '@algolia/requester-browser-xhr': 5.35.0 2040 - '@algolia/requester-fetch': 5.35.0 2041 - '@algolia/requester-node-http': 5.35.0 2014 + '@algolia/abtesting': 1.6.0 2015 + '@algolia/client-abtesting': 5.40.0 2016 + '@algolia/client-analytics': 5.40.0 2017 + '@algolia/client-common': 5.40.0 2018 + '@algolia/client-insights': 5.40.0 2019 + '@algolia/client-personalization': 5.40.0 2020 + '@algolia/client-query-suggestions': 5.40.0 2021 + '@algolia/client-search': 5.40.0 2022 + '@algolia/ingestion': 1.40.0 2023 + '@algolia/monitoring': 1.40.0 2024 + '@algolia/recommend': 5.40.0 2025 + '@algolia/requester-browser-xhr': 5.40.0 2026 + '@algolia/requester-fetch': 5.40.0 2027 + '@algolia/requester-node-http': 5.40.0 2042 2028 2043 2029 argparse@2.0.1: {} 2044 2030 2045 - birpc@2.5.0: {} 2031 + birpc@2.6.1: {} 2046 2032 2047 2033 ccount@2.0.1: {} 2048 2034 ··· 2273 2259 lodash-es: 4.17.21 2274 2260 2275 2261 dayjs@1.11.18: {} 2276 - 2277 - debug@4.4.1: 2278 - dependencies: 2279 - ms: 2.1.3 2280 2262 2281 2263 debug@4.4.3: 2282 2264 dependencies: ··· 2377 2359 2378 2360 is-what@4.1.16: {} 2379 2361 2380 - katex@0.16.22: 2362 + katex@0.16.23: 2381 2363 dependencies: 2382 2364 commander: 8.3.0 2383 2365 ··· 2442 2424 punycode.js: 2.3.1 2443 2425 uc.micro: 2.1.0 2444 2426 2445 - marked@16.3.0: {} 2427 + marked@16.4.0: {} 2446 2428 2447 2429 mdast-util-to-hast@13.2.0: 2448 2430 dependencies: ··· 2462 2444 dependencies: 2463 2445 '@braintree/sanitize-url': 7.1.1 2464 2446 '@iconify/utils': 3.0.2 2465 - '@mermaid-js/parser': 0.6.2 2447 + '@mermaid-js/parser': 0.6.3 2466 2448 '@types/d3': 7.4.3 2467 2449 cytoscape: 3.33.1 2468 2450 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) ··· 2472 2454 dagre-d3-es: 7.0.11 2473 2455 dayjs: 1.11.18 2474 2456 dompurify: 3.2.7 2475 - katex: 0.16.22 2457 + katex: 0.16.23 2476 2458 khroma: 2.1.0 2477 2459 lodash-es: 4.17.21 2478 - marked: 16.3.0 2460 + marked: 16.4.0 2479 2461 roughjs: 4.6.6 2480 2462 stylis: 4.3.6 2481 2463 ts-dedent: 2.2.0 ··· 2500 2482 2501 2483 micromark-util-types@2.0.2: {} 2502 2484 2503 - minisearch@7.1.2: {} 2485 + minisearch@7.2.0: {} 2504 2486 2505 2487 mitt@3.0.1: {} 2506 2488 ··· 2524 2506 regex: 6.0.1 2525 2507 regex-recursion: 6.0.2 2526 2508 2527 - package-manager-detector@1.3.0: {} 2509 + package-manager-detector@1.4.0: {} 2528 2510 2529 2511 path-data-parser@0.1.0: {} 2530 2512 ··· 2559 2541 picocolors: 1.1.1 2560 2542 source-map-js: 1.2.1 2561 2543 2562 - preact@10.27.0: {} 2544 + preact@10.27.2: {} 2563 2545 2564 2546 property-information@7.1.0: {} 2565 2547 ··· 2581 2563 2582 2564 robust-predicates@3.0.2: {} 2583 2565 2584 - rollup@4.46.2: 2566 + rollup@4.52.4: 2585 2567 dependencies: 2586 2568 '@types/estree': 1.0.8 2587 2569 optionalDependencies: 2588 - '@rollup/rollup-android-arm-eabi': 4.46.2 2589 - '@rollup/rollup-android-arm64': 4.46.2 2590 - '@rollup/rollup-darwin-arm64': 4.46.2 2591 - '@rollup/rollup-darwin-x64': 4.46.2 2592 - '@rollup/rollup-freebsd-arm64': 4.46.2 2593 - '@rollup/rollup-freebsd-x64': 4.46.2 2594 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 2595 - '@rollup/rollup-linux-arm-musleabihf': 4.46.2 2596 - '@rollup/rollup-linux-arm64-gnu': 4.46.2 2597 - '@rollup/rollup-linux-arm64-musl': 4.46.2 2598 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 2599 - '@rollup/rollup-linux-ppc64-gnu': 4.46.2 2600 - '@rollup/rollup-linux-riscv64-gnu': 4.46.2 2601 - '@rollup/rollup-linux-riscv64-musl': 4.46.2 2602 - '@rollup/rollup-linux-s390x-gnu': 4.46.2 2603 - '@rollup/rollup-linux-x64-gnu': 4.46.2 2604 - '@rollup/rollup-linux-x64-musl': 4.46.2 2605 - '@rollup/rollup-win32-arm64-msvc': 4.46.2 2606 - '@rollup/rollup-win32-ia32-msvc': 4.46.2 2607 - '@rollup/rollup-win32-x64-msvc': 4.46.2 2570 + '@rollup/rollup-android-arm-eabi': 4.52.4 2571 + '@rollup/rollup-android-arm64': 4.52.4 2572 + '@rollup/rollup-darwin-arm64': 4.52.4 2573 + '@rollup/rollup-darwin-x64': 4.52.4 2574 + '@rollup/rollup-freebsd-arm64': 4.52.4 2575 + '@rollup/rollup-freebsd-x64': 4.52.4 2576 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 2577 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 2578 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 2579 + '@rollup/rollup-linux-arm64-musl': 4.52.4 2580 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 2581 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 2582 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 2583 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 2584 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 2585 + '@rollup/rollup-linux-x64-gnu': 4.52.4 2586 + '@rollup/rollup-linux-x64-musl': 4.52.4 2587 + '@rollup/rollup-openharmony-arm64': 4.52.4 2588 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 2589 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 2590 + '@rollup/rollup-win32-x64-gnu': 4.52.4 2591 + '@rollup/rollup-win32-x64-msvc': 4.52.4 2608 2592 fsevents: 2.3.3 2609 2593 2610 2594 roughjs@4.6.6: ··· 2695 2679 '@types/unist': 3.0.3 2696 2680 vfile-message: 4.0.3 2697 2681 2698 - vite@5.4.19: 2682 + vite@5.4.20: 2699 2683 dependencies: 2700 2684 esbuild: 0.21.5 2701 2685 postcss: 8.5.6 2702 - rollup: 4.46.2 2686 + rollup: 4.52.4 2703 2687 optionalDependencies: 2704 2688 fsevents: 2.3.3 2705 2689 ··· 2709 2693 transitivePeerDependencies: 2710 2694 - vue 2711 2695 2712 - vitepress-plugin-group-icons@1.6.3(markdown-it@14.1.0)(vite@5.4.19): 2696 + vitepress-plugin-group-icons@1.6.3(markdown-it@14.1.0)(vite@5.4.20): 2713 2697 dependencies: 2714 2698 '@iconify-json/logos': 1.2.9 2715 - '@iconify-json/vscode-icons': 1.2.29 2716 - '@iconify/utils': 3.0.1 2699 + '@iconify-json/vscode-icons': 1.2.31 2700 + '@iconify/utils': 3.0.2 2717 2701 markdown-it: 14.1.0 2718 - vite: 5.4.19 2702 + vite: 5.4.20 2719 2703 transitivePeerDependencies: 2720 2704 - supports-color 2721 2705 2722 - vitepress-plugin-mermaid@2.0.17(mermaid@11.12.0)(vitepress@1.6.4(@algolia/client-search@5.35.0)(postcss@8.5.6)(search-insights@2.17.3)): 2706 + vitepress-plugin-mermaid@2.0.17(mermaid@11.12.0)(vitepress@1.6.4(@algolia/client-search@5.40.0)(postcss@8.5.6)(search-insights@2.17.3)): 2723 2707 dependencies: 2724 2708 mermaid: 11.12.0 2725 - vitepress: 1.6.4(@algolia/client-search@5.35.0)(postcss@8.5.6)(search-insights@2.17.3) 2709 + vitepress: 1.6.4(@algolia/client-search@5.40.0)(postcss@8.5.6)(search-insights@2.17.3) 2726 2710 optionalDependencies: 2727 2711 '@mermaid-js/mermaid-mindmap': 9.3.0 2728 2712 2729 - vitepress@1.6.4(@algolia/client-search@5.35.0)(postcss@8.5.6)(search-insights@2.17.3): 2713 + vitepress@1.6.4(@algolia/client-search@5.40.0)(postcss@8.5.6)(search-insights@2.17.3): 2730 2714 dependencies: 2731 2715 '@docsearch/css': 3.8.2 2732 - '@docsearch/js': 3.8.2(@algolia/client-search@5.35.0)(search-insights@2.17.3) 2733 - '@iconify-json/simple-icons': 1.2.47 2716 + '@docsearch/js': 3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3) 2717 + '@iconify-json/simple-icons': 1.2.54 2734 2718 '@shikijs/core': 2.5.0 2735 2719 '@shikijs/transformers': 2.5.0 2736 2720 '@shikijs/types': 2.5.0 2737 2721 '@types/markdown-it': 14.1.2 2738 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.19)(vue@3.5.22) 2722 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.20)(vue@3.5.22) 2739 2723 '@vue/devtools-api': 7.7.7 2740 - '@vue/shared': 3.5.18 2724 + '@vue/shared': 3.5.22 2741 2725 '@vueuse/core': 12.8.2 2742 2726 '@vueuse/integrations': 12.8.2(focus-trap@7.6.5) 2743 2727 focus-trap: 7.6.5 2744 2728 mark.js: 8.11.1 2745 - minisearch: 7.1.2 2729 + minisearch: 7.2.0 2746 2730 shiki: 2.5.0 2747 - vite: 5.4.19 2731 + vite: 5.4.20 2748 2732 vue: 3.5.22 2749 2733 optionalDependencies: 2750 2734 postcss: 8.5.6
+3 -2
doc/snippets/getting-started/cache.nix
··· 1 1 { 2 2 nix.settings = { 3 3 substituters = [ 4 - "https://wires.cachix.org" 4 + "https://cache.nixos.org" 5 + "https://cache.althaea.zone" 5 6 # ... 6 7 ]; 7 8 trusted-public-keys = [ 8 - "wires.cachix.org-1:7XQoG91Bh+Aj01mAJi77Ui5AYyM1uEyV0h1wOomqjpk=" 9 + "cache.althaea.zone:BelRpa863X9q3Y+AOnl5SM7QFzre3qb+5I7g2s/mqHI=" 9 10 # ... 10 11 ]; 11 12 };
+3 -2
doc/snippets/getting-started/nix.conf
··· 1 - substituters = https://wires.cachix.org 2 - trusted-public-keys = wires.cachix.org-1:7XQoG91Bh+Aj01mAJi77Ui5AYyM1uEyV0h1wOomqjpk= 1 + # /etc/nix/nix.conf 2 + trusted-substituters = https://cache.nixos.org https://cache.althaea.zone 3 + trusted-public-keys = ... cache.althaea.zone:BelRpa863X9q3Y+AOnl5SM7QFzre3qb+5I7g2s/mqHI=
+2
doc/snippets/tutorial/extra-experimental-features.conf
··· 1 + # /etc/nix/nix.conf 2 + experimental-features = nix-command
+7
doc/snippets/tutorial/extra-experimental-features.nix
··· 1 + { 2 + nix.settings = { 3 + experimental-features = [ 4 + "nix-command" 5 + ]; 6 + }; 7 + }
+48
doc/tutorial/overview.md
··· 1 + --- 2 + comment: false 3 + title: Wire Tutorial Overview 4 + description: In this tutorial we will create and deploy a Wire Hive. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + Wire is a tool to deploy NixOS systems. Its usage is inspired by [colmena](https://colmena.cli.rs/). In many places it's configuration attempts to remain a superset[^1] of colmena, however it is **not** a fork. 10 + 11 + [^1]: A lot of your colmena module options will continue to work with wire, but wire has additional ergonomic changes you can take advantage of. 12 + 13 + ::: warning 14 + Wire is alpha software, please use at your own risk. Many features listed in this documentation overall may not be complete / implemented, however features covered in this this tutorial are considered complete. 15 + ::: 16 + 17 + --- 18 + 19 + In this tutorial we will create and deploy a Wire Hive. Along the way we will 20 + encounter [npins](https://github.com/andir/npins), simple NixOS 21 + configurations, virutal machines, and deployment keys. 22 + 23 + <div class="tip custom-block" style="padding-top: 8px"> 24 + 25 + Ready? Skip to [Nix Setup](./part-one/nix-setup). 26 + 27 + </div> 28 + 29 + ## Why Wire? 30 + 31 + | Features | Wire | Colmena | 32 + | ------------------------ | ------------------ | ------------------ | 33 + | Node Tagging | :white_check_mark: | :white_check_mark: | 34 + | Secret Management | :white_check_mark: | :white_check_mark: | 35 + | Parallel Evaluation | :white_check_mark: | :white_check_mark: | 36 + | Node Tagging | :white_check_mark: | :white_check_mark: | 37 + | Remote Builds | :white_check_mark: | :white_check_mark: | 38 + | Pipeline Support | :white_check_mark: | :x:[^2] | 39 + | Non-Root Deployments[^4] | :white_check_mark: | :x:[^3] | 40 + 41 + [^2]: You need to write custom nix code to use Colmena hive metadata inside environments like CI pipelines, bash scripting, etc., which requires a knowledge of its internals. Recently it agained the [eval feature](https://colmena.cli.rs/unstable/features/eval.html) which has improved the situation since wire was first started. 42 + 43 + [^3]: See https://github.com/zhaofengli/colmena/issues/120 44 + 45 + [^4]: 46 + You may deploy with _any_ user who can login through SSH, whether they be 47 + `wheel` or not. You may need to enter your password multiple times for the various elevated 48 + steps wire needs to perform.
+188
doc/tutorial/part-one/basic-hive.md
··· 1 + --- 2 + comment: true 3 + title: Basic Hive & Deployment 4 + description: Creating a basic hive and deploying changes to the virtual machine. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + {{ $frontmatter.description }} 10 + 11 + ## Editing `hive.nix` 12 + 13 + Open a text editor and edit `hive.nix`. You should copy this example, which imports 14 + the npins sources we added. It also calls `makeHive`, and gives Wire `nixpkgs` 15 + from npins as well. 16 + 17 + ```nix:line-numbers [hive.nix] 18 + let 19 + # import npins sources 20 + sources = import ./npins; 21 + # import `wire` from npins sources 22 + wire = import sources.wire; 23 + in 24 + wire.makeHive { 25 + # give Wire nixpkgs from npins 26 + meta.nixpkgs = import sources.nixpkgs { }; 27 + 28 + # we'll edit this part 29 + } 30 + ``` 31 + 32 + Lets check out what wire sees with `wire show`. 33 + 34 + ```sh 35 + [nix-shell]$ wire show 36 + WARN wire: use --json to output something scripting suitable 37 + Hive { 38 + nodes: {}, 39 + schema: 0, 40 + } 41 + ``` 42 + 43 + The line `nodes: {}` means theres no "nodes" in our hive. 44 + 45 + ## Adding The First Node 46 + 47 + Lets add the virtual machine as a node to the hive with the name 48 + `virtual-machine`. Additionally, we will add `deployment.target`, recalling we 49 + forwarded sshd `virtual-machine:22` to the port `localhost:2222`: 50 + 51 + ```nix:line-numbers [hive.nix] 52 + let 53 + sources = import ./npins; 54 + wire = import sources.wire; 55 + in 56 + wire.makeHive { 57 + meta.nixpkgs = import sources.nixpkgs { }; 58 + 59 + virtual-machine = { # [!code ++] 60 + deployment.target = { # [!code ++] 61 + port = 2222; # [!code ++] 62 + hosts = [ "localhost" ]; # [!code ++] 63 + }; # [!code ++] 64 + 65 + nixpkgs.hostPlatform = "x86_64-linux"; # [!code ++] 66 + }; # [!code ++] 67 + } 68 + ``` 69 + 70 + ## A naive `wire apply` 71 + 72 + If we tried to run `wire apply` on our hive at this stage, it likely won't work. 73 + If you've used NixOS before, you'll notice that many important options are 74 + missing. But let's try anyway: 75 + 76 + ```sh 77 + [nix-shell]$ wire apply 78 + ERROR apply{goal=Switch on=}:goal{node=virtual-machine}: lib::hive::node: Failed to execute `Evaluate the node` 79 + Error: × 1 node(s) failed to apply. 80 + 81 + Error: 82 + × node virtual-machine failed to apply 83 + ├─▶ wire::Evaluate 84 + 85 + │ × failed to evaluate `--file /home/marsh/scratch/wire-tutorial/hive.nix topLevels.virtual-machine` from the context 86 + │ │ of a hive. 87 + 88 + ╰─▶ nix --extra-experimental-features nix-command --extra-experimental-features flakes eval --json --file /home/marsh/scratch/ 89 + wire-tutorial/hive.nix topLevels.virtual-machine --log-format internal-json failed (reason: known-status) with code 1 (last 20 90 + lines): 91 + error: 92 + … while evaluating '(evaluateNode node).config.system.build.toplevel' to select 'drvPath' on it 93 + at /nix/store/5pfz0v479gnciac17rcqi2gwyz8pl4s0-source/runtime/evaluate.nix:65:23: 94 + 64| 95 + 65| getTopLevel = node: (evaluateNode node).config.system.build.toplevel.drvPath; 96 + | ^ 97 + 66| in 98 + 99 + … while calling the 'head' builtin 100 + at /nix/store/n3d1ricw0cb5jd8vvfym6ig0mw7x7sv9-source/lib/attrsets.nix:1701:13: 101 + 1700| if length values == 1 || pred here (elemAt values 1) (head values) then 102 + 1701| head values 103 + | ^ 104 + 1702| else 105 + 106 + (stack trace truncated; use '--show-trace' to show the full trace) 107 + 108 + error: 109 + Failed assertions: 110 + - The ‘fileSystems’ option does not specify your root file system. 111 + - You must set the option ‘boot.loader.grub.devices’ or 'boot.loader.grub.mirroredBoots' to make the system bootable. 112 + trace: evaluation warning: system.stateVersion is not set, defaulting to 25.11. Read why this matters on https://nixos.org/ 113 + manual/nixos/stable/options.html#opt-system.stateVersion. 114 + 115 + ``` 116 + 117 + The command complained about not defining any fileSystems or a boot loader. 118 + The `${sources.nixpkgs}/nixos/modules/virtualisation/qemu-vm.nix` imported in 119 + `vm.nix` does 120 + extra work to make our virtual machine work, which we are currently missing. 121 + 122 + ## Importing `vm.nix` 123 + 124 + Lets import our `vm.nix` to this hive to fix our evaluation errors. 125 + Additionally, add a new package such as `vim` to our configuration: 126 + 127 + ```nix:line-numbers [hive.nix] 128 + let 129 + sources = import ./npins; 130 + wire = import sources.wire; 131 + in 132 + wire.makeHive { 133 + meta.nixpkgs = import sources.nixpkgs { }; 134 + 135 + virtual-machine = { 136 + deployment.target = { 137 + port = 2222; 138 + hosts = [ "localhost" ]; 139 + }; 140 + 141 + imports = [ # [!code ++] 142 + ./vm.nix # [!code ++] 143 + ]; # [!code ++] 144 + 145 + environment.systemPackages = [ pkgs.vim ]; # [!code ++] 146 + 147 + nixpkgs.hostPlatform = "x86_64-linux"; 148 + }; 149 + } 150 + ``` 151 + 152 + ## Our first deploy 153 + 154 + Trying our basic `wire apply` again with these changes: 155 + 156 + ```sh 157 + [nix-shell]$ wire apply 158 + ... 159 + INFO lib::nix_log: stopping the following units: boot.mount 160 + INFO lib::nix_log: NOT restarting the following changed units: systemd-fsck@dev-disk-by\x2dlabel-ESP.service 161 + INFO lib::nix_log: activating the configuration... 162 + INFO lib::nix_log: setting up /etc... 163 + INFO lib::nix_log: restarting systemd... 164 + INFO lib::nix_log: reloading user units for root... 165 + INFO lib::nix_log: restarting sysinit-reactivation.target 166 + INFO lib::nix_log: reloading the following units: dbus.service 167 + INFO lib::nix_log: the following new units were started: boot.automount, sysinit-reactivation.target, systemd-tmpfiles-resetup.service 168 + INFO apply{goal=Switch on=}:goal{node=virtual-machines}: lib::hive::node: Executing step `Upload key @ PostActivation` 169 + INFO apply{goal=Switch on=}: wire::apply: Successfully applied goal to 1 node(s): [Name("virtual-machines")] 170 + ``` 171 + 172 + Now, lets confirm these changes were applied to the virtual machine by executing 173 + `vim` in the virtual machine window: 174 + 175 + ```sh [Virtual Machine] 176 + [root@wire-tutorial:~]# vim --version 177 + VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Jan 01 1980 00:00:00) 178 + ``` 179 + 180 + Nice! You successfully deployed a new NixOS configuration to a **remote host**! 181 + 182 + ::: info 183 + This followed common steps of adding the node's `deployment.target` details and 184 + importing it's pre-existing NixOS configuration (in this case, `vm.nix`), a 185 + pattern you'll be using a lot if you chose to adopt wire. 186 + ::: 187 + 188 + In the next section, we'll cover how to deploy secrets / keys to our remote node.
+44
doc/tutorial/part-one/nix-setup.md
··· 1 + --- 2 + comment: true 3 + title: Nix Setup 4 + description: Installing npins, nix, and enabling the binary cache. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + {{ $frontmatter.description }} 10 + 11 + ::: warning 12 + This page is for the purposes for the **Tutorial**. 13 + You should read [Guides - Installation](/guides/installation.html) for installing Wire for 14 + regular use. 15 + ::: 16 + 17 + ## Nix Installation 18 + 19 + You should install nix if you do not have it on your system already. 20 + There are detailed steps to installing Nix on [nix.dev](https://nix.dev/install-nix). 21 + 22 + By the end of the installation, you should see something like this: 23 + 24 + ```sh 25 + $ nix --version 26 + nix (Nix) 2.11.0 27 + ``` 28 + 29 + ## Using `cache.althaea.zone` 30 + 31 + Because Wire can be heavy to compile, it is distributed with a [binary 32 + cache](https://wiki.nixos.org/wiki/Binary_Cache). It's URL is 33 + `https://cache.althaea.zone` and it's public key is 34 + `cache.althaea.zone:BelRpa863X9q3Y+AOnl5SM7QFzre3qb+5I7g2s/mqHI=`. 35 + 36 + You should trust the substituter `https://wires.cachix.org` by 37 + either editing `/etc/nix/nix.conf` or updating your NixOS configuration: 38 + 39 + ::: code-group 40 + 41 + <<< @/snippets/getting-started/nix.conf 42 + <<< @/snippets/getting-started/cache.nix [configuration.nix] 43 + 44 + :::
+110
doc/tutorial/part-one/repo-setup.md
··· 1 + --- 2 + comment: true 3 + title: Preparing Repo & Shell 4 + description: Adding npins sources and a nix development shell. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + {{ $frontmatter.description }} 10 + 11 + ## Initialising with Git & `npins` 12 + 13 + First, lets create an adhoc shell to bring these two tools into our $PATH. 14 + 15 + ```sh 16 + $ nix-shell -p git npins 17 + [nix-shell]$ git --version 18 + git version 2.51.0 19 + [nix-shell]$ npins --version 20 + npins 0.3.1 21 + ``` 22 + 23 + Great! Now lets use Git & `npins` to create a new Git repo and initialise it. 24 + `npins init` may take a while to download `nixpkgs`. 25 + 26 + ```sh 27 + [nix-shell]$ git init wire-tutorial 28 + Initialized empty Git repository in /home/.../wire-tutorial/.git/ 29 + [nix-shell]$ cd wire-tutorial/ 30 + [nix-shell]$ npins init 31 + [INFO ] Welcome to npins! 32 + [INFO ] Creating `npins` directory 33 + [INFO ] Writing default.nix 34 + [INFO ] Writing initial lock file with nixpkgs entry (need to fetch latest commit first) 35 + [INFO ] Successfully written initial files to 'npins/sources.json'. 36 + ``` 37 + 38 + This has created a pinned version of `nixpkgs` for us to use in our Wire hive. 39 + 40 + ## Adding wire as a dependency 41 + 42 + We can now need to tell `npins` to use `wires-org/wire` as a dependency. 43 + 44 + ```sh 45 + [nix-shell]$ npins add github wires-org wire 46 + [INFO ] Adding 'wire' … 47 + repository: https://github.com/wires-org/wire.git 48 + pre_releases: false 49 + submodules: false 50 + version: v0.4.0 51 + revision: f33d80c15b17c85d557d533441609a59a2210941 52 + hash: 0wgah341hvjpvppkgwjrj50rvzf56ccmjz720xsl3mw38h9nn6sr 53 + frozen: false 54 + ``` 55 + 56 + Great, now lets confirm the two dependencies we have added to this `npins` 57 + project: 58 + 59 + ```sh 60 + [nix-shell]$ npins show 61 + nixpkgs: (Nix channel) 62 + name: nixpkgs-unstable 63 + url: https://releases.nixos.org/nixpkgs/nixpkgs-25.11pre861972.88cef159e47c/nixexprs.tar.xz 64 + hash: 0zscvr0qa3capyzhmp798hgncz2qy8ggm843y10wk35jk7p0174f 65 + frozen: false 66 + 67 + wire: (git release tag) 68 + repository: https://github.com/wires-org/wire.git 69 + pre_releases: false 70 + submodules: false 71 + version: v0.4.0 72 + revision: f33d80c15b17c85d557d533441609a59a2210941 73 + hash: 0wgah341hvjpvppkgwjrj50rvzf56ccmjz720xsl3mw38h9nn6sr 74 + frozen: false 75 + ``` 76 + 77 + ## Creating a `shell.nix` 78 + 79 + Open a text editor to edit `shell.nix` in the `wire-tutorial` directory. 80 + 81 + ```nix:line-numbers [shell.nix] 82 + let 83 + sources = import ./npins; 84 + pkgs = import sources.nixpkgs { }; 85 + wire = import sources.wire; 86 + in 87 + pkgs.mkShell { 88 + packages = [ 89 + wire.packages.x86_64-linux.wire-small 90 + pkgs.npins 91 + pkgs.git 92 + ]; 93 + 94 + NIX_PATH = "nixpkgs=${sources.nixpkgs.outPath}"; 95 + } 96 + ``` 97 + 98 + You should now `exit` to quit the old shell, and 99 + enter a new shell with `nix-shell`. Since we added wire as a package, our new 100 + shell should have wire in the $PATH: 101 + 102 + ```sh 103 + [nix-shell]$ exit 104 + exit 105 + $ nix-shell 106 + [nix-shell]$ wire --version 107 + wire 0.5.0 108 + Debug: Hive::SCHEMA_VERSION 0 109 + 110 + ```
+132
doc/tutorial/part-one/vm-setup.md
··· 1 + --- 2 + comment: true 3 + title: Creating a Virtual Machine 4 + description: Creating a NixOS virtual machine to use as a deployment target. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + {{ $frontmatter.description }} 10 + 11 + ## Creating a `vm.nix` 12 + 13 + Open a text editor and edit `vm.nix`. Place in it this basic NixOS 14 + virtual machine configuration, which enables openssh and forwards it's 22 port: 15 + 16 + ```nix:line-numbers [vm.nix] 17 + let 18 + sources = import ./npins; 19 + in 20 + { 21 + imports = [ "${sources.nixpkgs}/nixos/modules/virtualisation/qemu-vm.nix" ]; 22 + 23 + networking.hostName = "wire-tutorial"; 24 + 25 + boot = { 26 + loader = { 27 + systemd-boot.enable = true; 28 + efi.canTouchEfiVariables = true; 29 + }; 30 + 31 + kernelParams = [ "console=ttyS0" ]; 32 + }; 33 + 34 + # enable openssh 35 + services = { 36 + openssh = { 37 + enable = true; 38 + settings.PermitRootLogin = "yes"; 39 + }; 40 + 41 + getty.autologinUser = "root"; 42 + }; 43 + 44 + virtualisation = { 45 + graphics = false; 46 + useBootLoader = true; 47 + 48 + # forward `openssh` port 22 to localhost:2222. 49 + forwardPorts = [ 50 + { 51 + from = "host"; 52 + host.port = 2222; 53 + guest.port = 22; 54 + } 55 + ]; 56 + }; 57 + 58 + users.users.root.initialPassword = "root"; 59 + 60 + system.stateVersion = "23.11"; 61 + } 62 + ``` 63 + 64 + If you like, you may take a moment to understand each line of this 65 + configuration. 66 + 67 + ## Building & Running the virtual machine 68 + 69 + Open a seperate Terminal tab/window/instance, ensuring you enter the development 70 + shell with `nix-shell`. 71 + Then, build the virtual machine with a bootloader, 72 + taking our `vm.nix` as the nixos configuration. 73 + 74 + ```sh 75 + $ nix-shell 76 + [nix-shell]$ nix-build '<nixpkgs/nixos>' -A vmWithBootLoader -I nixos-config=./vm.nix 77 + ``` 78 + 79 + Building the virtual machine can take some time, but once it completes, start it 80 + by running: 81 + 82 + ```sh 83 + [nix-shell]$ ./result/bin/run-wire-tutorial-vm 84 + ``` 85 + 86 + You will see boot-up logs fly across the screen and eventually you will be placed 87 + into shell inside the virtual machine. 88 + 89 + ```sh [Virtual Machine] 90 + running activation script... 91 + setting up /etc... 92 + 93 + Welcome to NixOS 25.11 (Xantusia)! 94 + 95 + [ OK ] Created slice Slice /system/getty. 96 + [ OK ] Created slice Slice /system/modprobe. 97 + ... 98 + <<< Welcome to NixOS 25.11pre861972.88cef159e47c (x86_64) - hvc0 >>> 99 + 100 + Run 'nixos-help' for the NixOS manual. 101 + 102 + wire-tutorial login: root (automatic login) 103 + 104 + [root@wire-tutorial:~]# 105 + 106 + ``` 107 + 108 + ::: details 109 + Further details on how the above commands work can be found at 110 + [nix.dev](https://nix.dev/tutorials/nixos/nixos-configuration-on-vm.html#creating-a-qemu-based-virtual-machine-from-a-nixos-configuration) 111 + ::: 112 + 113 + ## Summary 114 + 115 + Congratulations, you created a virtual machine in your terminal. 116 + We'll be deploying to this virtual machine, so keep the 117 + terminal instance open. 118 + 119 + ::: info 120 + From now on, commands ran inside the virtual machine will be lead with the 121 + following prompt: 122 + 123 + ```sh [Virtual Machine] 124 + [root@wire-tutorial:~]# 125 + 126 + ``` 127 + 128 + ::: 129 + 130 + ::: tip 131 + If you ever want to quit the virtual machine, run the command `poweroff`. 132 + :::
+142
doc/tutorial/part-two/basic-keys.md
··· 1 + --- 2 + comment: true 3 + title: Deployment Keys Basics 4 + description: Deploy some basic secrets with Wire tool. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + {{ $frontmatter.description }} 10 + 11 + ## Creating a `secrets.nix` 12 + 13 + Lets create a NixOS module that will contain our secret keys, and import it: 14 + 15 + ```nix:line-numbers [hive.nix] 16 + let 17 + sources = import ./npins; 18 + wire = import sources.wire; 19 + in 20 + wire.makeHive { 21 + meta.nixpkgs = import sources.nixpkgs { }; 22 + 23 + virtual-machine = { 24 + deployment.target = { 25 + port = 2222; 26 + hosts = [ "localhost" ]; 27 + }; 28 + 29 + imports = [ 30 + ./vm.nix 31 + ./secrets.nix # [!code ++] 32 + ]; 33 + 34 + environment.systemPackages = [ pkgs.vim ]; 35 + 36 + nixpkgs.hostPlatform = "x86_64-linux"; 37 + }; 38 + } 39 + ``` 40 + 41 + ```nix:line-numbers [secrets.nix] 42 + { 43 + deployment.keys = { 44 + # the key's unique name is `"basic.txt"`. 45 + "basic.txt" = { 46 + # In this key's case, the source is a literal string: 47 + source = '' 48 + Hello World 49 + ''; 50 + }; 51 + }; 52 + } 53 + ``` 54 + 55 + ::: details 56 + Further details on the `deployment.keys` options can be found 57 + [in the reference](/reference/module.html#deployment-keys) 58 + ::: 59 + 60 + Once we deploy this new configuration to the virtul machine, 61 + `/run/keys/basic.txt` will be created with the contents of the key. 62 + 63 + ```sh 64 + [nix-shell]$ wire apply keys 65 + WARN lib::nix_log: Store URL: ssh://root@localhost 66 + (root@localhost) Password: 67 + 68 + ``` 69 + 70 + ```sh [Virtual Machine] 71 + [root@wire-tutorial:~]# cat /run/keys/basic.txt 72 + Hello World 73 + 74 + ``` 75 + 76 + You successfully deployed your first, albeit not-so-secret, secret key! Let's 77 + move on from literal-text keys and use something a bit more powerful. 78 + 79 + ## File-sourced keys <Badge type="info">Optional</Badge> 80 + 81 + This section is optional to try, but you can also pass `deployment.keys.<name>.source` 82 + a file path. It's contents is read and treated as literal text. 83 + 84 + ```sh 85 + $ echo hello world > very-important-secret.txt 86 + ``` 87 + 88 + ```nix:line-numbers [secrets.nix] 89 + { 90 + deployment.keys = { 91 + # ... 92 + 93 + "very-important-secret.txt" = { # [!code ++] 94 + source = ./very-important-secret.txt; # [!code ++] 95 + }; # [!code ++] 96 + }; 97 + } 98 + ``` 99 + 100 + ```sh [Virtual Machine] 101 + [root@wire-tutorial:~]# cat /run/keys/very-important-secret.txt 102 + hello world 103 + 104 + ``` 105 + 106 + ## Command-sourced keys 107 + 108 + Command-sourced keys are where the real power of wire keys lie. By passing a 109 + list of strings, wire will execute them as a command and create a key out of it's `stdout`. 110 + 111 + Because the command's output is never written to the nix store, these can be 112 + considered real secrets. 113 + 114 + To create a basic example, update your `secrets.nix` to include a secret that 115 + echos "hello world": 116 + 117 + ```nix:line-numbers [secrets.nix] 118 + { 119 + deployment.keys = { 120 + # ... 121 + 122 + "command.txt" = { # [!code ++] 123 + source = [ # [!code ++] 124 + "echo" # [!code ++] 125 + "hello world" # [!code ++] 126 + ]; # [!code ++] 127 + }; # [!code ++] 128 + }; 129 + } 130 + ``` 131 + 132 + After a quick `wire deploy secrets`, the `/run/keys/command.txt` file is 133 + created: 134 + 135 + ```sh [Virtual Machine] 136 + [root@wire-tutorial:~]# cat /run/keys/command.txt 137 + hello world 138 + 139 + ``` 140 + 141 + Hopefully you can see the potential of command-sourced keys, as these are the 142 + basic building block of how we achieve encrypted secrets with wire.
+105
doc/tutorial/part-two/encryption.md
··· 1 + --- 2 + comment: true 3 + title: Deployment Keys Basics 4 + description: Deploy a age-encrypted secret with Wire tool. 5 + --- 6 + 7 + # {{ $frontmatter.title }} 8 + 9 + {{ $frontmatter.description }} 10 + 11 + ::: tip 12 + For this tutorial we will be using [`age`](https://github.com/FiloSottile/age), 13 + but other encryption cli tools work just as well such as GnuPG. 14 + ::: 15 + 16 + ## Installing age 17 + 18 + Alter your shell.nix to include age: 19 + 20 + ```nix:line-numbers [shell.nix] 21 + let 22 + sources = import ./npins; 23 + pkgs = import sources.nixpkgs { }; 24 + wire = import sources.wire; 25 + in 26 + pkgs.mkShell { 27 + packages = [ 28 + wire.packages.x86_64-linux.wire-small 29 + pkgs.npins 30 + pkgs.git 31 + pkgs.age # [!code ++] 32 + ]; 33 + 34 + NIX_PATH = "nixpkgs=${sources.nixpkgs.outPath}"; 35 + } 36 + ``` 37 + 38 + Quit and re-open your shell, and confirm age is now available: 39 + 40 + ```sh 41 + [nix-shell]$ exit 42 + exit 43 + $ nix-shell 44 + [nix-shell]$ age --version 45 + 1.2.1 46 + 47 + ``` 48 + 49 + ## Encrypting a secret 50 + 51 + First create an age private key: 52 + 53 + ```sh 54 + [nix-shell]$ age-keygen -o key.txt 55 + Public key: age1j08s3kmr8zw4w8k99vs4nut5mg03dm8nfuaajuekdyzlujxply5qwsv4g0 56 + 57 + ``` 58 + 59 + ::: details 60 + Further details on how age works can be found on in the 61 + [age manual](https://man.archlinux.org/man/age.1.en.txt). 62 + ::: 63 + 64 + Now, lets encrypt the words `"!! encrypted string !!"` with age and save it to the 65 + file `top-secret.age`. 66 + 67 + We will use a pipeline to echo the encrypted string into 68 + age, and use `age-keygent -y` to give age the public key we generated, then we 69 + use the redirection operator to save the encrypted data to `top-secret.age`. 70 + 71 + ```sh 72 + [nix-shell]$ echo "!! encrypted string !!" | age --encrypt --recipient $(age-keygen -y key.txt) > top-secret.age 73 + ``` 74 + 75 + ## Adding an age-encrypted key 76 + 77 + Now, lets combine our previous command-sourced key with `age`. Pass the 78 + arguments `age --decrypt --identity key.txt ./age-secret.age` to wire: 79 + 80 + ```nix:line-numbers [secrets.nix] 81 + { 82 + deployment.keys = { 83 + # ... 84 + 85 + "age-secret" = { # [!code ++] 86 + source = [ # [!code ++] 87 + "age" # [!code ++] 88 + "--decrypt" # [!code ++] 89 + "--identity" # [!code ++] 90 + "key.txt" # [!code ++] 91 + "${./age-secret.age}" # [!code ++] 92 + ]; # [!code ++] 93 + }; # [!code ++] 94 + }; 95 + } 96 + ``` 97 + 98 + One `wire apply keys` later, and you have successfully deployed an encrypted 99 + key: 100 + 101 + ```sh [Virtual Machine] 102 + [root@wire-tutorial:~]# cat /run/keys/age-secret 103 + !! encrypted string !! 104 + 105 + ```