diff --git a/devShell.nix b/devShell.nix index dd81b8282..4ee3c31fd 100644 --- a/devShell.nix +++ b/devShell.nix @@ -1,4 +1,4 @@ -{ ... }: +{ inputs, ... }: { perSystem = { @@ -39,6 +39,10 @@ shellHook = '' echo -e "${ansiEscapes.green}switch to another dev-shell using: select-shell${ansiEscapes.reset}" export PRJ_ROOT=$(git rev-parse --show-toplevel) + + # vendoring / needed for impure tests + ln -sfT ${self'.packages.clan-cli.nixpkgs} "$PRJ_ROOT/pkgs/clan-cli/clan_cli/nixpkgs" + ln -sfT ${inputs.nix-select} "$PRJ_ROOT/pkgs/clan-cli/clan_cli/select" ''; }; }; diff --git a/docs/nix/default.nix b/docs/nix/default.nix index 11701968d..ca15e5302 100644 --- a/docs/nix/default.nix +++ b/docs/nix/default.nix @@ -45,7 +45,7 @@ pkgs.stdenv.mkDerivation { ln -snf ${fira-code}/share/fonts/truetype/FiraCode-VF.ttf ./site/static/ # Copy icons into place - cp -af ../pkgs/webview-ui/app/icons ./site/static/ + cp -af ../pkgs/ui/webview-ui/app/icons ./site/static/ ''; buildPhase = '' diff --git a/formatter.nix b/formatter.nix index 23e78f9e7..60caffe0c 100644 --- a/formatter.nix +++ b/formatter.nix @@ -100,9 +100,9 @@ extraPythonPackages = (self'.packages.clan-cli.devshellPyDeps pkgs.python3Packages); }; "clan-app" = { - directory = "pkgs/clan-app"; + directory = "pkgs/ui/clan-app"; extraPythonPackages = (self'.packages.clan-app.devshellPyDeps pkgs.python3Packages); - extraPythonPaths = [ "../clan-cli" ]; + extraPythonPaths = [ "../../clan-cli" ]; }; } // ( diff --git a/pkgs/clan-cli/flake-module.nix b/pkgs/clan-cli/flake-module.nix index dd77bf5d6..83fb44fb5 100644 --- a/pkgs/clan-cli/flake-module.nix +++ b/pkgs/clan-cli/flake-module.nix @@ -35,9 +35,8 @@ in { devShells.clan-cli = pkgs.callPackage ./shell.nix { - inherit (self'.packages) clan-cli; inherit self'; - inherit (inputs) nix-select; + inherit (self'.packages) clan-cli; }; packages = { clan-cli = pkgs.callPackage ./default.nix { diff --git a/pkgs/clan-cli/shell.nix b/pkgs/clan-cli/shell.nix index 1f75d9804..f5a76fdcd 100644 --- a/pkgs/clan-cli/shell.nix +++ b/pkgs/clan-cli/shell.nix @@ -1,7 +1,6 @@ { lib, nix-unit, - nix-select, clan-cli, mkShell, ruff, @@ -42,10 +41,6 @@ mkShell { # Add clan command to PATH export PATH="$PKG_ROOT/bin":"$PATH" - # Needed for impure tests - ln -sfT ${clan-cli.nixpkgs} "$PKG_ROOT/clan_cli/nixpkgs" - ln -sfT ${nix-select} "$PKG_ROOT/clan_cli/select" - # Generate classes.py from inventory schema # This file is in .gitignore ${self'.packages.classgen}/bin/classgen ${self'.legacyPackages.schemas.inventory-schema-abstract}/schema.json $PKG_ROOT/clan_lib/nix_models/inventory.py diff --git a/pkgs/flake-module.nix b/pkgs/flake-module.nix index 5551974a2..6895dfeb5 100644 --- a/pkgs/flake-module.nix +++ b/pkgs/flake-module.nix @@ -3,14 +3,13 @@ { imports = [ ./clan-cli/flake-module.nix - ./clan-app/flake-module.nix ./clan-vm-manager/flake-module.nix ./installer/flake-module.nix - ./webview-ui/flake-module.nix ./distro-packages/flake-module.nix ./icon-update/flake-module.nix ./generate-test-vars/flake-module.nix ./clan-core-flake/flake-module.nix + ./ui/flake-module.nix ]; flake.packages.x86_64-linux = @@ -35,7 +34,6 @@ editor = pkgs.callPackage ./editor/clan-edit-codium.nix { }; classgen = pkgs.callPackage ./classgen { }; zerotierone = pkgs.callPackage ./zerotierone { }; - webview-lib = pkgs.callPackage ./webview-lib { }; update-clan-core-for-checks = pkgs.callPackage ./update-clan-core-for-checks { }; }; }; diff --git a/pkgs/icon-update/default.nix b/pkgs/icon-update/default.nix index 367f5464f..90df7cd64 100644 --- a/pkgs/icon-update/default.nix +++ b/pkgs/icon-update/default.nix @@ -13,7 +13,7 @@ pkgs.writeShellApplication { text = '' REPO_ROOT="$(git rev-parse --show-toplevel)" - OUT_DIR="$(realpath "$REPO_ROOT"/pkgs/webview-ui/app/icons)" + OUT_DIR="$(realpath "$REPO_ROOT"/pkgs/ui/webview-ui/app/icons)" export OUT_DIR deno run --allow-all ${src}/main.ts ''; diff --git a/pkgs/ui/.envrc b/pkgs/ui/.envrc new file mode 100644 index 000000000..306104f69 --- /dev/null +++ b/pkgs/ui/.envrc @@ -0,0 +1,7 @@ +# shellcheck shell=bash +source_up + +watch_file flake-module.nix shell.nix clan-app/flake-module.nix webview-ui/flake-module.nix + +# Because we depend on nixpkgs sources, uploading to builders takes a long time +use flake .#ui --builders '' diff --git a/pkgs/ui/README.md b/pkgs/ui/README.md new file mode 100644 index 000000000..4d7180840 --- /dev/null +++ b/pkgs/ui/README.md @@ -0,0 +1,48 @@ +# Clan UI + +## Getting started + +Enter the `pkgs/ui` directory and allow [direnv] to load the `ui` devshell with `direnv allow`: + +```console +❯ direnv allow +direnv: loading ~/Development/lol/clan/git/clan/clan-core/pkgs/ui/.envrc +direnv: loading ~/Development/lol/clan/git/clan/clan-core/.envrc +direnv: using flake +direnv: nix-direnv: Renewed cache +switch to another dev-shell using: select-shell +direnv: using flake .#ui --builders +path '/home/brian/Development/lol/clan/git/clan/clan-core/pkgs/ui' does not contain a 'flake.nix', searching up +direnv: ([/nix/store/rjnigckx9rmga58562hxw9kr5hynavcd-direnv-2.36.0/bin/direnv export zsh]) is taking a while to execute. Use CTRL-C to give up. +path '/home/brian/Development/lol/clan/git/clan/clan-core/pkgs/ui' does not contain a 'flake.nix', searching up +direnv: nix-direnv: Renewed cache +switch to another dev-shell using: select-shell +/home/brian/.config/direnv/lib/hm-nix-direnv.sh:3858: /home/brian/Development/lol/clan/git/clan/clan-core/pkgs/ui/clan-app/.local.env: No such file or directory +direnv: export +AR +AS +CC +CLAN_CORE_PATH +CONFIG_SHELL +CXX +DETERMINISTIC_BUILD +GETTEXTDATADIRS +GETTEXTDATADIRS_FOR_BUILD +GETTEXTDATADIRS_FOR_TARGET +GIT_ROOT +GSETTINGS_SCHEMAS_PATH +HOST_PATH +IN_NIX_SHELL +LD +NIX_BINTOOLS +NIX_BINTOOLS_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu +NIX_BUILD_CORES +NIX_CC +NIX_CC_WRAPPER_TARGET_HOST_x86_64_unknown_linux_gnu +NIX_CFLAGS_COMPILE +NIX_ENFORCE_NO_NATIVE +NIX_HARDENING_ENABLE +NIX_LDFLAGS +NIX_STORE +NM +NODE_PATH +OBJCOPY +OBJDUMP +PC_CONFIG_FILES +PKG_ROOT_CLAN_APP +PKG_ROOT_UI +PKG_ROOT_WEBVIEW_UI +PRJ_ROOT +PYTHONHASHSEED +PYTHONNOUSERSITE +PYTHONPATH +RANLIB +READELF +SIZE +SOURCE_DATE_EPOCH +STRINGS +STRIP +WEBVIEW_LIB_DIR +_PYTHON_HOST_PLATFORM +_PYTHON_SYSCONFIGDATA_NAME +__structuredAttrs +buildInputs +buildPhase +builder +cmakeFlags +configureFlags +depsBuildBuild +depsBuildBuildPropagated +depsBuildTarget +depsBuildTargetPropagated +depsHostHost +depsHostHostPropagated +depsTargetTarget +depsTargetTargetPropagated +doCheck +doInstallCheck +dontAddDisableDepTrack +mesonFlags +name +nativeBuildInputs +out +outputs +patches +phases +preferLocalBuild +propagatedBuildInputs +propagatedNativeBuildInputs +shell +shellHook +stdenv +strictDeps +system ~GDK_PIXBUF_MODULE_FILE ~GI_TYPELIB_PATH ~PATH ~XDG_DATA_DIRS +``` + +Once that has loaded, you can run the local dev environment by running `process-compose`. + +This will start a [process-compose] instance containing two processes: + +* `webview-ui` which is a background process running a [vite] server for `./webview-ui` in a hot-reload fashion +* `clan-app` which is a [foreground process](https://f1bonacc1.github.io/process-compose/launcher/?h=foreground#foreground-processes), +that is started on demand and provides the [webview] wrapper for the UI. + +Wait for the `webview-ui` process to enter the `Running` state, then navigate to the `clan-app` process and press `F7`. +This will start the [webview] window and bring `clan-app`'s terminal into the foreground, allowing for interaction with +the debugger if required. + +If you need to restart, simply enter `ctrl+c` and you will be dropped back into the `process-compose` terminal. +From there you can start `clan-app` again with `F7`. + +> **Note** +> If you are interacting with a breakpoint, do not continue/exit with `ctrl+c` as this will introduce a quirk +> the next time you start `clan-app` where you will be unable to see the input you are typing in a debugging session. +> +> Instead, exit the debugger with `q+Enter`. + +[direnv]: https://direnv.net/ +[process-compose]: https://f1bonacc1.github.io/process-compose/ +[vite]: https://vite.dev/ +[webview]: https://github.com/webview/webview \ No newline at end of file diff --git a/pkgs/clan-app/.envrc b/pkgs/ui/clan-app/.envrc similarity index 100% rename from pkgs/clan-app/.envrc rename to pkgs/ui/clan-app/.envrc diff --git a/pkgs/clan-app/.gitignore b/pkgs/ui/clan-app/.gitignore similarity index 100% rename from pkgs/clan-app/.gitignore rename to pkgs/ui/clan-app/.gitignore diff --git a/pkgs/clan-app/README.md b/pkgs/ui/clan-app/README.md similarity index 96% rename from pkgs/clan-app/README.md rename to pkgs/ui/clan-app/README.md index fce6dd869..a0150358e 100644 --- a/pkgs/clan-app/README.md +++ b/pkgs/ui/clan-app/README.md @@ -9,7 +9,7 @@ Follow the instructions below to set up your development environment and start t 1. **Navigate to the Webview UI Directory** - Go to the `clan-core/pkgs/webview-ui/app` directory and start the web server by executing: + Go to the `clan-core/pkgs/ui/webview-ui/app` directory and start the web server by executing: ```bash npm install @@ -26,7 +26,6 @@ Follow the instructions below to set up your development environment and start t This will start the application in debug mode and link it to the web server running at `http://localhost:3000`. - ### Debugging Style and Layout ```bash @@ -86,4 +85,4 @@ Here are some important documentation links related to the Clan App: > Error dialogs should be avoided where possible, since they are disruptive. > -> For simple non-critical errors, toasts can be a good alternative. +> For simple non-critical errors, toasts can be a good alternative. \ No newline at end of file diff --git a/pkgs/clan-app/bin/clan-app b/pkgs/ui/clan-app/bin/clan-app similarity index 100% rename from pkgs/clan-app/bin/clan-app rename to pkgs/ui/clan-app/bin/clan-app diff --git a/pkgs/clan-app/clan-app.code-workspace b/pkgs/ui/clan-app/clan-app.code-workspace similarity index 100% rename from pkgs/clan-app/clan-app.code-workspace rename to pkgs/ui/clan-app/clan-app.code-workspace diff --git a/pkgs/clan-app/clan_app/__init__.py b/pkgs/ui/clan-app/clan_app/__init__.py similarity index 100% rename from pkgs/clan-app/clan_app/__init__.py rename to pkgs/ui/clan-app/clan_app/__init__.py diff --git a/pkgs/clan-app/clan_app/__main__.py b/pkgs/ui/clan-app/clan_app/__main__.py similarity index 100% rename from pkgs/clan-app/clan_app/__main__.py rename to pkgs/ui/clan-app/clan_app/__main__.py diff --git a/pkgs/clan-app/clan_app/api/__init__.py b/pkgs/ui/clan-app/clan_app/api/__init__.py similarity index 100% rename from pkgs/clan-app/clan_app/api/__init__.py rename to pkgs/ui/clan-app/clan_app/api/__init__.py diff --git a/pkgs/clan-app/clan_app/api/file_gtk.py b/pkgs/ui/clan-app/clan_app/api/file_gtk.py similarity index 100% rename from pkgs/clan-app/clan_app/api/file_gtk.py rename to pkgs/ui/clan-app/clan_app/api/file_gtk.py diff --git a/pkgs/clan-app/clan_app/app.py b/pkgs/ui/clan-app/clan_app/app.py similarity index 100% rename from pkgs/clan-app/clan_app/app.py rename to pkgs/ui/clan-app/clan_app/app.py diff --git a/pkgs/clan-app/clan_app/assets/__init__.py b/pkgs/ui/clan-app/clan_app/assets/__init__.py similarity index 100% rename from pkgs/clan-app/clan_app/assets/__init__.py rename to pkgs/ui/clan-app/clan_app/assets/__init__.py diff --git a/pkgs/clan-app/clan_app/assets/white-favicons/128x128/apps/clan-white.png b/pkgs/ui/clan-app/clan_app/assets/white-favicons/128x128/apps/clan-white.png similarity index 100% rename from pkgs/clan-app/clan_app/assets/white-favicons/128x128/apps/clan-white.png rename to pkgs/ui/clan-app/clan_app/assets/white-favicons/128x128/apps/clan-white.png diff --git a/pkgs/clan-app/clan_app/assets/white-favicons/16x16/apps/clan-white.png b/pkgs/ui/clan-app/clan_app/assets/white-favicons/16x16/apps/clan-white.png similarity index 100% rename from pkgs/clan-app/clan_app/assets/white-favicons/16x16/apps/clan-white.png rename to pkgs/ui/clan-app/clan_app/assets/white-favicons/16x16/apps/clan-white.png diff --git a/pkgs/clan-app/clan_app/assets/white-favicons/32x32/apps/clan-white.png b/pkgs/ui/clan-app/clan_app/assets/white-favicons/32x32/apps/clan-white.png similarity index 100% rename from pkgs/clan-app/clan_app/assets/white-favicons/32x32/apps/clan-white.png rename to pkgs/ui/clan-app/clan_app/assets/white-favicons/32x32/apps/clan-white.png diff --git a/pkgs/clan-app/clan_app/assets/white-favicons/48x48/apps/clan-white.png b/pkgs/ui/clan-app/clan_app/assets/white-favicons/48x48/apps/clan-white.png similarity index 100% rename from pkgs/clan-app/clan_app/assets/white-favicons/48x48/apps/clan-white.png rename to pkgs/ui/clan-app/clan_app/assets/white-favicons/48x48/apps/clan-white.png diff --git a/pkgs/clan-app/clan_app/assets/white-favicons/64x64/apps/clan-white.png b/pkgs/ui/clan-app/clan_app/assets/white-favicons/64x64/apps/clan-white.png similarity index 100% rename from pkgs/clan-app/clan_app/assets/white-favicons/64x64/apps/clan-white.png rename to pkgs/ui/clan-app/clan_app/assets/white-favicons/64x64/apps/clan-white.png diff --git a/pkgs/clan-app/clan_app/deps/__init__.py b/pkgs/ui/clan-app/clan_app/deps/__init__.py similarity index 100% rename from pkgs/clan-app/clan_app/deps/__init__.py rename to pkgs/ui/clan-app/clan_app/deps/__init__.py diff --git a/pkgs/clan-app/clan_app/deps/webview/__init__.py b/pkgs/ui/clan-app/clan_app/deps/webview/__init__.py similarity index 100% rename from pkgs/clan-app/clan_app/deps/webview/__init__.py rename to pkgs/ui/clan-app/clan_app/deps/webview/__init__.py diff --git a/pkgs/clan-app/clan_app/deps/webview/_webview_ffi.py b/pkgs/ui/clan-app/clan_app/deps/webview/_webview_ffi.py similarity index 100% rename from pkgs/clan-app/clan_app/deps/webview/_webview_ffi.py rename to pkgs/ui/clan-app/clan_app/deps/webview/_webview_ffi.py diff --git a/pkgs/clan-app/clan_app/deps/webview/webview.py b/pkgs/ui/clan-app/clan_app/deps/webview/webview.py similarity index 100% rename from pkgs/clan-app/clan_app/deps/webview/webview.py rename to pkgs/ui/clan-app/clan_app/deps/webview/webview.py diff --git a/pkgs/clan-app/default.nix b/pkgs/ui/clan-app/default.nix similarity index 100% rename from pkgs/clan-app/default.nix rename to pkgs/ui/clan-app/default.nix diff --git a/pkgs/clan-app/flake-module.nix b/pkgs/ui/clan-app/flake-module.nix similarity index 100% rename from pkgs/clan-app/flake-module.nix rename to pkgs/ui/clan-app/flake-module.nix diff --git a/pkgs/clan-app/install-desktop.sh b/pkgs/ui/clan-app/install-desktop.sh similarity index 100% rename from pkgs/clan-app/install-desktop.sh rename to pkgs/ui/clan-app/install-desktop.sh diff --git a/pkgs/clan-app/pyproject.toml b/pkgs/ui/clan-app/pyproject.toml similarity index 100% rename from pkgs/clan-app/pyproject.toml rename to pkgs/ui/clan-app/pyproject.toml diff --git a/pkgs/clan-app/shell.nix b/pkgs/ui/clan-app/shell.nix similarity index 83% rename from pkgs/clan-app/shell.nix rename to pkgs/ui/clan-app/shell.nix index fa5cc6cae..35a932ec8 100644 --- a/pkgs/clan-app/shell.nix +++ b/pkgs/ui/clan-app/shell.nix @@ -3,6 +3,7 @@ mkShell, ruff, webview-lib, + process-compose, self', }: @@ -11,7 +12,11 @@ mkShell { inputsFrom = [ self'.devShells.default ]; - inherit (clan-app) nativeBuildInputs propagatedBuildInputs; + inherit (clan-app) propagatedBuildInputs; + + nativeBuildInputs = clan-app.nativeBuildInputs ++ [ + process-compose + ]; buildInputs = [ (clan-app.pythonRuntime.withPackages ( @@ -27,7 +32,7 @@ mkShell { shellHook = '' export GIT_ROOT=$(git rev-parse --show-toplevel) - export PKG_ROOT=$GIT_ROOT/pkgs/clan-app + export PKG_ROOT=$GIT_ROOT/pkgs/ui/clan-app export CLAN_CORE_PATH="$GIT_ROOT" diff --git a/pkgs/clan-app/tests/command.py b/pkgs/ui/clan-app/tests/command.py similarity index 100% rename from pkgs/clan-app/tests/command.py rename to pkgs/ui/clan-app/tests/command.py diff --git a/pkgs/clan-app/tests/conftest.py b/pkgs/ui/clan-app/tests/conftest.py similarity index 100% rename from pkgs/clan-app/tests/conftest.py rename to pkgs/ui/clan-app/tests/conftest.py diff --git a/pkgs/clan-app/tests/helpers/__init__.py b/pkgs/ui/clan-app/tests/helpers/__init__.py similarity index 100% rename from pkgs/clan-app/tests/helpers/__init__.py rename to pkgs/ui/clan-app/tests/helpers/__init__.py diff --git a/pkgs/clan-app/tests/helpers/cli.py b/pkgs/ui/clan-app/tests/helpers/cli.py similarity index 100% rename from pkgs/clan-app/tests/helpers/cli.py rename to pkgs/ui/clan-app/tests/helpers/cli.py diff --git a/pkgs/clan-app/tests/root.py b/pkgs/ui/clan-app/tests/root.py similarity index 100% rename from pkgs/clan-app/tests/root.py rename to pkgs/ui/clan-app/tests/root.py diff --git a/pkgs/clan-app/tests/temporary_dir.py b/pkgs/ui/clan-app/tests/temporary_dir.py similarity index 100% rename from pkgs/clan-app/tests/temporary_dir.py rename to pkgs/ui/clan-app/tests/temporary_dir.py diff --git a/pkgs/clan-app/tests/test_cli.py b/pkgs/ui/clan-app/tests/test_cli.py similarity index 100% rename from pkgs/clan-app/tests/test_cli.py rename to pkgs/ui/clan-app/tests/test_cli.py diff --git a/pkgs/clan-app/tests/test_join.py b/pkgs/ui/clan-app/tests/test_join.py similarity index 100% rename from pkgs/clan-app/tests/test_join.py rename to pkgs/ui/clan-app/tests/test_join.py diff --git a/pkgs/clan-app/tests/wayland.py b/pkgs/ui/clan-app/tests/wayland.py similarity index 100% rename from pkgs/clan-app/tests/wayland.py rename to pkgs/ui/clan-app/tests/wayland.py diff --git a/pkgs/ui/flake-module.nix b/pkgs/ui/flake-module.nix new file mode 100644 index 000000000..0240823a8 --- /dev/null +++ b/pkgs/ui/flake-module.nix @@ -0,0 +1,25 @@ +{ + imports = [ + ./clan-app/flake-module.nix + ./webview-ui/flake-module.nix + ]; + + perSystem = + { + self', + pkgs, + config, + ... + }: + { + packages = { + webview-lib = pkgs.callPackage ./webview-lib { }; + }; + + devShells.ui = pkgs.callPackage ./shell.nix { + inherit self'; + inherit (self'.packages) clan-app webview-lib webview-ui; + inherit (config.packages) clan-ts-api; + }; + }; +} diff --git a/pkgs/ui/process-compose.yaml b/pkgs/ui/process-compose.yaml new file mode 100644 index 000000000..2a90de562 --- /dev/null +++ b/pkgs/ui/process-compose.yaml @@ -0,0 +1,24 @@ +version: "0.5" + +env_cmds: + PRJ_ROOT: "git rev-parse --show-toplevel" + +processes: + webview-ui: + command: | + direnv allow + direnv exec . npm install + direnv exec . vite + ready_log_line: "VITE" + working_dir: "$PKG_ROOT_WEBVIEW_UI/app" + + clan-app: + command: | + direnv allow + direnv exec . clan-app --debug --content-uri http://localhost:3000 + depends_on: + webview-ui: + condition: "process_log_ready" + is_foreground: true + ready_log_line: "Debug mode enabled" + working_dir: "$PKG_ROOT_CLAN_APP" diff --git a/pkgs/ui/shell.nix b/pkgs/ui/shell.nix new file mode 100644 index 000000000..577853e3e --- /dev/null +++ b/pkgs/ui/shell.nix @@ -0,0 +1,90 @@ +{ + clan-app, + mkShell, + ruff, + webview-lib, + webview-ui, + clan-ts-api, + process-compose, + python3, + json2ts, + self', +}: + +mkShell { + name = "ui"; + + inputsFrom = [ + self'.devShells.default + webview-ui + ]; + + packages = [ + # required for reload-python-api.sh script + python3 + json2ts + ]; + + inherit (clan-app) propagatedBuildInputs; + + nativeBuildInputs = clan-app.nativeBuildInputs ++ [ + process-compose + ]; + + buildInputs = [ + (clan-app.pythonRuntime.withPackages ( + ps: + with ps; + [ + mypy + ] + ++ (clan-app.devshellPyDeps ps) + )) + ruff + ] ++ clan-app.runtimeDeps; + + shellHook = '' + export GIT_ROOT=$(git rev-parse --show-toplevel) + + export CLAN_CORE_PATH="$GIT_ROOT" + + export PKG_ROOT_UI="$GIT_ROOT/pkgs/ui" + export PKG_ROOT_CLAN_APP="$PKG_ROOT_UI"/clan-app + export PKG_ROOT_WEBVIEW_UI="$PKG_ROOT_UI"/webview-ui + + export NODE_PATH="$PKG_ROOT_WEBVIEW_UI/app/node_modules" + + # Add current package to PYTHONPATH + export PYTHONPATH="$PKG_ROOT_CLAN_APP''${PYTHONPATH:+:$PYTHONPATH:}" + + # Add clan-app command to PATH + export PATH="$PKG_ROOT_CLAN_APP/bin":"$PATH" + + # Add webview-ui scripts to PATH + scriptsPath="$PKG_ROOT/bin" + export PATH="$NODE_PATH/.bin:$scriptsPath:$PATH" + + # Add clan-cli to the python path so that we can import it without building it in nix first + export PYTHONPATH="$GIT_ROOT/pkgs/clan-cli":"$PYTHONPATH" + + export XDG_DATA_DIRS=$GSETTINGS_SCHEMAS_PATH:$XDG_DATA_DIRS + + export WEBVIEW_LIB_DIR=${webview-lib}/lib + source $PKG_ROOT_CLAN_APP/.local.env + + cp -r ${self'.packages.fonts} "$PKG_ROOT_WEBVIEW_UI/app/.fonts" + chmod -R +w "$PKG_ROOT_WEBVIEW_UI/app/.fonts" + + # Define the yellow color code + YELLOW='\033[1;33m' + # Define the reset color code + NC='\033[0m' + + mkdir -p "$PKG_ROOT_WEBVIEW_UI/app/api" + cp -r ${clan-ts-api}/* "$PKG_ROOT_WEBVIEW_UI/app/api" + chmod -R +w "$PKG_ROOT_WEBVIEW_UI/app/api" + + # configure process-compose + export PC_CONFIG_FILES="$PKG_ROOT_UI/process-compose.yaml" + ''; +} diff --git a/pkgs/webview-lib/default.nix b/pkgs/ui/webview-lib/default.nix similarity index 100% rename from pkgs/webview-lib/default.nix rename to pkgs/ui/webview-lib/default.nix diff --git a/pkgs/webview-ui/.envrc b/pkgs/ui/webview-ui/.envrc similarity index 100% rename from pkgs/webview-ui/.envrc rename to pkgs/ui/webview-ui/.envrc diff --git a/pkgs/webview-ui/.gitignore b/pkgs/ui/webview-ui/.gitignore similarity index 100% rename from pkgs/webview-ui/.gitignore rename to pkgs/ui/webview-ui/.gitignore diff --git a/pkgs/webview-ui/.vscode/settings.json b/pkgs/ui/webview-ui/.vscode/settings.json similarity index 100% rename from pkgs/webview-ui/.vscode/settings.json rename to pkgs/ui/webview-ui/.vscode/settings.json diff --git a/pkgs/webview-ui/app/README.md b/pkgs/ui/webview-ui/app/README.md similarity index 100% rename from pkgs/webview-ui/app/README.md rename to pkgs/ui/webview-ui/app/README.md diff --git a/pkgs/ui/webview-ui/app/app/api/API.json b/pkgs/ui/webview-ui/app/app/api/API.json new file mode 100644 index 000000000..112bf11a7 --- /dev/null +++ b/pkgs/ui/webview-ui/app/app/api/API.json @@ -0,0 +1,5591 @@ +{ + "$comment": "An object containing API methods. ", + "type": "object", + "additionalProperties": false, + "required": [ + "cancel_task", + "list_tasks", + "open_file", + "get_directory", + "show_block_devices", + "show_machine_hardware_config", + "show_machine_hardware_platform", + "generate_machine_hardware_info", + "list_modules", + "get_disk_schemas", + "set_machine_disk_schema", + "show_mdns", + "load_inventory_json", + "patch_inventory_with", + "get_inventory_with_writeable_keys", + "set_inventory", + "get_inventory", + "set_machine", + "list_machines", + "get_machine_details", + "check_machine_online", + "get_generators_closure", + "generate_vars_for_machine", + "create_clan", + "show_clan_meta", + "update_clan_meta", + "maybe_get_admin_public_key", + "list_possible_languages", + "list_possible_keymaps", + "flash_machine", + "create_machine", + "delete_machine", + "install_machine", + "deploy_machine", + "get_vars", + "get_generators", + "set_prompts", + "get_var", + "keygen" + ], + "properties": { + "cancel_task": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["task_id"], + "additionalProperties": false, + "properties": { + "task_id": { + "type": "string" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "list_tasks": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [], + "additionalProperties": false, + "properties": { + "op_key": { + "type": "string" + } + } + } + } + }, + "open_file": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["file_request"], + "additionalProperties": false, + "properties": { + "file_request": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "open_file", + "select_folder", + "save", + "open_multiple_files" + ] + }, + "title": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "filters": { + "oneOf": [ + { + "type": "object", + "properties": { + "title": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "mime_types": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "patterns": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "suffixes": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + } + }, + "required": [], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "initial_file": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "initial_folder": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["mode"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_directory": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "files": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "file_type": { + "type": "string", + "enum": ["file", "directory", "symlink"] + } + }, + "required": ["file_type", "path"], + "additionalProperties": false + } + } + }, + "required": ["path"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "show_block_devices": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "blockdevices": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "id_link": { + "type": "string" + }, + "path": { + "type": "string" + }, + "rm": { + "type": "string" + }, + "size": { + "type": "string" + }, + "ro": { + "type": "boolean" + }, + "mountpoints": { + "type": "array", + "items": { + "type": "string" + } + }, + "type_": { + "type": "string", + "enum": ["disk"] + } + }, + "required": [ + "type_", + "mountpoints", + "name", + "ro", + "rm", + "id_link", + "path", + "size" + ], + "additionalProperties": false + } + } + }, + "required": ["blockdevices"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [], + "additionalProperties": false, + "properties": { + "op_key": { + "type": "string" + } + } + } + } + }, + "show_machine_hardware_config": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "string", + "enum": ["nixos-facter", "nixos-generate-config", "none"] + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "show_machine_hardware_platform": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "generate_machine_hardware_info": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "string", + "enum": ["nixos-facter", "nixos-generate-config", "none"] + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["opts"], + "additionalProperties": false, + "properties": { + "opts": { + "type": "object", + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "backend": { + "type": "string", + "enum": ["nixos-facter", "nixos-generate-config", "none"] + }, + "password": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["machine", "backend"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "list_modules": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "modulesPerSource": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "manifest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "features": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "name", + "description", + "categories", + "features" + ], + "additionalProperties": false + }, + "roles": { + "type": "object", + "additionalProperties": { + "type": "null" + } + } + }, + "required": ["manifest", "roles"], + "additionalProperties": false + } + } + }, + "localModules": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "manifest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "features": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + }, + "required": [ + "name", + "description", + "categories", + "features" + ], + "additionalProperties": false + }, + "roles": { + "type": "object", + "additionalProperties": { + "type": "null" + } + } + }, + "required": ["manifest", "roles"], + "additionalProperties": false + } + } + }, + "required": ["modulesPerSource", "localModules"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["base_path"], + "additionalProperties": false, + "properties": { + "base_path": { + "type": "string" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_disk_schemas": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "readme": { + "type": "string" + }, + "frontmatter": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "features": { + "type": "array", + "items": { + "type": "string" + } + }, + "constraints": { + "type": "object", + "additionalProperties": true + } + }, + "required": ["description"], + "additionalProperties": false + }, + "placeholders": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "options": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "required": { + "type": "boolean" + } + }, + "required": ["label", "required"], + "additionalProperties": false + } + } + }, + "required": [ + "placeholders", + "readme", + "frontmatter", + "name" + ], + "additionalProperties": false + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "set_machine_disk_schema": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine", "schema_name", "placeholders"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "schema_name": { + "type": "string" + }, + "placeholders": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "force": { + "type": "boolean" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "show_mdns": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "interface": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type_": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "host": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ip": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "port": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "txt": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "type_", + "name", + "interface", + "domain", + "protocol" + ], + "additionalProperties": false + } + } + }, + "required": ["services"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [], + "additionalProperties": false, + "properties": { + "op_key": { + "type": "string" + } + } + } + } + }, + "load_inventory_json": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "modules": { + "type": "object", + "additionalProperties": true + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "object", + "additionalProperties": true + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "patch_inventory_with": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake", "section", "content"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "section": { + "type": "string" + }, + "content": { + "type": "object", + "additionalProperties": true + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_inventory_with_writeable_keys": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "writeables": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "data_eval": { + "type": "object", + "properties": { + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "modules": { + "type": "object", + "additionalProperties": true + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "object", + "additionalProperties": true + } + }, + "required": [], + "additionalProperties": false + }, + "data_disk": { + "type": "object", + "properties": { + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "modules": { + "type": "object", + "additionalProperties": true + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "object", + "additionalProperties": true + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": ["data_disk", "writeables", "data_eval"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "set_inventory": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["inventory", "flake", "message"], + "additionalProperties": false, + "properties": { + "inventory": { + "type": "object", + "properties": { + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "modules": { + "type": "object", + "additionalProperties": true + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "object", + "additionalProperties": true + } + }, + "required": [], + "additionalProperties": false + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "message": { + "type": "string" + }, + "commit": { + "type": "boolean" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_inventory": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "modules": { + "type": "object", + "additionalProperties": true + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "object", + "additionalProperties": true + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "set_machine": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake", "machine_name", "machine"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "machine_name": { + "type": "string" + }, + "machine": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "list_machines": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_machine_details": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "machine": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + }, + "hw_config": { + "oneOf": [ + { + "type": "string", + "enum": [ + "nixos-facter", + "nixos-generate-config", + "none" + ] + }, + { + "type": "null" + } + ] + }, + "disk_schema": { + "oneOf": [ + { + "type": "object", + "properties": { + "schema_name": { + "type": "string" + }, + "placeholders": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": ["schema_name", "placeholders"], + "additionalProperties": false + }, + { + "type": "null" + } + ] + } + }, + "required": ["machine"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "check_machine_online": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "string", + "enum": ["Online", "Offline"] + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "opts": { + "oneOf": [ + { + "type": "object", + "properties": { + "timeout": { + "type": "integer" + }, + "retries": { + "type": "integer" + } + }, + "required": [], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_generators_closure": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "files": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "boolean" + }, + "deploy": { + "type": "boolean" + }, + "owner": { + "type": "string" + }, + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "needed_for": { + "type": "string" + } + }, + "required": ["id", "name"], + "additionalProperties": false + } + }, + "share": { + "type": "boolean" + }, + "prompts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "prompt_type": { + "type": "string", + "enum": ["line", "hidden", "multiline"] + }, + "persist": { + "type": "boolean" + }, + "previous_value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["prompt_type", "description", "name"], + "additionalProperties": false + } + }, + "dependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "migrate_fact": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["name"], + "additionalProperties": false + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine_name", "base_dir"], + "additionalProperties": false, + "properties": { + "machine_name": { + "type": "string" + }, + "base_dir": { + "type": "string" + }, + "regenerate": { + "type": "boolean" + }, + "include_previous_values": { + "type": "boolean" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "generate_vars_for_machine": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "boolean" + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [ + "machine_name", + "generators", + "all_prompt_values", + "base_dir" + ], + "additionalProperties": false, + "properties": { + "machine_name": { + "type": "string" + }, + "generators": { + "type": "array", + "items": { + "type": "string" + } + }, + "all_prompt_values": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "base_dir": { + "type": "string" + }, + "no_sandbox": { + "type": "boolean" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "create_clan": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "flake_update": { + "oneOf": [ + { + "type": "object", + "properties": { + "stdout": { + "type": "string" + }, + "stderr": { + "type": "string" + }, + "env": { + "oneOf": [ + { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "cwd": { + "type": "string" + }, + "command_list": { + "type": "array", + "items": { + "type": "string" + } + }, + "returncode": { + "type": "integer" + }, + "msg": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd", + "stderr", + "command_list", + "returncode", + "stdout" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "git_init": { + "oneOf": [ + { + "type": "object", + "properties": { + "stdout": { + "type": "string" + }, + "stderr": { + "type": "string" + }, + "env": { + "oneOf": [ + { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "cwd": { + "type": "string" + }, + "command_list": { + "type": "array", + "items": { + "type": "string" + } + }, + "returncode": { + "type": "integer" + }, + "msg": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd", + "stderr", + "command_list", + "returncode", + "stdout" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "git_add": { + "oneOf": [ + { + "type": "object", + "properties": { + "stdout": { + "type": "string" + }, + "stderr": { + "type": "string" + }, + "env": { + "oneOf": [ + { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "cwd": { + "type": "string" + }, + "command_list": { + "type": "array", + "items": { + "type": "string" + } + }, + "returncode": { + "type": "integer" + }, + "msg": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd", + "stderr", + "command_list", + "returncode", + "stdout" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "git_config_username": { + "oneOf": [ + { + "type": "object", + "properties": { + "stdout": { + "type": "string" + }, + "stderr": { + "type": "string" + }, + "env": { + "oneOf": [ + { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "cwd": { + "type": "string" + }, + "command_list": { + "type": "array", + "items": { + "type": "string" + } + }, + "returncode": { + "type": "integer" + }, + "msg": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd", + "stderr", + "command_list", + "returncode", + "stdout" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "git_config_email": { + "oneOf": [ + { + "type": "object", + "properties": { + "stdout": { + "type": "string" + }, + "stderr": { + "type": "string" + }, + "env": { + "oneOf": [ + { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "cwd": { + "type": "string" + }, + "command_list": { + "type": "array", + "items": { + "type": "string" + } + }, + "returncode": { + "type": "integer" + }, + "msg": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "cwd", + "stderr", + "command_list", + "returncode", + "stdout" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["opts"], + "additionalProperties": false, + "properties": { + "opts": { + "type": "object", + "properties": { + "dest": { + "type": "string" + }, + "template_name": { + "type": "string" + }, + "src_flake": { + "oneOf": [ + { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "input_prio": { + "oneOf": [ + { + "type": "object", + "properties": { + "input_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "prioritize_self": { + "type": "boolean" + } + }, + "required": ["input_names"], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "setup_git": { + "type": "boolean" + }, + "initial": { + "oneOf": [ + { + "type": "object", + "properties": { + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "modules": { + "type": "object", + "additionalProperties": true + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "object", + "additionalProperties": true + } + }, + "required": [], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "update_clan": { + "type": "boolean" + } + }, + "required": ["dest", "template_name"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "show_clan_meta": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake"], + "additionalProperties": false, + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "update_clan_meta": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "modules": { + "type": "object", + "additionalProperties": true + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + }, + "tags": { + "type": "object", + "additionalProperties": true + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["options"], + "additionalProperties": false, + "properties": { + "options": { + "type": "object", + "properties": { + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "meta": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + } + }, + "required": ["flake", "meta"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "maybe_get_admin_public_key": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "oneOf": [ + { + "type": "object", + "properties": { + "pubkey": { + "type": "string" + }, + "username": { + "type": "string" + }, + "key_type": { + "type": "string", + "enum": [1, 2] + } + }, + "required": ["key_type", "username", "pubkey"], + "additionalProperties": false + }, + { + "type": "null" + } + ] + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [], + "additionalProperties": false, + "properties": { + "op_key": { + "type": "string" + } + } + } + } + }, + "list_possible_languages": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [], + "additionalProperties": false, + "properties": { + "op_key": { + "type": "string" + } + } + } + } + }, + "list_possible_keymaps": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [], + "additionalProperties": false, + "properties": { + "op_key": { + "type": "string" + } + } + } + } + }, + "flash_machine": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": [ + "machine", + "mode", + "disks", + "system_config", + "dry_run", + "write_efi_boot_entries", + "debug" + ], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "mode": { + "type": "string" + }, + "disks": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "device": { + "type": "string" + } + }, + "required": ["device", "name"], + "additionalProperties": false + } + }, + "system_config": { + "type": "object", + "properties": { + "language": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "keymap": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ssh_keys_path": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + } + }, + "required": [], + "additionalProperties": false + }, + "dry_run": { + "type": "boolean" + }, + "write_efi_boot_entries": { + "type": "boolean" + }, + "debug": { + "type": "boolean" + }, + "extra_args": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + }, + "graphical": { + "type": "boolean" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "create_machine": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["opts"], + "additionalProperties": false, + "properties": { + "opts": { + "type": "object", + "properties": { + "clan_dir": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "machine": { + "type": "object", + "properties": { + "deploy": { + "type": "object", + "properties": { + "targetHost": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "machineClass": { + "type": "string", + "enum": ["nixos", "darwin"] + }, + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [], + "additionalProperties": false + }, + "target_host": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "input_prio": { + "oneOf": [ + { + "type": "object", + "properties": { + "input_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "prioritize_self": { + "type": "boolean" + } + }, + "required": ["input_names"], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "template_name": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["machine", "clan_dir"], + "additionalProperties": false + }, + "commit": { + "type": "boolean" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "delete_machine": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "install_machine": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["opts"], + "additionalProperties": false, + "properties": { + "opts": { + "type": "object", + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "kexec": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "debug": { + "type": "boolean" + }, + "no_reboot": { + "type": "boolean" + }, + "phases": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "build_on": { + "oneOf": [ + { + "type": "string", + "enum": ["auto", "local", "remote"] + }, + { + "type": "null" + } + ] + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "update_hardware_config": { + "type": "string", + "enum": ["nixos-facter", "nixos-generate-config", "none"] + }, + "password": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "identity_file": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "use_tor": { + "type": "boolean" + } + }, + "required": ["machine"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "deploy_machine": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["machine"], + "additionalProperties": false, + "properties": { + "machine": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "flake": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "inputs_from": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "hash": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "store_path": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["identifier"], + "additionalProperties": false + }, + "nix_options": { + "type": "array", + "items": { + "type": "string" + } + }, + "cached_deployment": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "override_target_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "override_build_host": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ] + }, + "private_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "host_key_check": { + "type": "string", + "enum": [0, 1, 2, 3] + } + }, + "required": ["flake", "name"], + "additionalProperties": false + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_vars": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "boolean" + }, + "deploy": { + "type": "boolean" + }, + "owner": { + "type": "string" + }, + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "needed_for": { + "type": "string" + } + }, + "required": ["id", "name"], + "additionalProperties": false + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["base_dir", "machine_name"], + "additionalProperties": false, + "properties": { + "base_dir": { + "type": "string" + }, + "machine_name": { + "type": "string" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_generators": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "files": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "boolean" + }, + "deploy": { + "type": "boolean" + }, + "owner": { + "type": "string" + }, + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "needed_for": { + "type": "string" + } + }, + "required": ["id", "name"], + "additionalProperties": false + } + }, + "share": { + "type": "boolean" + }, + "prompts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "prompt_type": { + "type": "string", + "enum": ["line", "hidden", "multiline"] + }, + "persist": { + "type": "boolean" + }, + "previous_value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["prompt_type", "description", "name"], + "additionalProperties": false + } + }, + "dependencies": { + "type": "array", + "items": { + "type": "string" + } + }, + "migrate_fact": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": ["name"], + "additionalProperties": false + } + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["base_dir", "machine_name"], + "additionalProperties": false, + "properties": { + "base_dir": { + "type": "string" + }, + "machine_name": { + "type": "string" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "set_prompts": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["base_dir", "machine_name", "updates"], + "additionalProperties": false, + "properties": { + "base_dir": { + "type": "string" + }, + "machine_name": { + "type": "string" + }, + "updates": { + "type": "array", + "items": { + "type": "object", + "properties": { + "generator": { + "type": "string" + }, + "prompt_values": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": ["generator", "prompt_values"], + "additionalProperties": false + } + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "get_var": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "secret": { + "type": "boolean" + }, + "deploy": { + "type": "boolean" + }, + "owner": { + "type": "string" + }, + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "needed_for": { + "type": "string" + } + }, + "required": ["id", "name"], + "additionalProperties": false + } + }, + "required": ["status", "op_key", "data"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["base_dir", "machine_name", "var_id"], + "additionalProperties": false, + "properties": { + "base_dir": { + "type": "string" + }, + "machine_name": { + "type": "string" + }, + "var_id": { + "type": "string" + }, + "op_key": { + "type": "string" + } + } + } + } + }, + "keygen": { + "type": "object", + "required": ["arguments", "return"], + "additionalProperties": false, + "properties": { + "return": { + "oneOf": [ + { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["success"], + "description": "The status of the response." + }, + "data": { + "type": "null" + } + }, + "required": ["status", "op_key"], + "additionalProperties": false + }, + { + "$ref": "#/$defs/error" + } + ] + }, + "arguments": { + "type": "object", + "required": ["flake_dir"], + "additionalProperties": false, + "properties": { + "flake_dir": { + "type": "string" + }, + "user": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "force": { + "type": "boolean" + }, + "op_key": { + "type": "string" + } + } + } + } + } + }, + "$defs": { + "error": { + "type": "object", + "properties": { + "op_key": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["error"] + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "description": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "location": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ] + } + }, + "required": ["message"], + "additionalProperties": false + } + } + }, + "required": ["errors", "status", "op_key"], + "additionalProperties": false + } + } +} diff --git a/pkgs/ui/webview-ui/app/app/api/API.ts b/pkgs/ui/webview-ui/app/app/api/API.ts new file mode 100644 index 000000000..21366fab8 --- /dev/null +++ b/pkgs/ui/webview-ui/app/app/api/API.ts @@ -0,0 +1,1455 @@ +/* eslint-disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export interface API { + cancel_task: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + task_id: string; + op_key?: string; + }; + }; + list_tasks: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: string[]; + } + | Error; + arguments: { + op_key?: string; + }; + }; + open_file: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: string[] | null; + } + | Error; + arguments: { + file_request: { + mode: "open_file" | "select_folder" | "save" | "open_multiple_files"; + title?: string | null; + filters?: { + title?: string | null; + mime_types?: string[] | null; + patterns?: string[] | null; + suffixes?: string[] | null; + } | null; + initial_file?: string | null; + initial_folder?: string | null; + }; + op_key?: string; + }; + }; + get_directory: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + path: string; + files?: { + path: string; + file_type: "file" | "directory" | "symlink"; + }[]; + }; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + op_key?: string; + }; + }; + show_block_devices: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + blockdevices: { + name: string; + id_link: string; + path: string; + rm: string; + size: string; + ro: boolean; + mountpoints: string[]; + type_: "disk"; + }[]; + }; + } + | Error; + arguments: { + op_key?: string; + }; + }; + show_machine_hardware_config: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: "nixos-facter" | "nixos-generate-config" | "none"; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + op_key?: string; + }; + }; + show_machine_hardware_platform: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: string | null; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + op_key?: string; + }; + }; + generate_machine_hardware_info: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: "nixos-facter" | "nixos-generate-config" | "none"; + } + | Error; + arguments: { + opts: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + backend: "nixos-facter" | "nixos-generate-config" | "none"; + password?: string | null; + }; + op_key?: string; + }; + }; + list_modules: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + modulesPerSource: { + [k: string]: { + [k: string]: { + manifest: { + name: string; + description: string; + categories: string[]; + features: { + [k: string]: boolean; + }; + }; + roles: { + [k: string]: null; + }; + }; + }; + }; + localModules: { + [k: string]: { + manifest: { + name: string; + description: string; + categories: string[]; + features: { + [k: string]: boolean; + }; + }; + roles: { + [k: string]: null; + }; + }; + }; + }; + } + | Error; + arguments: { + base_path: string; + op_key?: string; + }; + }; + get_disk_schemas: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + [k: string]: { + name: string; + readme: string; + frontmatter: { + description: string; + categories?: string[]; + features?: string[]; + constraints?: { + [k: string]: unknown; + }; + }; + placeholders: { + [k: string]: { + label: string; + options?: string[] | null; + required: boolean; + }; + }; + }; + }; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + op_key?: string; + }; + }; + set_machine_disk_schema: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + schema_name: string; + placeholders: { + [k: string]: string; + }; + force?: boolean; + op_key?: string; + }; + }; + show_mdns: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + services: { + [k: string]: { + interface: string; + protocol: string; + name: string; + type_: string; + domain: string; + host?: string | null; + ip?: string | null; + port?: string | null; + txt?: string | null; + }; + }; + }; + } + | Error; + arguments: { + op_key?: string; + }; + }; + load_inventory_json: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + machines?: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + meta?: { + name: string; + description?: string; + icon?: string; + }; + modules?: { + [k: string]: unknown; + }; + services?: { + [k: string]: { + [k: string]: unknown; + }; + }; + tags?: { + [k: string]: unknown; + }; + }; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + op_key?: string; + }; + }; + patch_inventory_with: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + section: string; + content: { + [k: string]: unknown; + }; + op_key?: string; + }; + }; + get_inventory_with_writeable_keys: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + writeables: { + [k: string]: string[]; + }; + data_eval: { + machines?: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + meta?: { + name: string; + description?: string; + icon?: string; + }; + modules?: { + [k: string]: unknown; + }; + services?: { + [k: string]: { + [k: string]: unknown; + }; + }; + tags?: { + [k: string]: unknown; + }; + }; + data_disk: { + machines?: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + meta?: { + name: string; + description?: string; + icon?: string; + }; + modules?: { + [k: string]: unknown; + }; + services?: { + [k: string]: { + [k: string]: unknown; + }; + }; + tags?: { + [k: string]: unknown; + }; + }; + }; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + op_key?: string; + }; + }; + set_inventory: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + inventory: { + machines?: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + meta?: { + name: string; + description?: string; + icon?: string; + }; + modules?: { + [k: string]: unknown; + }; + services?: { + [k: string]: { + [k: string]: unknown; + }; + }; + tags?: { + [k: string]: unknown; + }; + }; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + message: string; + commit?: boolean; + op_key?: string; + }; + }; + get_inventory: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + machines?: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + meta?: { + name: string; + description?: string; + icon?: string; + }; + modules?: { + [k: string]: unknown; + }; + services?: { + [k: string]: { + [k: string]: unknown; + }; + }; + tags?: { + [k: string]: unknown; + }; + }; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + op_key?: string; + }; + }; + set_machine: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + machine_name: string; + machine: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + op_key?: string; + }; + }; + list_machines: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + op_key?: string; + }; + }; + get_machine_details: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + machine: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + hw_config?: + | ("nixos-facter" | "nixos-generate-config" | "none") + | null; + disk_schema?: { + schema_name: string; + placeholders: { + [k: string]: string; + }; + } | null; + }; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + op_key?: string; + }; + }; + check_machine_online: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: "Online" | "Offline"; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + opts?: { + timeout?: number; + retries?: number; + } | null; + op_key?: string; + }; + }; + get_generators_closure: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + name: string; + files?: { + id: string; + name: string; + secret?: boolean; + deploy?: boolean; + owner?: string; + group?: string; + mode?: number; + needed_for?: string; + }[]; + share?: boolean; + prompts?: { + name: string; + description: string; + prompt_type: "line" | "hidden" | "multiline"; + persist?: boolean; + previous_value?: string | null; + }[]; + dependencies?: string[]; + migrate_fact?: string | null; + }[]; + } + | Error; + arguments: { + machine_name: string; + base_dir: string; + regenerate?: boolean; + include_previous_values?: boolean; + op_key?: string; + }; + }; + generate_vars_for_machine: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: boolean; + } + | Error; + arguments: { + machine_name: string; + generators: string[]; + all_prompt_values: { + [k: string]: { + [k: string]: string; + }; + }; + base_dir: string; + no_sandbox?: boolean; + op_key?: string; + }; + }; + create_clan: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + flake_update?: { + stdout: string; + stderr: string; + env?: { + [k: string]: string; + } | null; + cwd: string; + command_list: string[]; + returncode: number; + msg?: string | null; + } | null; + git_init?: { + stdout: string; + stderr: string; + env?: { + [k: string]: string; + } | null; + cwd: string; + command_list: string[]; + returncode: number; + msg?: string | null; + } | null; + git_add?: { + stdout: string; + stderr: string; + env?: { + [k: string]: string; + } | null; + cwd: string; + command_list: string[]; + returncode: number; + msg?: string | null; + } | null; + git_config_username?: { + stdout: string; + stderr: string; + env?: { + [k: string]: string; + } | null; + cwd: string; + command_list: string[]; + returncode: number; + msg?: string | null; + } | null; + git_config_email?: { + stdout: string; + stderr: string; + env?: { + [k: string]: string; + } | null; + cwd: string; + command_list: string[]; + returncode: number; + msg?: string | null; + } | null; + }; + } + | Error; + arguments: { + opts: { + dest: string; + template_name: string; + src_flake?: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + } | null; + input_prio?: { + input_names: string[]; + prioritize_self?: boolean; + } | null; + setup_git?: boolean; + initial?: { + machines?: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + meta?: { + name: string; + description?: string; + icon?: string; + }; + modules?: { + [k: string]: unknown; + }; + services?: { + [k: string]: { + [k: string]: unknown; + }; + }; + tags?: { + [k: string]: unknown; + }; + } | null; + update_clan?: boolean; + }; + op_key?: string; + }; + }; + show_clan_meta: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + name: string; + description?: string; + icon?: string; + }; + } + | Error; + arguments: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + op_key?: string; + }; + }; + update_clan_meta: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + machines?: { + [k: string]: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + }; + meta?: { + name: string; + description?: string; + icon?: string; + }; + modules?: { + [k: string]: unknown; + }; + services?: { + [k: string]: { + [k: string]: unknown; + }; + }; + tags?: { + [k: string]: unknown; + }; + }; + } + | Error; + arguments: { + options: { + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + meta: { + name: string; + description?: string; + icon?: string; + }; + }; + op_key?: string; + }; + }; + maybe_get_admin_public_key: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: { + pubkey: string; + username: string; + key_type: 1 | 2; + } | null; + } + | Error; + arguments: { + op_key?: string; + }; + }; + list_possible_languages: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: string[]; + } + | Error; + arguments: { + op_key?: string; + }; + }; + list_possible_keymaps: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: string[]; + } + | Error; + arguments: { + op_key?: string; + }; + }; + flash_machine: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + mode: string; + disks: { + name: string; + device: string; + }[]; + system_config: { + language?: string | null; + keymap?: string | null; + ssh_keys_path?: string[] | null; + }; + dry_run: boolean; + write_efi_boot_entries: boolean; + debug: boolean; + extra_args?: string[] | null; + graphical?: boolean; + op_key?: string; + }; + }; + create_machine: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + opts: { + clan_dir: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + machine: { + deploy?: { + targetHost?: string; + }; + description?: string; + icon?: string; + machineClass?: "nixos" | "darwin"; + name?: string; + tags?: string[]; + }; + target_host?: string | null; + input_prio?: { + input_names: string[]; + prioritize_self?: boolean; + } | null; + template_name?: string | null; + }; + commit?: boolean; + op_key?: string; + }; + }; + delete_machine: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + op_key?: string; + }; + }; + install_machine: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + opts: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + kexec?: string | null; + debug?: boolean; + no_reboot?: boolean; + phases?: string | null; + build_on?: ("auto" | "local" | "remote") | null; + nix_options?: string[]; + update_hardware_config?: + | "nixos-facter" + | "nixos-generate-config" + | "none"; + password?: string | null; + identity_file?: string | null; + use_tor?: boolean; + }; + op_key?: string; + }; + }; + deploy_machine: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + machine: { + name: string; + flake: { + identifier: string; + inputs_from?: string | null; + hash?: string | null; + store_path?: string | null; + }; + nix_options?: string[]; + cached_deployment?: null | { + [k: string]: unknown; + }; + override_target_host?: null | string; + override_build_host?: null | string; + private_key?: string | null; + host_key_check?: 0 | 1 | 2 | 3; + }; + op_key?: string; + }; + }; + get_vars: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + id: string; + name: string; + secret?: boolean; + deploy?: boolean; + owner?: string; + group?: string; + mode?: number; + needed_for?: string; + }[]; + } + | Error; + arguments: { + base_dir: string; + machine_name: string; + op_key?: string; + }; + }; + get_generators: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + name: string; + files?: { + id: string; + name: string; + secret?: boolean; + deploy?: boolean; + owner?: string; + group?: string; + mode?: number; + needed_for?: string; + }[]; + share?: boolean; + prompts?: { + name: string; + description: string; + prompt_type: "line" | "hidden" | "multiline"; + persist?: boolean; + previous_value?: string | null; + }[]; + dependencies?: string[]; + migrate_fact?: string | null; + }[]; + } + | Error; + arguments: { + base_dir: string; + machine_name: string; + op_key?: string; + }; + }; + set_prompts: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + base_dir: string; + machine_name: string; + updates: { + generator: string; + prompt_values: { + [k: string]: string; + }; + }[]; + op_key?: string; + }; + }; + get_var: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data: { + id: string; + name: string; + secret?: boolean; + deploy?: boolean; + owner?: string; + group?: string; + mode?: number; + needed_for?: string; + }; + } + | Error; + arguments: { + base_dir: string; + machine_name: string; + var_id: string; + op_key?: string; + }; + }; + keygen: { + return: + | { + op_key: string; + /** + * The status of the response. + */ + status: "success"; + data?: null; + } + | Error; + arguments: { + flake_dir: string; + user?: string | null; + force?: boolean; + op_key?: string; + }; + }; +} +export interface Error { + op_key: string; + status: "error"; + errors: { + message: string; + description?: string | null; + location?: string[] | null; + }[]; +} diff --git a/pkgs/ui/webview-ui/app/app/api/Inventory.ts b/pkgs/ui/webview-ui/app/app/api/Inventory.ts new file mode 100644 index 000000000..be2ae58ef --- /dev/null +++ b/pkgs/ui/webview-ui/app/app/api/Inventory.ts @@ -0,0 +1,5484 @@ +/* eslint-disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export type AdminConfig = AdminConfigRoleDefault; +export type AdminConfig1 = AdminConfigRoleDefault1; +export type AutoUpgradeConfig = AutoUpgradeConfigRoleDefault; +export type AutoUpgradeConfig1 = AutoUpgradeConfigRoleDefault1; +export type BorgbackupConfig = + | BorgbackupConfigRoleClient + | BorgbackupConfigRoleServer; +export type BorgbackupConfig1 = + | BorgbackupConfigRoleClient1 + | BorgbackupConfigRoleServer1; +export type DataMesherConfig = + | DataMesherConfigRoleAdmin + | DataMesherConfigRolePeer + | DataMesherConfigRoleSigner; +export type DataMesherConfig1 = + | DataMesherConfigRoleAdmin1 + | DataMesherConfigRolePeer1 + | DataMesherConfigRoleSigner1; +export type DiskIdConfig = DiskIdConfigRoleDefault; +export type DiskIdConfig1 = DiskIdConfigRoleDefault1; +export type ImporterConfig = ImporterConfigRoleDefault; +export type ImporterConfig1 = ImporterConfigRoleDefault1; +export type IwdConfig = IwdConfigRoleDefault; +export type IwdConfig1 = IwdConfigRoleDefault1; +export type MachineIdConfig = MachineIdConfigRoleDefault; +export type MachineIdConfig1 = MachineIdConfigRoleDefault1; +export type MumbleConfig = MumbleConfigRoleServer; +export type MumbleConfig1 = MumbleConfigRoleServer1; +export type MyceliumConfig = MyceliumConfigRolePeer; +export type MyceliumConfig1 = MyceliumConfigRolePeer1; +export type PackagesConfig = PackagesConfigRoleDefault; +export type PackagesConfig1 = PackagesConfigRoleDefault1; +export type RootPasswordConfig = RootPasswordConfigRoleDefault; +export type RootPasswordConfig1 = RootPasswordConfigRoleDefault1; +export type SingleDiskConfig = SingleDiskConfigRoleDefault; +export type SingleDiskConfig1 = SingleDiskConfigRoleDefault1; +export type SshdConfig = SshdConfigRoleClient | SshdConfigRoleServer; +export type SshdConfig1 = SshdConfigRoleClient1 | SshdConfigRoleServer1; +export type StateVersionConfig = StateVersionConfigRoleDefault; +export type StateVersionConfig1 = StateVersionConfigRoleDefault1; +export type SyncthingConfig = + | SyncthingConfigRoleIntroducer + | SyncthingConfigRolePeer; +export type SyncthingConfig1 = + | SyncthingConfigRoleIntroducer1 + | SyncthingConfigRolePeer1; +export type UserPasswordConfig = UserPasswordConfigRoleDefault; +export type UserPasswordConfig1 = UserPasswordConfigRoleDefault1; +export type WifiConfig = WifiConfigRoleDefault; +export type WifiConfig1 = WifiConfigRoleDefault1; +export type ZerotierConfig = + | ZerotierConfigRoleController + | ZerotierConfigRoleMoon + | ZerotierConfigRolePeer; +export type ZerotierConfig1 = + | ZerotierConfigRoleController1 + | ZerotierConfigRoleMoon1 + | ZerotierConfigRolePeer1; + +export interface Schema { + /** + * Machines in the inventory. + * + * Each machine declared here can be referencd via its `attributeName` by the `inventory.service`s `roles`. + * + */ + machines?: { + [k: string]: { + deploy: { + /** + * Configuration for the deployment of the machine + */ + targetHost?: null | string; + }; + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * The module system that should be used to construct the machine + * + * Set this to `darwin` for macOS machines + * + */ + machineClass?: "nixos" | "darwin"; + /** + * Name of the machine or service + * + */ + name?: string; + /** + * List of tags for the machine. + * + * The machine can be referenced by its tags in `inventory.services` + * + * ???+ Example + * ```nix + * inventory.machines.machineA.tags = [ "tag1" "tag2" ]; + * ``` + * + * ```nix + * services.borgbackup."instance_1".roles.client.tags = [ "tag1" ]; + * ``` + * + * !!! Note + * Tags can be used to determine the membership of the machine in the services. + * Without changing the service configuration, the machine can be added to a service by adding the correct tags to the machine. + * + * + */ + tags?: string[]; + }; + }; + meta: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the clan. + * + * Needs to be (globally) unique, as this determines the folder name where the flake gets downloaded to. + * + * Should only contain alphanumeric characters, `_` and `-`. + * + */ + name: string; + }; + /** + * A mapping of module names to their path. + * + * Each module can be referenced by its `attributeName` in the `inventory.services` attribute set. + * + * !!! Important + * Each module MUST fulfill the following requirements to be usable with the inventory: + * + * - The module MUST have a `README.md` file with a `description`. + * - The module MUST have at least `features = [ "inventory" ]` in the frontmatter section. + * - The module MUST have a subfolder `roles` with at least one `{roleName}.nix` file. + * + * For further information see: [Module Authoring Guide](../../authoring/clanServices/index.md). + * + * ???+ example + * ```nix + * buildClan { + * # 1. Add the module to the available inventory modules + * inventory.modules = { + * custom-module = ./modules/my_module; + * }; + * # 2. Use the module in the inventory + * inventory.services = { + * custom-module.instance_1 = { + * roles.default.machines = [ "machineA" ]; + * }; + * }; + * }; + * ``` + * + */ + modules: { + [k: string]: + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null; + }; + services?: { + admin?: { + [k: string]: { + config?: AdminConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: AdminConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: AdminRoles; + }; + }; + "auto-upgrade"?: { + [k: string]: { + config?: AutoUpgradeConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: AutoUpgradeConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: AutoUpgradeRoles; + }; + }; + borgbackup?: { + [k: string]: { + config?: BorgbackupConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: BorgbackupConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: BorgbackupRoles; + }; + }; + "data-mesher"?: { + [k: string]: { + config?: DataMesherConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: DataMesherConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: DataMesherRoles; + }; + }; + "disk-id"?: { + [k: string]: { + config?: DiskIdConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: DiskIdConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: DiskIdRoles; + }; + }; + importer?: { + [k: string]: { + config?: ImporterConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: ImporterConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: ImporterRoles; + }; + }; + iwd?: { + [k: string]: { + config?: IwdConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: IwdConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: IwdRoles; + }; + }; + "machine-id"?: { + [k: string]: { + config?: MachineIdConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: MachineIdConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: MachineIdRoles; + }; + }; + mumble?: { + [k: string]: { + config?: MumbleConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: MumbleConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: MumbleRoles; + }; + }; + mycelium?: { + [k: string]: { + config?: MyceliumConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: MyceliumConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: MyceliumRoles; + }; + }; + packages?: { + [k: string]: { + config?: PackagesConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: PackagesConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: PackagesRoles; + }; + }; + "root-password"?: { + [k: string]: { + config?: RootPasswordConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: RootPasswordConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: RootPasswordRoles; + }; + }; + "single-disk"?: { + [k: string]: { + config?: SingleDiskConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: SingleDiskConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: SingleDiskRoles; + }; + }; + sshd?: { + [k: string]: { + config?: SshdConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: SshdConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: SshdRoles; + }; + }; + "state-version"?: { + [k: string]: { + config?: StateVersionConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: StateVersionConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: StateVersionRoles; + }; + }; + syncthing?: { + [k: string]: { + config?: SyncthingConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: SyncthingConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: SyncthingRoles; + }; + }; + "user-password"?: { + [k: string]: { + config?: UserPasswordConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: UserPasswordConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: UserPasswordRoles; + }; + }; + wifi?: { + [k: string]: { + config?: WifiConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: WifiConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: WifiRoles; + }; + }; + zerotier?: { + [k: string]: { + config?: ZerotierConfig; + /** + * Enable or disable the complete service. + * + * If the service is disabled, it will not be added to any machine. + * + * !!! Note + * This flag is primarily used to temporarily disable a service. + * I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled. + * + */ + enabled?: boolean; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + machines?: { + [k: string]: { + config?: ZerotierConfig1; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + [k: string]: unknown; + }; + }; + meta?: { + /** + * Optional freeform description + * + */ + description?: null | string; + /** + * Under construction, will be used for the UI + * + */ + icon?: null | string; + /** + * Name of the machine or service + * + */ + name?: string; + }; + roles?: ZerotierRoles; + }; + }; + }; + /** + * Tags of the inventory are used to group machines together. + * + * It is recommended to use [`machine.tags`](#inventory.machines.tags) to define the tags of the machines. + * + * This can be used to define custom tags that are either statically set or dynamically computed. + * + * #### Static Tags + * + * ???+ example "Static Tag Example" + * ```nix + * inventory.tags = { + * foo = [ "machineA" "machineB" ]; + * }; + * ``` + * + * The tag `foo` will always be added to `machineA` and `machineB`. + * + * #### Dynamic Tags + * + * It is possible to compute tags based on the machines properties or based on other tags. + * + * !!! danger + * This is a powerful feature and should be used with caution. + * + * It is possible to cause infinite recursion by computing tags based on the machines properties or based on other tags. + * + * ???+ example "Dynamic Tag Example" + * + * allButFoo is a computed tag. It will be added to all machines except 'foo' + * + * `all` is a predefined tag. See the docs of [`tags.all`](#inventory.tags.all). + * + * ```nix + * # inventory.tags ↓ ↓ inventory.machines + * inventory.tags = {config, machines...}: { + * # ↓↓↓ The "all" tag + * allButFoo = builtins.filter (name: name != "foo") config.all; + * }; + * ``` + * + * !!! warning + * Do NOT compute `tags` from `machine.tags` this will cause infinite recursion. + * + */ + tags?: { + [k: string]: string[]; + }; +} +export interface AdminConfigRoleDefault { + /** + * The allowed public keys for ssh access to the admin user + */ + allowedKeys?: { + [k: string]: string; + }; +} +export interface AdminConfigRoleDefault1 { + /** + * The allowed public keys for ssh access to the admin user + */ + allowedKeys?: { + [k: string]: string; + }; +} +export interface AdminRoles { + default?: { + config?: AdminConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface AdminConfigRoleDefault2 { + /** + * The allowed public keys for ssh access to the admin user + */ + allowedKeys?: { + [k: string]: string; + }; +} +export interface AutoUpgradeConfigRoleDefault { + /** + * Flake reference + */ + flake: string; +} +export interface AutoUpgradeConfigRoleDefault1 { + /** + * Flake reference + */ + flake: string; +} +export interface AutoUpgradeRoles { + default?: { + config?: AutoUpgradeConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface AutoUpgradeConfigRoleDefault2 { + /** + * Flake reference + */ + flake: string; +} +export interface BorgbackupConfigRoleClient { + /** + * destinations where the machine should be backuped to + * + */ + destinations?: { + [k: string]: { + /** + * the name of the backup job + */ + name?: string; + /** + * the borgbackup repository to backup to + */ + repo: string; + /** + * the rsh to use for the backup + */ + rsh: string; + }; + }; + /** + * Directories/Files to exclude from the backup. + * Use * as a wildcard. + * + */ + exclude?: string[]; +} +export interface BorgbackupConfigRoleServer { + /** + * The directory where the borgbackup repositories are stored. + * + */ + directory?: string; +} +export interface BorgbackupConfigRoleClient1 { + /** + * destinations where the machine should be backuped to + * + */ + destinations?: { + [k: string]: { + /** + * the name of the backup job + */ + name?: string; + /** + * the borgbackup repository to backup to + */ + repo: string; + /** + * the rsh to use for the backup + */ + rsh: string; + }; + }; + /** + * Directories/Files to exclude from the backup. + * Use * as a wildcard. + * + */ + exclude?: string[]; +} +export interface BorgbackupConfigRoleServer1 { + /** + * The directory where the borgbackup repositories are stored. + * + */ + directory?: string; +} +export interface BorgbackupRoles { + client?: { + config?: BorgbackupConfigRoleClient2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; + server?: { + config?: BorgbackupConfigRoleServer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface BorgbackupConfigRoleClient2 { + /** + * destinations where the machine should be backuped to + * + */ + destinations?: { + [k: string]: { + /** + * the name of the backup job + */ + name?: string; + /** + * the borgbackup repository to backup to + */ + repo: string; + /** + * the rsh to use for the backup + */ + rsh: string; + }; + }; + /** + * Directories/Files to exclude from the backup. + * Use * as a wildcard. + * + */ + exclude?: string[]; +} +export interface BorgbackupConfigRoleServer2 { + /** + * The directory where the borgbackup repositories are stored. + * + */ + directory?: string; +} +export interface DataMesherConfigRoleAdmin { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The TTL for hosts in the network, in the form of a Go time.Duration + */ + hostTTL?: string; + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + /** + * Top level domain to use for the network + */ + tld?: string; + }; +} +export interface DataMesherConfigRolePeer { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + }; +} +export interface DataMesherConfigRoleSigner { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + }; +} +export interface DataMesherConfigRoleAdmin1 { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The TTL for hosts in the network, in the form of a Go time.Duration + */ + hostTTL?: string; + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + /** + * Top level domain to use for the network + */ + tld?: string; + }; +} +export interface DataMesherConfigRolePeer1 { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + }; +} +export interface DataMesherConfigRoleSigner1 { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + }; +} +export interface DataMesherRoles { + admin?: { + config?: DataMesherConfigRoleAdmin2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; + peer?: { + config?: DataMesherConfigRolePeer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; + signer?: { + config?: DataMesherConfigRoleSigner2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface DataMesherConfigRoleAdmin2 { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The TTL for hosts in the network, in the form of a Go time.Duration + */ + hostTTL?: string; + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + /** + * Top level domain to use for the network + */ + tld?: string; + }; +} +export interface DataMesherConfigRolePeer2 { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + }; +} +export interface DataMesherConfigRoleSigner2 { + /** + * A list of bootstrap nodes that act as an initial gateway when joining + * the cluster. + * + */ + bootstrapNodes?: null | string[]; + network: { + /** + * The interface over which cluster communication should be performed. + * All the ip addresses associate with this interface will be part of + * our host claim, including both ipv4 and ipv6. + * + * This should be set to an internal/VPN interface. + * + */ + interface: string; + /** + * Port to listen on for cluster communication. + * + */ + port?: number; + }; +} +export interface DiskIdConfigRoleDefault {} +export interface DiskIdConfigRoleDefault1 {} +export interface DiskIdRoles { + default?: { + config?: DiskIdConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface DiskIdConfigRoleDefault2 {} +export interface ImporterConfigRoleDefault {} +export interface ImporterConfigRoleDefault1 {} +export interface ImporterRoles { + default?: { + config?: ImporterConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface ImporterConfigRoleDefault2 {} +export interface IwdConfigRoleDefault { + /** + * Wifi networks to predefine + */ + networks?: { + [k: string]: { + /** + * Automatically try to join this wifi network + */ + AutoConnect?: boolean; + /** + * The name of the wifi network + */ + ssid?: string; + }; + }; +} +export interface IwdConfigRoleDefault1 { + /** + * Wifi networks to predefine + */ + networks?: { + [k: string]: { + /** + * Automatically try to join this wifi network + */ + AutoConnect?: boolean; + /** + * The name of the wifi network + */ + ssid?: string; + }; + }; +} +export interface IwdRoles { + default?: { + config?: IwdConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface IwdConfigRoleDefault2 { + /** + * Wifi networks to predefine + */ + networks?: { + [k: string]: { + /** + * Automatically try to join this wifi network + */ + AutoConnect?: boolean; + /** + * The name of the wifi network + */ + ssid?: string; + }; + }; +} +export interface MachineIdConfigRoleDefault {} +export interface MachineIdConfigRoleDefault1 {} +export interface MachineIdRoles { + default?: { + config?: MachineIdConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface MachineIdConfigRoleDefault2 {} +export interface MumbleConfigRoleServer {} +export interface MumbleConfigRoleServer1 {} +export interface MumbleRoles { + server?: { + config?: MumbleConfigRoleServer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface MumbleConfigRoleServer2 {} +export interface MyceliumConfigRolePeer { + /** + * Add hosted Public nodes + */ + addHostedPublicNodes?: boolean; + /** + * Open the firewall for mycelium + */ + openFirewall?: boolean; +} +export interface MyceliumConfigRolePeer1 { + /** + * Add hosted Public nodes + */ + addHostedPublicNodes?: boolean; + /** + * Open the firewall for mycelium + */ + openFirewall?: boolean; +} +export interface MyceliumRoles { + peer?: { + config?: MyceliumConfigRolePeer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface MyceliumConfigRolePeer2 { + /** + * Add hosted Public nodes + */ + addHostedPublicNodes?: boolean; + /** + * Open the firewall for mycelium + */ + openFirewall?: boolean; +} +export interface PackagesConfigRoleDefault { + /** + * The packages to install on the machine + */ + packages: string[]; +} +export interface PackagesConfigRoleDefault1 { + /** + * The packages to install on the machine + */ + packages: string[]; +} +export interface PackagesRoles { + default?: { + config?: PackagesConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface PackagesConfigRoleDefault2 { + /** + * The packages to install on the machine + */ + packages: string[]; +} +export interface RootPasswordConfigRoleDefault {} +export interface RootPasswordConfigRoleDefault1 {} +export interface RootPasswordRoles { + default?: { + config?: RootPasswordConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface RootPasswordConfigRoleDefault2 {} +export interface SingleDiskConfigRoleDefault { + /** + * The primary disk device to install the system on + */ + device?: null | string; +} +export interface SingleDiskConfigRoleDefault1 { + /** + * The primary disk device to install the system on + */ + device?: null | string; +} +export interface SingleDiskRoles { + default?: { + config?: SingleDiskConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface SingleDiskConfigRoleDefault2 { + /** + * The primary disk device to install the system on + */ + device?: null | string; +} +export interface SshdConfigRoleClient { + certificate: { + /** + * List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate. + */ + searchDomains?: string[]; + }; +} +export interface SshdConfigRoleServer { + certificate: { + /** + * List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate. + */ + searchDomains?: string[]; + }; + hostKeys: { + rsa: { + /** + * Whether to enable Generate RSA host key. + */ + enable?: boolean; + }; + }; +} +export interface SshdConfigRoleClient1 { + certificate: { + /** + * List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate. + */ + searchDomains?: string[]; + }; +} +export interface SshdConfigRoleServer1 { + certificate: { + /** + * List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate. + */ + searchDomains?: string[]; + }; + hostKeys: { + rsa: { + /** + * Whether to enable Generate RSA host key. + */ + enable?: boolean; + }; + }; +} +export interface SshdRoles { + client?: { + config?: SshdConfigRoleClient2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; + server?: { + config?: SshdConfigRoleServer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface SshdConfigRoleClient2 { + certificate: { + /** + * List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate. + */ + searchDomains?: string[]; + }; +} +export interface SshdConfigRoleServer2 { + certificate: { + /** + * List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate. + */ + searchDomains?: string[]; + }; + hostKeys: { + rsa: { + /** + * Whether to enable Generate RSA host key. + */ + enable?: boolean; + }; + }; +} +export interface StateVersionConfigRoleDefault {} +export interface StateVersionConfigRoleDefault1 {} +export interface StateVersionRoles { + default?: { + config?: StateVersionConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface StateVersionConfigRoleDefault2 {} +export interface SyncthingConfigRoleIntroducer { + /** + * Auto accept incoming device requests. + * Should only be used on the introducer. + * + */ + autoAcceptDevices?: boolean; + /** + * Auto share the following Folders by their ID's with introduced devices. + * Should only be used on the introducer. + * + */ + autoShares?: string[]; + /** + * The ID of the machine. + * It is generated automatically by default. + * + */ + id: null | string; + /** + * The introducer for the machine. + * + */ + introducer?: null | string; +} +export interface SyncthingConfigRolePeer { + /** + * Auto accept incoming device requests. + * Should only be used on the introducer. + * + */ + autoAcceptDevices?: boolean; + /** + * Auto share the following Folders by their ID's with introduced devices. + * Should only be used on the introducer. + * + */ + autoShares?: string[]; + /** + * The ID of the machine. + * It is generated automatically by default. + * + */ + id: null | string; + /** + * The introducer for the machine. + * + */ + introducer?: null | string; +} +export interface SyncthingConfigRoleIntroducer1 { + /** + * Auto accept incoming device requests. + * Should only be used on the introducer. + * + */ + autoAcceptDevices?: boolean; + /** + * Auto share the following Folders by their ID's with introduced devices. + * Should only be used on the introducer. + * + */ + autoShares?: string[]; + /** + * The ID of the machine. + * It is generated automatically by default. + * + */ + id: null | string; + /** + * The introducer for the machine. + * + */ + introducer?: null | string; +} +export interface SyncthingConfigRolePeer1 { + /** + * Auto accept incoming device requests. + * Should only be used on the introducer. + * + */ + autoAcceptDevices?: boolean; + /** + * Auto share the following Folders by their ID's with introduced devices. + * Should only be used on the introducer. + * + */ + autoShares?: string[]; + /** + * The ID of the machine. + * It is generated automatically by default. + * + */ + id: null | string; + /** + * The introducer for the machine. + * + */ + introducer?: null | string; +} +export interface SyncthingRoles { + introducer?: { + config?: SyncthingConfigRoleIntroducer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; + peer?: { + config?: SyncthingConfigRolePeer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface SyncthingConfigRoleIntroducer2 { + /** + * Auto accept incoming device requests. + * Should only be used on the introducer. + * + */ + autoAcceptDevices?: boolean; + /** + * Auto share the following Folders by their ID's with introduced devices. + * Should only be used on the introducer. + * + */ + autoShares?: string[]; + /** + * The ID of the machine. + * It is generated automatically by default. + * + */ + id: null | string; + /** + * The introducer for the machine. + * + */ + introducer?: null | string; +} +export interface SyncthingConfigRolePeer2 { + /** + * Auto accept incoming device requests. + * Should only be used on the introducer. + * + */ + autoAcceptDevices?: boolean; + /** + * Auto share the following Folders by their ID's with introduced devices. + * Should only be used on the introducer. + * + */ + autoShares?: string[]; + /** + * The ID of the machine. + * It is generated automatically by default. + * + */ + id: null | string; + /** + * The introducer for the machine. + * + */ + introducer?: null | string; +} +export interface UserPasswordConfigRoleDefault { + /** + * Whether the user should be prompted. + */ + prompt?: boolean; + /** + * The user the password should be generated for. + */ + user: string; +} +export interface UserPasswordConfigRoleDefault1 { + /** + * Whether the user should be prompted. + */ + prompt?: boolean; + /** + * The user the password should be generated for. + */ + user: string; +} +export interface UserPasswordRoles { + default?: { + config?: UserPasswordConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface UserPasswordConfigRoleDefault2 { + /** + * Whether the user should be prompted. + */ + prompt?: boolean; + /** + * The user the password should be generated for. + */ + user: string; +} +export interface WifiConfigRoleDefault {} +export interface WifiConfigRoleDefault1 {} +export interface WifiRoles { + default?: { + config?: WifiConfigRoleDefault2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface WifiConfigRoleDefault2 {} +export interface ZerotierConfigRoleController { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierConfigRoleMoon { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + moon: { + /** + * Make this machine a moon. + * Other machines can join this moon by adding this moon in their config. + * It will be reachable under the given stable endpoints. + * + */ + stableEndpoints: string[]; + }; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierConfigRolePeer { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierConfigRoleController1 { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierConfigRoleMoon1 { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + moon: { + /** + * Make this machine a moon. + * Other machines can join this moon by adding this moon in their config. + * It will be reachable under the given stable endpoints. + * + */ + stableEndpoints: string[]; + }; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierConfigRolePeer1 { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierRoles { + controller?: { + config?: ZerotierConfigRoleController2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; + moon?: { + config?: ZerotierConfigRoleMoon2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; + peer?: { + config?: ZerotierConfigRolePeer2; + /** + * List of additionally imported `.nix` expressions. + * + * Supported types: + * + * - **Strings**: Interpreted relative to the 'directory' passed to buildClan. + * - **Paths**: should be relative to the current file. + * - **Any**: Nix expression must be serializable to JSON. + * + * !!! Note + * **The import only happens if the machine is part of the service or role.** + * + * Other types are passed through to the nixos configuration. + * + * ???+ Example + * To import the `special.nix` file + * + * ``` + * . Clan Directory + * ├── flake.nix + * ... + * └── modules + * ├── special.nix + * └── ... + * ``` + * + * ```nix + * { + * extraModules = [ "modules/special.nix" ]; + * } + * ``` + * + */ + extraModules?: ( + | string + | ( + | boolean + | number + | string + | unknown[] + | { + [k: string]: unknown; + } + | null + ) + )[]; + /** + * List of machines which are part of the role. + * + * The machines are referenced by their `attributeName` in the `inventory.machines` attribute set. + * + * Memberships are declared here to determine which machines are part of the service. + * + * Alternatively, `tags` can be used to determine the membership, more dynamically. + * + */ + machines?: string[]; + /** + * List of tags which are used to determine the membership of the role. + * + * The tags are matched against the `inventory.machines..tags` attribute set. + * If a machine has at least one tag of the role, it is part of the role. + * + */ + tags?: string[]; + }; +} +export interface ZerotierConfigRoleController2 { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierConfigRoleMoon2 { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + moon: { + /** + * Make this machine a moon. + * Other machines can join this moon by adding this moon in their config. + * It will be reachable under the given stable endpoints. + * + */ + stableEndpoints: string[]; + }; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} +export interface ZerotierConfigRolePeer2 { + /** + * Hosts that should be excluded + */ + excludeHosts: string[]; + /** + * Extra zerotier network Ids that should be accepted + */ + networkIds?: string[]; + /** + * Extra zerotier network Ips that should be accepted + */ + networkIps?: string[]; +} diff --git a/pkgs/ui/webview-ui/app/app/api/modules_schemas.json b/pkgs/ui/webview-ui/app/app/api/modules_schemas.json new file mode 100644 index 000000000..35f770fda --- /dev/null +++ b/pkgs/ui/webview-ui/app/app/api/modules_schemas.json @@ -0,0 +1,1064 @@ +{ + "admin": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "allowedKeys": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "type": "string" + }, + "default": {}, + "description": "The allowed public keys for ssh access to the admin user", + "examples": [ + { + "key_1": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." + } + ], + "type": "object" + } + }, + "type": "object", + "title": "admin-config-role-default" + } + }, + "auto-upgrade": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "flake": { + "$exportedModuleInfo": { + "path": ["clan", "auto-upgrade", "flake"] + }, + "description": "Flake reference", + "type": "string" + } + }, + "required": ["flake"], + "type": "object", + "title": "auto-upgrade-config-role-default" + } + }, + "borgbackup": { + "client": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "destinations": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "destinations"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "destinations", ""] + }, + "additionalProperties": false, + "properties": { + "name": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "name" + ] + }, + "default": "\u2039name\u203a", + "description": "the name of the backup job", + "type": "string" + }, + "repo": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "repo" + ] + }, + "description": "the borgbackup repository to backup to", + "type": "string" + }, + "rsh": { + "$exportedModuleInfo": { + "defaultText": "ssh -i ${config.clan.core.vars.generators.borgbackup.files.\"borgbackup.ssh\".path} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null", + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "rsh" + ] + }, + "description": "the rsh to use for the backup", + "type": "string" + } + }, + "required": ["repo", "rsh"], + "type": "object" + }, + "default": {}, + "description": "destinations where the machine should be backuped to\n", + "type": "object" + }, + "exclude": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "default": [], + "description": "Directories/Files to exclude from the backup.\nUse * as a wildcard.\n", + "examples": ["*.pyc"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "title": "borgbackup-config-role-client" + }, + "server": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "directory": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "directory"] + }, + "default": "/var/lib/borgbackup", + "description": "The directory where the borgbackup repositories are stored.\n", + "type": "string" + } + }, + "type": "object", + "title": "borgbackup-config-role-server" + } + }, + "borgbackup-static": {}, + "data-mesher": { + "admin": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": ["192.168.1.1:7946", "192.168.1.2:7946"], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "items": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "hostTTL": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "hostTTL"] + }, + "default": "672h", + "description": "The TTL for hosts in the network, in the form of a Go time.Duration", + "examples": ["24h"], + "type": "string" + }, + "interface": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "interface"] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "port"] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + }, + "tld": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "tld"] + }, + "default": null, + "description": "Top level domain to use for the network", + "type": "string" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-admin" + }, + "peer": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": ["192.168.1.1:7946", "192.168.1.2:7946"], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "items": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "interface"] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "port"] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-peer" + }, + "signer": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": ["192.168.1.1:7946", "192.168.1.2:7946"], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "items": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "interface"] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "port"] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-signer" + } + }, + "deltachat": {}, + "disk-id": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "disk-id-config-role-default" + } + }, + "dyndns": {}, + "ergochat": {}, + "garage": {}, + "golem-provider": {}, + "heisenbridge": {}, + "importer": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "importer-config-role-default" + } + }, + "iwd": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "networks": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks", ""] + }, + "additionalProperties": false, + "properties": { + "AutoConnect": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks", "", "AutoConnect"] + }, + "default": true, + "description": "Automatically try to join this wifi network", + "type": "boolean" + }, + "ssid": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks", "", "ssid"] + }, + "default": "\u2039name\u203a", + "description": "The name of the wifi network", + "type": "string" + } + }, + "type": "object" + }, + "default": {}, + "description": "Wifi networks to predefine", + "type": "object" + } + }, + "type": "object", + "title": "iwd-config-role-default" + } + }, + "localbackup": {}, + "localsend": {}, + "machine-id": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "machine-id-config-role-default" + } + }, + "matrix-synapse": {}, + "moonlight": {}, + "mumble": { + "server": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "mumble-config-role-server" + } + }, + "mycelium": { + "peer": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "addHostedPublicNodes": { + "$exportedModuleInfo": { + "path": ["clan", "mycelium", "addHostedPublicNodes"] + }, + "default": true, + "description": "Add hosted Public nodes", + "type": "boolean" + }, + "openFirewall": { + "$exportedModuleInfo": { + "path": ["clan", "mycelium", "openFirewall"] + }, + "default": true, + "description": "Open the firewall for mycelium", + "type": "boolean" + } + }, + "type": "object", + "title": "mycelium-config-role-peer" + } + }, + "nginx": {}, + "packages": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "packages": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "description": "The packages to install on the machine", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["packages"], + "type": "object", + "title": "packages-config-role-default" + } + }, + "postgresql": {}, + "root-password": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "root-password-config-role-default" + } + }, + "single-disk": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "device": { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "default": null, + "description": "The primary disk device to install the system on", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "type": "string" + } + ] + } + }, + "type": "object", + "title": "single-disk-config-role-default" + } + }, + "sshd": { + "client": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": ["clan", "sshd", "certificate", "searchDomains"] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "sshd", "certificate", "searchDomains"] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": ["certificate"], + "type": "object", + "title": "sshd-config-role-client" + }, + "server": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": ["clan", "sshd", "certificate", "searchDomains"] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "sshd", "certificate", "searchDomains"] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "hostKeys": { + "$exportedModuleInfo": { + "path": ["hostKeys"] + }, + "additionalProperties": false, + "properties": { + "rsa": { + "$exportedModuleInfo": { + "path": ["hostKeys", "rsa"] + }, + "additionalProperties": false, + "properties": { + "enable": { + "$exportedModuleInfo": { + "path": ["clan", "sshd", "hostKeys", "rsa", "enable"] + }, + "default": false, + "description": "Whether to enable Generate RSA host key.", + "examples": [true], + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": ["rsa"], + "type": "object" + } + }, + "required": ["certificate", "hostKeys"], + "type": "object", + "title": "sshd-config-role-server" + } + }, + "state-version": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "state-version-config-role-default" + } + }, + "static-hosts": {}, + "sunshine": {}, + "syncthing": { + "introducer": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoAcceptDevices"] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-introducer" + }, + "peer": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoAcceptDevices"] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-peer" + } + }, + "syncthing-static-peers": {}, + "thelounge": {}, + "trusted-nix-caches": {}, + "user-password": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "prompt": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "prompt"] + }, + "default": true, + "description": "Whether the user should be prompted.", + "examples": [false], + "type": "boolean" + }, + "user": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "user"] + }, + "description": "The user the password should be generated for.", + "examples": ["alice"], + "type": "string" + } + }, + "required": ["user"], + "type": "object", + "title": "user-password-config-role-default" + } + }, + "vaultwarden": {}, + "wifi": { + "default": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "wifi-config-role-default" + } + }, + "xfce": {}, + "zerotier": { + "controller": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-controller" + }, + "moon": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "moon": { + "$exportedModuleInfo": { + "path": ["moon"] + }, + "additionalProperties": false, + "properties": { + "stableEndpoints": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "moon", "stableEndpoints"] + }, + "description": "Make this machine a moon.\nOther machines can join this moon by adding this moon in their config.\nIt will be reachable under the given stable endpoints.\n", + "examples": [ + "[ 1.2.3.4\" \"10.0.0.3/9993\" \"2001:abcd:abcd::3/9993\" ]\n" + ], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "moon", "stableEndpoints"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["stableEndpoints"], + "type": "object" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts", "moon"], + "type": "object", + "title": "zerotier-config-role-moon" + }, + "peer": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-peer" + } + }, + "zerotier-static-peers": {}, + "zt-tcp-relay": {} +} diff --git a/pkgs/ui/webview-ui/app/app/api/schema.json b/pkgs/ui/webview-ui/app/app/api/schema.json new file mode 100644 index 000000000..d178b067c --- /dev/null +++ b/pkgs/ui/webview-ui/app/app/api/schema.json @@ -0,0 +1,10439 @@ +{ + "$exportedModuleInfo": { + "path": [] + }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "machines": { + "$exportedModuleInfo": { + "path": ["machines"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["machines"] + }, + "additionalProperties": false, + "properties": { + "deploy": { + "$exportedModuleInfo": { + "path": ["machines", "deploy"] + }, + "additionalProperties": false, + "properties": { + "targetHost": { + "$exportedModuleInfo": { + "path": ["machines", "deploy", "targetHost"] + }, + "default": null, + "description": "Configuration for the deployment of the machine", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["machines", "deploy", "targetHost"] + }, + "type": "string" + } + ] + } + }, + "type": "object" + }, + "description": { + "$exportedModuleInfo": { + "path": ["machines", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["machines", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["machines", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["machines", "icon"] + }, + "type": "string" + } + ] + }, + "machineClass": { + "$exportedModuleInfo": { + "path": ["machines", "machineClass"] + }, + "default": "nixos", + "description": "The module system that should be used to construct the machine\n\nSet this to `darwin` for macOS machines\n", + "enum": ["nixos", "darwin"] + }, + "name": { + "$exportedModuleInfo": { + "path": ["machines", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + }, + "tags": { + "$exportedModuleInfo": { + "path": ["machines", "tags"] + }, + "default": [], + "description": "List of tags for the machine.\n\nThe machine can be referenced by its tags in `inventory.services`\n\n???+ Example\n ```nix\n inventory.machines.machineA.tags = [ \"tag1\" \"tag2\" ];\n ```\n\n ```nix\n services.borgbackup.\"instance_1\".roles.client.tags = [ \"tag1\" ];\n ```\n\n!!! Note\n Tags can be used to determine the membership of the machine in the services.\n Without changing the service configuration, the machine can be added to a service by adding the correct tags to the machine.\n\n", + "items": { + "$exportedModuleInfo": { + "path": ["machines", "tags"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["deploy"], + "type": "object" + }, + "default": {}, + "description": "Machines in the inventory.\n\nEach machine declared here can be referencd via its `attributeName` by the `inventory.service`s `roles`.\n", + "type": "object" + }, + "meta": { + "$exportedModuleInfo": { + "path": ["meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["meta", "name"] + }, + "description": "Name of the clan.\n\nNeeds to be (globally) unique, as this determines the folder name where the flake gets downloaded to.\n\nShould only contain alphanumeric characters, `_` and `-`.\n", + "examples": ["my_clan"], + "type": "string" + } + }, + "required": ["name"], + "type": "object" + }, + "modules": { + "$exportedModuleInfo": { + "defaultText": "clanModules of clan-core", + "path": ["modules"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["modules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + }, + "description": "A mapping of module names to their path.\n\nEach module can be referenced by its `attributeName` in the `inventory.services` attribute set.\n\n!!! Important\n Each module MUST fulfill the following requirements to be usable with the inventory:\n\n - The module MUST have a `README.md` file with a `description`.\n - The module MUST have at least `features = [ \"inventory\" ]` in the frontmatter section.\n - The module MUST have a subfolder `roles` with at least one `{roleName}.nix` file.\n\n For further information see: [Module Authoring Guide](../../authoring/clanServices/index.md).\n\n???+ example\n ```nix\n buildClan {\n # 1. Add the module to the available inventory modules\n inventory.modules = {\n custom-module = ./modules/my_module;\n };\n # 2. Use the module in the inventory\n inventory.services = {\n custom-module.instance_1 = {\n roles.default.machines = [ \"machineA\" ];\n };\n };\n };\n ```\n", + "type": "object" + }, + "services": { + "type": "object", + "properties": { + "admin": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "admin-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "allowedKeys": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "type": "string" + }, + "default": {}, + "description": "The allowed public keys for ssh access to the admin user", + "examples": [ + { + "key_1": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." + } + ], + "type": "object" + } + }, + "type": "object", + "title": "admin-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "admin-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "allowedKeys": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "type": "string" + }, + "default": {}, + "description": "The allowed public keys for ssh access to the admin user", + "examples": [ + { + "key_1": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." + } + ], + "type": "object" + } + }, + "type": "object", + "title": "admin-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "admin-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "allowedKeys": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "admin", "allowedKeys"] + }, + "type": "string" + }, + "default": {}, + "description": "The allowed public keys for ssh access to the admin user", + "examples": [ + { + "key_1": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." + } + ], + "type": "object" + } + }, + "type": "object", + "title": "admin-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "auto-upgrade": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "auto-upgrade-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "flake": { + "$exportedModuleInfo": { + "path": ["clan", "auto-upgrade", "flake"] + }, + "description": "Flake reference", + "type": "string" + } + }, + "required": ["flake"], + "type": "object", + "title": "auto-upgrade-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "auto-upgrade-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "flake": { + "$exportedModuleInfo": { + "path": ["clan", "auto-upgrade", "flake"] + }, + "description": "Flake reference", + "type": "string" + } + }, + "required": ["flake"], + "type": "object", + "title": "auto-upgrade-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "auto-upgrade-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "flake": { + "$exportedModuleInfo": { + "path": ["clan", "auto-upgrade", "flake"] + }, + "description": "Flake reference", + "type": "string" + } + }, + "required": ["flake"], + "type": "object", + "title": "auto-upgrade-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "borgbackup": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "borgbackup-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "destinations": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "destinations"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "" + ] + }, + "additionalProperties": false, + "properties": { + "name": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "name" + ] + }, + "default": "\u2039name\u203a", + "description": "the name of the backup job", + "type": "string" + }, + "repo": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "repo" + ] + }, + "description": "the borgbackup repository to backup to", + "type": "string" + }, + "rsh": { + "$exportedModuleInfo": { + "defaultText": "ssh -i ${config.clan.core.vars.generators.borgbackup.files.\"borgbackup.ssh\".path} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null", + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "rsh" + ] + }, + "description": "the rsh to use for the backup", + "type": "string" + } + }, + "required": ["repo", "rsh"], + "type": "object" + }, + "default": {}, + "description": "destinations where the machine should be backuped to\n", + "type": "object" + }, + "exclude": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "default": [], + "description": "Directories/Files to exclude from the backup.\nUse * as a wildcard.\n", + "examples": ["*.pyc"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "title": "borgbackup-config-role-client" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "directory": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "directory"] + }, + "default": "/var/lib/borgbackup", + "description": "The directory where the borgbackup repositories are stored.\n", + "type": "string" + } + }, + "type": "object", + "title": "borgbackup-config-role-server" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "borgbackup-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "destinations": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "destinations"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "" + ] + }, + "additionalProperties": false, + "properties": { + "name": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "name" + ] + }, + "default": "\u2039name\u203a", + "description": "the name of the backup job", + "type": "string" + }, + "repo": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "repo" + ] + }, + "description": "the borgbackup repository to backup to", + "type": "string" + }, + "rsh": { + "$exportedModuleInfo": { + "defaultText": "ssh -i ${config.clan.core.vars.generators.borgbackup.files.\"borgbackup.ssh\".path} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null", + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "rsh" + ] + }, + "description": "the rsh to use for the backup", + "type": "string" + } + }, + "required": ["repo", "rsh"], + "type": "object" + }, + "default": {}, + "description": "destinations where the machine should be backuped to\n", + "type": "object" + }, + "exclude": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "default": [], + "description": "Directories/Files to exclude from the backup.\nUse * as a wildcard.\n", + "examples": ["*.pyc"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "title": "borgbackup-config-role-client" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "directory": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "directory"] + }, + "default": "/var/lib/borgbackup", + "description": "The directory where the borgbackup repositories are stored.\n", + "type": "string" + } + }, + "type": "object", + "title": "borgbackup-config-role-server" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "borgbackup-roles", + "type": "object", + "properties": { + "client": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "destinations": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "destinations"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "" + ] + }, + "additionalProperties": false, + "properties": { + "name": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "name" + ] + }, + "default": "\u2039name\u203a", + "description": "the name of the backup job", + "type": "string" + }, + "repo": { + "$exportedModuleInfo": { + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "repo" + ] + }, + "description": "the borgbackup repository to backup to", + "type": "string" + }, + "rsh": { + "$exportedModuleInfo": { + "defaultText": "ssh -i ${config.clan.core.vars.generators.borgbackup.files.\"borgbackup.ssh\".path} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null", + "path": [ + "clan", + "borgbackup", + "destinations", + "", + "rsh" + ] + }, + "description": "the rsh to use for the backup", + "type": "string" + } + }, + "required": ["repo", "rsh"], + "type": "object" + }, + "default": {}, + "description": "destinations where the machine should be backuped to\n", + "type": "object" + }, + "exclude": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "default": [], + "description": "Directories/Files to exclude from the backup.\nUse * as a wildcard.\n", + "examples": ["*.pyc"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "exclude"] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "title": "borgbackup-config-role-client", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + }, + "server": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "directory": { + "$exportedModuleInfo": { + "path": ["clan", "borgbackup", "directory"] + }, + "default": "/var/lib/borgbackup", + "description": "The directory where the borgbackup repositories are stored.\n", + "type": "string" + } + }, + "type": "object", + "title": "borgbackup-config-role-server", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "data-mesher": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "data-mesher-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": ["192.168.1.1:7946", "192.168.1.2:7946"], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "hostTTL": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "hostTTL" + ] + }, + "default": "672h", + "description": "The TTL for hosts in the network, in the form of a Go time.Duration", + "examples": ["24h"], + "type": "string" + }, + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "port"] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + }, + "tld": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "tld"] + }, + "default": null, + "description": "Top level domain to use for the network", + "type": "string" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-admin" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": ["192.168.1.1:7946", "192.168.1.2:7946"], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "port"] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-peer" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": ["192.168.1.1:7946", "192.168.1.2:7946"], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "network", "port"] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-signer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "data-mesher-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": [ + "192.168.1.1:7946", + "192.168.1.2:7946" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "hostTTL": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "hostTTL" + ] + }, + "default": "672h", + "description": "The TTL for hosts in the network, in the form of a Go time.Duration", + "examples": ["24h"], + "type": "string" + }, + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "port" + ] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + }, + "tld": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "tld" + ] + }, + "default": null, + "description": "Top level domain to use for the network", + "type": "string" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-admin" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": [ + "192.168.1.1:7946", + "192.168.1.2:7946" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "port" + ] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-peer" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": [ + "192.168.1.1:7946", + "192.168.1.2:7946" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "port" + ] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-signer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "data-mesher-roles", + "type": "object", + "properties": { + "admin": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": [ + "192.168.1.1:7946", + "192.168.1.2:7946" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "hostTTL": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "hostTTL" + ] + }, + "default": "672h", + "description": "The TTL for hosts in the network, in the form of a Go time.Duration", + "examples": ["24h"], + "type": "string" + }, + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "port" + ] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + }, + "tld": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "tld" + ] + }, + "default": null, + "description": "Top level domain to use for the network", + "type": "string" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-admin", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + }, + "peer": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": [ + "192.168.1.1:7946", + "192.168.1.2:7946" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "port" + ] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-peer", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + }, + "signer": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "bootstrapNodes": { + "$exportedModuleInfo": { + "path": ["clan", "data-mesher", "bootstrapNodes"] + }, + "default": null, + "description": "A list of bootstrap nodes that act as an initial gateway when joining\nthe cluster.\n", + "examples": [ + "192.168.1.1:7946", + "192.168.1.2:7946" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "bootstrapNodes" + ] + }, + "type": "string" + }, + "type": "array" + } + ] + }, + "network": { + "$exportedModuleInfo": { + "path": ["network"] + }, + "additionalProperties": false, + "properties": { + "interface": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "interface" + ] + }, + "description": "The interface over which cluster communication should be performed.\nAll the ip addresses associate with this interface will be part of\nour host claim, including both ipv4 and ipv6.\n\nThis should be set to an internal/VPN interface.\n", + "examples": ["tailscale0"], + "type": "string" + }, + "port": { + "$exportedModuleInfo": { + "path": [ + "clan", + "data-mesher", + "network", + "port" + ] + }, + "default": 7946, + "description": "Port to listen on for cluster communication.\n", + "type": "integer" + } + }, + "required": ["interface"], + "type": "object" + } + }, + "required": ["network"], + "type": "object", + "title": "data-mesher-config-role-signer", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "disk-id": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "disk-id-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "disk-id-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "disk-id-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "disk-id-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "disk-id-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "disk-id-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "importer": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "importer-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "importer-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "importer-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "importer-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "importer-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "importer-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "iwd": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "iwd-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "networks": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks", ""] + }, + "additionalProperties": false, + "properties": { + "AutoConnect": { + "$exportedModuleInfo": { + "path": [ + "clan", + "iwd", + "networks", + "", + "AutoConnect" + ] + }, + "default": true, + "description": "Automatically try to join this wifi network", + "type": "boolean" + }, + "ssid": { + "$exportedModuleInfo": { + "path": [ + "clan", + "iwd", + "networks", + "", + "ssid" + ] + }, + "default": "\u2039name\u203a", + "description": "The name of the wifi network", + "type": "string" + } + }, + "type": "object" + }, + "default": {}, + "description": "Wifi networks to predefine", + "type": "object" + } + }, + "type": "object", + "title": "iwd-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "iwd-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "networks": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks", ""] + }, + "additionalProperties": false, + "properties": { + "AutoConnect": { + "$exportedModuleInfo": { + "path": [ + "clan", + "iwd", + "networks", + "", + "AutoConnect" + ] + }, + "default": true, + "description": "Automatically try to join this wifi network", + "type": "boolean" + }, + "ssid": { + "$exportedModuleInfo": { + "path": [ + "clan", + "iwd", + "networks", + "", + "ssid" + ] + }, + "default": "\u2039name\u203a", + "description": "The name of the wifi network", + "type": "string" + } + }, + "type": "object" + }, + "default": {}, + "description": "Wifi networks to predefine", + "type": "object" + } + }, + "type": "object", + "title": "iwd-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "iwd-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "networks": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["clan", "iwd", "networks", ""] + }, + "additionalProperties": false, + "properties": { + "AutoConnect": { + "$exportedModuleInfo": { + "path": [ + "clan", + "iwd", + "networks", + "", + "AutoConnect" + ] + }, + "default": true, + "description": "Automatically try to join this wifi network", + "type": "boolean" + }, + "ssid": { + "$exportedModuleInfo": { + "path": [ + "clan", + "iwd", + "networks", + "", + "ssid" + ] + }, + "default": "\u2039name\u203a", + "description": "The name of the wifi network", + "type": "string" + } + }, + "type": "object" + }, + "default": {}, + "description": "Wifi networks to predefine", + "type": "object" + } + }, + "type": "object", + "title": "iwd-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "machine-id": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "machine-id-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "machine-id-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "machine-id-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "machine-id-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "machine-id-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "machine-id-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "mumble": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "mumble-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "mumble-config-role-server" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "mumble-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "mumble-config-role-server" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "mumble-roles", + "type": "object", + "properties": { + "server": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "mumble-config-role-server", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "mycelium": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "mycelium-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "addHostedPublicNodes": { + "$exportedModuleInfo": { + "path": ["clan", "mycelium", "addHostedPublicNodes"] + }, + "default": true, + "description": "Add hosted Public nodes", + "type": "boolean" + }, + "openFirewall": { + "$exportedModuleInfo": { + "path": ["clan", "mycelium", "openFirewall"] + }, + "default": true, + "description": "Open the firewall for mycelium", + "type": "boolean" + } + }, + "type": "object", + "title": "mycelium-config-role-peer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "mycelium-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "addHostedPublicNodes": { + "$exportedModuleInfo": { + "path": [ + "clan", + "mycelium", + "addHostedPublicNodes" + ] + }, + "default": true, + "description": "Add hosted Public nodes", + "type": "boolean" + }, + "openFirewall": { + "$exportedModuleInfo": { + "path": ["clan", "mycelium", "openFirewall"] + }, + "default": true, + "description": "Open the firewall for mycelium", + "type": "boolean" + } + }, + "type": "object", + "title": "mycelium-config-role-peer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "mycelium-roles", + "type": "object", + "properties": { + "peer": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "addHostedPublicNodes": { + "$exportedModuleInfo": { + "path": [ + "clan", + "mycelium", + "addHostedPublicNodes" + ] + }, + "default": true, + "description": "Add hosted Public nodes", + "type": "boolean" + }, + "openFirewall": { + "$exportedModuleInfo": { + "path": ["clan", "mycelium", "openFirewall"] + }, + "default": true, + "description": "Open the firewall for mycelium", + "type": "boolean" + } + }, + "type": "object", + "title": "mycelium-config-role-peer", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "packages": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "packages-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "packages": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "description": "The packages to install on the machine", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["packages"], + "type": "object", + "title": "packages-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "packages-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "packages": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "description": "The packages to install on the machine", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["packages"], + "type": "object", + "title": "packages-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "packages-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "packages": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "description": "The packages to install on the machine", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "packages", "packages"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["packages"], + "type": "object", + "title": "packages-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "root-password": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "root-password-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "root-password-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "root-password-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "root-password-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "root-password-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "root-password-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "single-disk": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "single-disk-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "device": { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "default": null, + "description": "The primary disk device to install the system on", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "type": "string" + } + ] + } + }, + "type": "object", + "title": "single-disk-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "single-disk-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "device": { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "default": null, + "description": "The primary disk device to install the system on", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "type": "string" + } + ] + } + }, + "type": "object", + "title": "single-disk-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "single-disk-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "device": { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "default": null, + "description": "The primary disk device to install the system on", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "single-disk", "device"] + }, + "type": "string" + } + ] + } + }, + "type": "object", + "title": "single-disk-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "sshd": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "sshd-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": ["certificate"], + "type": "object", + "title": "sshd-config-role-client" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "hostKeys": { + "$exportedModuleInfo": { + "path": ["hostKeys"] + }, + "additionalProperties": false, + "properties": { + "rsa": { + "$exportedModuleInfo": { + "path": ["hostKeys", "rsa"] + }, + "additionalProperties": false, + "properties": { + "enable": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "hostKeys", + "rsa", + "enable" + ] + }, + "default": false, + "description": "Whether to enable Generate RSA host key.", + "examples": [true], + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": ["rsa"], + "type": "object" + } + }, + "required": ["certificate", "hostKeys"], + "type": "object", + "title": "sshd-config-role-server" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "sshd-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": ["certificate"], + "type": "object", + "title": "sshd-config-role-client" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "hostKeys": { + "$exportedModuleInfo": { + "path": ["hostKeys"] + }, + "additionalProperties": false, + "properties": { + "rsa": { + "$exportedModuleInfo": { + "path": ["hostKeys", "rsa"] + }, + "additionalProperties": false, + "properties": { + "enable": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "hostKeys", + "rsa", + "enable" + ] + }, + "default": false, + "description": "Whether to enable Generate RSA host key.", + "examples": [true], + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": ["rsa"], + "type": "object" + } + }, + "required": ["certificate", "hostKeys"], + "type": "object", + "title": "sshd-config-role-server" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "sshd-roles", + "type": "object", + "properties": { + "client": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": ["certificate"], + "type": "object", + "title": "sshd-config-role-client", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + }, + "server": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "certificate": { + "$exportedModuleInfo": { + "path": ["certificate"] + }, + "additionalProperties": false, + "properties": { + "searchDomains": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "default": [], + "description": "List of domains to include in the certificate. This option will prepend the machine name in front of each domain before adding it to the certificate.", + "examples": ["mydomain.com"], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "certificate", + "searchDomains" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "hostKeys": { + "$exportedModuleInfo": { + "path": ["hostKeys"] + }, + "additionalProperties": false, + "properties": { + "rsa": { + "$exportedModuleInfo": { + "path": ["hostKeys", "rsa"] + }, + "additionalProperties": false, + "properties": { + "enable": { + "$exportedModuleInfo": { + "path": [ + "clan", + "sshd", + "hostKeys", + "rsa", + "enable" + ] + }, + "default": false, + "description": "Whether to enable Generate RSA host key.", + "examples": [true], + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": ["rsa"], + "type": "object" + } + }, + "required": ["certificate", "hostKeys"], + "type": "object", + "title": "sshd-config-role-server", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "state-version": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "state-version-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "state-version-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "state-version-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "state-version-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "state-version-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "state-version-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "syncthing": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "syncthing-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoAcceptDevices"] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-introducer" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoAcceptDevices"] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-peer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "syncthing-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": [ + "clan", + "syncthing", + "autoAcceptDevices" + ] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-introducer" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": [ + "clan", + "syncthing", + "autoAcceptDevices" + ] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-peer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "syncthing-roles", + "type": "object", + "properties": { + "introducer": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoAcceptDevices"] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-introducer", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + }, + "peer": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "autoAcceptDevices": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoAcceptDevices"] + }, + "default": false, + "description": "Auto accept incoming device requests.\nShould only be used on the introducer.\n", + "type": "boolean" + }, + "autoShares": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "default": [], + "description": "Auto share the following Folders by their ID's with introduced devices.\nShould only be used on the introducer.\n", + "examples": ["folder1", "folder2"], + "items": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "autoShares"] + }, + "type": "string" + }, + "type": "array" + }, + "id": { + "$exportedModuleInfo": { + "defaultText": "config.clan.core.vars.generators.syncthing.files.\"id\".value", + "path": ["clan", "syncthing", "id"] + }, + "description": "The ID of the machine.\nIt is generated automatically by default.\n", + "examples": [ + "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS" + ], + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "id"] + }, + "type": "string" + } + ] + }, + "introducer": { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "default": null, + "description": "The introducer for the machine.\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["clan", "syncthing", "introducer"] + }, + "type": "string" + } + ] + } + }, + "required": ["id"], + "type": "object", + "title": "syncthing-config-role-peer", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "user-password": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "user-password-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "prompt": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "prompt"] + }, + "default": true, + "description": "Whether the user should be prompted.", + "examples": [false], + "type": "boolean" + }, + "user": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "user"] + }, + "description": "The user the password should be generated for.", + "examples": ["alice"], + "type": "string" + } + }, + "required": ["user"], + "type": "object", + "title": "user-password-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "user-password-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "prompt": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "prompt"] + }, + "default": true, + "description": "Whether the user should be prompted.", + "examples": [false], + "type": "boolean" + }, + "user": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "user"] + }, + "description": "The user the password should be generated for.", + "examples": ["alice"], + "type": "string" + } + }, + "required": ["user"], + "type": "object", + "title": "user-password-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "user-password-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "prompt": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "prompt"] + }, + "default": true, + "description": "Whether the user should be prompted.", + "examples": [false], + "type": "boolean" + }, + "user": { + "$exportedModuleInfo": { + "path": ["clan", "user-password", "user"] + }, + "description": "The user the password should be generated for.", + "examples": ["alice"], + "type": "string" + } + }, + "required": ["user"], + "type": "object", + "title": "user-password-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "wifi": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "wifi-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "wifi-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "wifi-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "wifi-config-role-default" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "wifi-roles", + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": {}, + "type": "object", + "title": "wifi-config-role-default", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + }, + "zerotier": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "title": "zerotier-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-controller" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "moon": { + "$exportedModuleInfo": { + "path": ["moon"] + }, + "additionalProperties": false, + "properties": { + "stableEndpoints": { + "$exportedModuleInfo": { + "path": [ + "clan", + "zerotier", + "moon", + "stableEndpoints" + ] + }, + "description": "Make this machine a moon.\nOther machines can join this moon by adding this moon in their config.\nIt will be reachable under the given stable endpoints.\n", + "examples": [ + "[ 1.2.3.4\" \"10.0.0.3/9993\" \"2001:abcd:abcd::3/9993\" ]\n" + ], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "zerotier", + "moon", + "stableEndpoints" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["stableEndpoints"], + "type": "object" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts", "moon"], + "type": "object", + "title": "zerotier-config-role-moon" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-peer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "enabled": { + "$exportedModuleInfo": { + "path": ["services", "", "enabled"] + }, + "default": true, + "description": "Enable or disable the complete service.\n\nIf the service is disabled, it will not be added to any machine.\n\n!!! Note\n This flag is primarily used to temporarily disable a service.\n I.e. A 'backup service' without any 'server' might be incomplete and would cause failure if enabled.\n", + "type": "boolean" + }, + "extraModules": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "extraModules"] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "config": { + "title": "zerotier-config", + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-controller" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "moon": { + "$exportedModuleInfo": { + "path": ["moon"] + }, + "additionalProperties": false, + "properties": { + "stableEndpoints": { + "$exportedModuleInfo": { + "path": [ + "clan", + "zerotier", + "moon", + "stableEndpoints" + ] + }, + "description": "Make this machine a moon.\nOther machines can join this moon by adding this moon in their config.\nIt will be reachable under the given stable endpoints.\n", + "examples": [ + "[ 1.2.3.4\" \"10.0.0.3/9993\" \"2001:abcd:abcd::3/9993\" ]\n" + ], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "zerotier", + "moon", + "stableEndpoints" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["stableEndpoints"], + "type": "object" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts", "moon"], + "type": "object", + "title": "zerotier-config-role-moon" + }, + { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-peer" + } + ], + "type": "object", + "default": {}, + "additionalProperties": false + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "machines", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + } + } + } + }, + "meta": { + "$exportedModuleInfo": { + "path": ["services", "", "meta"] + }, + "additionalProperties": false, + "properties": { + "description": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "default": null, + "description": "Optional freeform description\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "description"] + }, + "type": "string" + } + ] + }, + "icon": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "default": null, + "description": "Under construction, will be used for the UI\n", + "oneOf": [ + { + "type": "null" + }, + { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "icon"] + }, + "type": "string" + } + ] + }, + "name": { + "$exportedModuleInfo": { + "path": ["services", "", "meta", "name"] + }, + "default": "\u2039name\u203a", + "description": "Name of the machine or service\n", + "type": "string" + } + }, + "type": "object" + }, + "roles": { + "title": "zerotier-roles", + "type": "object", + "properties": { + "controller": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-controller", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + }, + "moon": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "moon": { + "$exportedModuleInfo": { + "path": ["moon"] + }, + "additionalProperties": false, + "properties": { + "stableEndpoints": { + "$exportedModuleInfo": { + "path": [ + "clan", + "zerotier", + "moon", + "stableEndpoints" + ] + }, + "description": "Make this machine a moon.\nOther machines can join this moon by adding this moon in their config.\nIt will be reachable under the given stable endpoints.\n", + "examples": [ + "[ 1.2.3.4\" \"10.0.0.3/9993\" \"2001:abcd:abcd::3/9993\" ]\n" + ], + "items": { + "$exportedModuleInfo": { + "path": [ + "clan", + "zerotier", + "moon", + "stableEndpoints" + ] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["stableEndpoints"], + "type": "object" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts", "moon"], + "type": "object", + "title": "zerotier-config-role-moon", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + }, + "peer": { + "type": "object", + "additionalProperties": false, + "properties": { + "config": { + "$exportedModuleInfo": { + "path": [] + }, + "additionalProperties": false, + "properties": { + "excludeHosts": { + "$exportedModuleInfo": { + "defaultText": { + "_type": "literalExpression", + "text": "[ config.clan.core.settings.machine.name ]" + }, + "path": ["clan", "zerotier", "excludeHosts"] + }, + "description": "Hosts that should be excluded", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "excludeHosts"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIds": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "default": [], + "description": "Extra zerotier network Ids that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIds"] + }, + "type": "string" + }, + "type": "array" + }, + "networkIps": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "default": [], + "description": "Extra zerotier network Ips that should be accepted", + "items": { + "$exportedModuleInfo": { + "path": ["clan", "zerotier", "networkIps"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["excludeHosts"], + "type": "object", + "title": "zerotier-config-role-peer", + "default": {} + }, + "extraModules": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "default": [], + "description": "List of additionally imported `.nix` expressions.\n\nSupported types:\n\n- **Strings**: Interpreted relative to the 'directory' passed to buildClan.\n- **Paths**: should be relative to the current file.\n- **Any**: Nix expression must be serializable to JSON.\n\n!!! Note\n **The import only happens if the machine is part of the service or role.**\n\nOther types are passed through to the nixos configuration.\n\n???+ Example\n To import the `special.nix` file\n\n ```\n . Clan Directory\n \u251c\u2500\u2500 flake.nix\n ...\n \u2514\u2500\u2500 modules\n \u251c\u2500\u2500 special.nix\n \u2514\u2500\u2500 ...\n ```\n\n ```nix\n {\n extraModules = [ \"modules/special.nix\" ];\n }\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "oneOf": [ + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": "string" + }, + { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "extraModules" + ] + }, + "type": [ + "boolean", + "integer", + "number", + "string", + "array", + "object", + "null" + ] + } + ] + }, + "type": "array" + }, + "machines": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "default": [], + "description": "List of machines which are part of the role.\n\nThe machines are referenced by their `attributeName` in the `inventory.machines` attribute set.\n\nMemberships are declared here to determine which machines are part of the service.\n\nAlternatively, `tags` can be used to determine the membership, more dynamically.\n", + "examples": ["machineA"], + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "machines" + ] + }, + "type": "string" + }, + "type": "array" + }, + "tags": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "default": [], + "description": "List of tags which are used to determine the membership of the role.\n\nThe tags are matched against the `inventory.machines..tags` attribute set.\nIf a machine has at least one tag of the role, it is part of the role.\n", + "items": { + "$exportedModuleInfo": { + "path": [ + "services", + "", + "roles", + "", + "tags" + ] + }, + "type": "string" + }, + "type": "array" + } + } + } + }, + "additionalProperties": false + } + } + } + } + }, + "additionalProperties": false + }, + "tags": { + "$exportedModuleInfo": { + "path": ["tags"] + }, + "additionalProperties": { + "$exportedModuleInfo": { + "path": ["tags"] + }, + "items": { + "$exportedModuleInfo": { + "path": ["tags"] + }, + "type": "string" + }, + "type": "array" + }, + "default": {}, + "description": "Tags of the inventory are used to group machines together.\n\nIt is recommended to use [`machine.tags`](#inventory.machines.tags) to define the tags of the machines.\n\nThis can be used to define custom tags that are either statically set or dynamically computed.\n\n#### Static Tags\n\n???+ example \"Static Tag Example\"\n ```nix\n inventory.tags = {\n foo = [ \"machineA\" \"machineB\" ];\n };\n ```\n\n The tag `foo` will always be added to `machineA` and `machineB`.\n\n#### Dynamic Tags\n\nIt is possible to compute tags based on the machines properties or based on other tags.\n\n!!! danger\n This is a powerful feature and should be used with caution.\n\n It is possible to cause infinite recursion by computing tags based on the machines properties or based on other tags.\n\n???+ example \"Dynamic Tag Example\"\n\n allButFoo is a computed tag. It will be added to all machines except 'foo'\n\n `all` is a predefined tag. See the docs of [`tags.all`](#inventory.tags.all).\n\n ```nix\n # inventory.tags \u2193 \u2193 inventory.machines\n inventory.tags = {config, machines...}: {\n # \u2193\u2193\u2193 The \"all\" tag\n allButFoo = builtins.filter (name: name != \"foo\") config.all;\n };\n ```\n\n!!! warning\n Do NOT compute `tags` from `machine.tags` this will cause infinite recursion.\n", + "properties": { + "all": { + "$exportedModuleInfo": { + "defaultText": "[ ]", + "path": ["tags", "all"] + }, + "description": "!!! example \"Predefined Tag\"\n\n Will be added to all machines\n\n ```nix\n inventory.machines.machineA.tags = [ \"all\" ];\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["tags", "all"] + }, + "type": "string" + }, + "type": "array" + }, + "darwin": { + "$exportedModuleInfo": { + "defaultText": "[ ]", + "path": ["tags", "darwin"] + }, + "description": "!!! example \"Predefined Tag\"\n\n Will be added to all machines that set `machineClass = \"darwin\"`\n\n ```nix\n inventory.machines.machineA.tags = [ \"darwin\" ];\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["tags", "darwin"] + }, + "type": "string" + }, + "type": "array" + }, + "nixos": { + "$exportedModuleInfo": { + "defaultText": "[ ]", + "path": ["tags", "nixos"] + }, + "description": "!!! example \"Predefined Tag\"\n\n Will be added to all machines that set `machineClass = \"nixos\"`\n\n ```nix\n inventory.machines.machineA.tags = [ \"nixos\" ];\n ```\n", + "items": { + "$exportedModuleInfo": { + "path": ["tags", "nixos"] + }, + "type": "string" + }, + "type": "array" + } + }, + "required": ["all", "darwin", "nixos"], + "type": "object" + } + }, + "required": ["meta", "modules"], + "type": "object" +} diff --git a/pkgs/webview-ui/app/eslint.config.mjs b/pkgs/ui/webview-ui/app/eslint.config.mjs similarity index 100% rename from pkgs/webview-ui/app/eslint.config.mjs rename to pkgs/ui/webview-ui/app/eslint.config.mjs diff --git a/pkgs/webview-ui/app/gtk.webview.js b/pkgs/ui/webview-ui/app/gtk.webview.js similarity index 100% rename from pkgs/webview-ui/app/gtk.webview.js rename to pkgs/ui/webview-ui/app/gtk.webview.js diff --git a/pkgs/webview-ui/app/icons/arrow-bottom.svg b/pkgs/ui/webview-ui/app/icons/arrow-bottom.svg similarity index 100% rename from pkgs/webview-ui/app/icons/arrow-bottom.svg rename to pkgs/ui/webview-ui/app/icons/arrow-bottom.svg diff --git a/pkgs/webview-ui/app/icons/arrow-left.svg b/pkgs/ui/webview-ui/app/icons/arrow-left.svg similarity index 100% rename from pkgs/webview-ui/app/icons/arrow-left.svg rename to pkgs/ui/webview-ui/app/icons/arrow-left.svg diff --git a/pkgs/webview-ui/app/icons/arrow-right.svg b/pkgs/ui/webview-ui/app/icons/arrow-right.svg similarity index 100% rename from pkgs/webview-ui/app/icons/arrow-right.svg rename to pkgs/ui/webview-ui/app/icons/arrow-right.svg diff --git a/pkgs/webview-ui/app/icons/arrow-top.svg b/pkgs/ui/webview-ui/app/icons/arrow-top.svg similarity index 100% rename from pkgs/webview-ui/app/icons/arrow-top.svg rename to pkgs/ui/webview-ui/app/icons/arrow-top.svg diff --git a/pkgs/webview-ui/app/icons/attention.svg b/pkgs/ui/webview-ui/app/icons/attention.svg similarity index 100% rename from pkgs/webview-ui/app/icons/attention.svg rename to pkgs/ui/webview-ui/app/icons/attention.svg diff --git a/pkgs/webview-ui/app/icons/caret-down.svg b/pkgs/ui/webview-ui/app/icons/caret-down.svg similarity index 100% rename from pkgs/webview-ui/app/icons/caret-down.svg rename to pkgs/ui/webview-ui/app/icons/caret-down.svg diff --git a/pkgs/webview-ui/app/icons/caret-left.svg b/pkgs/ui/webview-ui/app/icons/caret-left.svg similarity index 100% rename from pkgs/webview-ui/app/icons/caret-left.svg rename to pkgs/ui/webview-ui/app/icons/caret-left.svg diff --git a/pkgs/webview-ui/app/icons/caret-right.svg b/pkgs/ui/webview-ui/app/icons/caret-right.svg similarity index 100% rename from pkgs/webview-ui/app/icons/caret-right.svg rename to pkgs/ui/webview-ui/app/icons/caret-right.svg diff --git a/pkgs/webview-ui/app/icons/caret-up.svg b/pkgs/ui/webview-ui/app/icons/caret-up.svg similarity index 100% rename from pkgs/webview-ui/app/icons/caret-up.svg rename to pkgs/ui/webview-ui/app/icons/caret-up.svg diff --git a/pkgs/webview-ui/app/icons/checkmark.svg b/pkgs/ui/webview-ui/app/icons/checkmark.svg similarity index 100% rename from pkgs/webview-ui/app/icons/checkmark.svg rename to pkgs/ui/webview-ui/app/icons/checkmark.svg diff --git a/pkgs/webview-ui/app/icons/clan-icon.svg b/pkgs/ui/webview-ui/app/icons/clan-icon.svg similarity index 100% rename from pkgs/webview-ui/app/icons/clan-icon.svg rename to pkgs/ui/webview-ui/app/icons/clan-icon.svg diff --git a/pkgs/webview-ui/app/icons/clan-logo.svg b/pkgs/ui/webview-ui/app/icons/clan-logo.svg similarity index 100% rename from pkgs/webview-ui/app/icons/clan-logo.svg rename to pkgs/ui/webview-ui/app/icons/clan-logo.svg diff --git a/pkgs/webview-ui/app/icons/close.svg b/pkgs/ui/webview-ui/app/icons/close.svg similarity index 100% rename from pkgs/webview-ui/app/icons/close.svg rename to pkgs/ui/webview-ui/app/icons/close.svg diff --git a/pkgs/webview-ui/app/icons/download.svg b/pkgs/ui/webview-ui/app/icons/download.svg similarity index 100% rename from pkgs/webview-ui/app/icons/download.svg rename to pkgs/ui/webview-ui/app/icons/download.svg diff --git a/pkgs/webview-ui/app/icons/edit.svg b/pkgs/ui/webview-ui/app/icons/edit.svg similarity index 100% rename from pkgs/webview-ui/app/icons/edit.svg rename to pkgs/ui/webview-ui/app/icons/edit.svg diff --git a/pkgs/webview-ui/app/icons/expand.svg b/pkgs/ui/webview-ui/app/icons/expand.svg similarity index 100% rename from pkgs/webview-ui/app/icons/expand.svg rename to pkgs/ui/webview-ui/app/icons/expand.svg diff --git a/pkgs/webview-ui/app/icons/eye-close.svg b/pkgs/ui/webview-ui/app/icons/eye-close.svg similarity index 100% rename from pkgs/webview-ui/app/icons/eye-close.svg rename to pkgs/ui/webview-ui/app/icons/eye-close.svg diff --git a/pkgs/webview-ui/app/icons/eye-open.svg b/pkgs/ui/webview-ui/app/icons/eye-open.svg similarity index 100% rename from pkgs/webview-ui/app/icons/eye-open.svg rename to pkgs/ui/webview-ui/app/icons/eye-open.svg diff --git a/pkgs/webview-ui/app/icons/filter.svg b/pkgs/ui/webview-ui/app/icons/filter.svg similarity index 100% rename from pkgs/webview-ui/app/icons/filter.svg rename to pkgs/ui/webview-ui/app/icons/filter.svg diff --git a/pkgs/webview-ui/app/icons/flash.svg b/pkgs/ui/webview-ui/app/icons/flash.svg similarity index 100% rename from pkgs/webview-ui/app/icons/flash.svg rename to pkgs/ui/webview-ui/app/icons/flash.svg diff --git a/pkgs/webview-ui/app/icons/folder.svg b/pkgs/ui/webview-ui/app/icons/folder.svg similarity index 100% rename from pkgs/webview-ui/app/icons/folder.svg rename to pkgs/ui/webview-ui/app/icons/folder.svg diff --git a/pkgs/webview-ui/app/icons/grid.svg b/pkgs/ui/webview-ui/app/icons/grid.svg similarity index 100% rename from pkgs/webview-ui/app/icons/grid.svg rename to pkgs/ui/webview-ui/app/icons/grid.svg diff --git a/pkgs/webview-ui/app/icons/info.svg b/pkgs/ui/webview-ui/app/icons/info.svg similarity index 100% rename from pkgs/webview-ui/app/icons/info.svg rename to pkgs/ui/webview-ui/app/icons/info.svg diff --git a/pkgs/webview-ui/app/icons/list.svg b/pkgs/ui/webview-ui/app/icons/list.svg similarity index 100% rename from pkgs/webview-ui/app/icons/list.svg rename to pkgs/ui/webview-ui/app/icons/list.svg diff --git a/pkgs/webview-ui/app/icons/load.svg b/pkgs/ui/webview-ui/app/icons/load.svg similarity index 100% rename from pkgs/webview-ui/app/icons/load.svg rename to pkgs/ui/webview-ui/app/icons/load.svg diff --git a/pkgs/webview-ui/app/icons/more.svg b/pkgs/ui/webview-ui/app/icons/more.svg similarity index 100% rename from pkgs/webview-ui/app/icons/more.svg rename to pkgs/ui/webview-ui/app/icons/more.svg diff --git a/pkgs/webview-ui/app/icons/paperclip.svg b/pkgs/ui/webview-ui/app/icons/paperclip.svg similarity index 100% rename from pkgs/webview-ui/app/icons/paperclip.svg rename to pkgs/ui/webview-ui/app/icons/paperclip.svg diff --git a/pkgs/webview-ui/app/icons/plus.svg b/pkgs/ui/webview-ui/app/icons/plus.svg similarity index 100% rename from pkgs/webview-ui/app/icons/plus.svg rename to pkgs/ui/webview-ui/app/icons/plus.svg diff --git a/pkgs/webview-ui/app/icons/reload.svg b/pkgs/ui/webview-ui/app/icons/reload.svg similarity index 100% rename from pkgs/webview-ui/app/icons/reload.svg rename to pkgs/ui/webview-ui/app/icons/reload.svg diff --git a/pkgs/webview-ui/app/icons/report.svg b/pkgs/ui/webview-ui/app/icons/report.svg similarity index 100% rename from pkgs/webview-ui/app/icons/report.svg rename to pkgs/ui/webview-ui/app/icons/report.svg diff --git a/pkgs/webview-ui/app/icons/search.svg b/pkgs/ui/webview-ui/app/icons/search.svg similarity index 100% rename from pkgs/webview-ui/app/icons/search.svg rename to pkgs/ui/webview-ui/app/icons/search.svg diff --git a/pkgs/webview-ui/app/icons/settings.svg b/pkgs/ui/webview-ui/app/icons/settings.svg similarity index 100% rename from pkgs/webview-ui/app/icons/settings.svg rename to pkgs/ui/webview-ui/app/icons/settings.svg diff --git a/pkgs/webview-ui/app/icons/trash.svg b/pkgs/ui/webview-ui/app/icons/trash.svg similarity index 100% rename from pkgs/webview-ui/app/icons/trash.svg rename to pkgs/ui/webview-ui/app/icons/trash.svg diff --git a/pkgs/webview-ui/app/icons/update.svg b/pkgs/ui/webview-ui/app/icons/update.svg similarity index 100% rename from pkgs/webview-ui/app/icons/update.svg rename to pkgs/ui/webview-ui/app/icons/update.svg diff --git a/pkgs/webview-ui/app/icons/warning.svg b/pkgs/ui/webview-ui/app/icons/warning.svg similarity index 100% rename from pkgs/webview-ui/app/icons/warning.svg rename to pkgs/ui/webview-ui/app/icons/warning.svg diff --git a/pkgs/webview-ui/app/index.html b/pkgs/ui/webview-ui/app/index.html similarity index 100% rename from pkgs/webview-ui/app/index.html rename to pkgs/ui/webview-ui/app/index.html diff --git a/pkgs/webview-ui/app/package-lock.json b/pkgs/ui/webview-ui/app/package-lock.json similarity index 100% rename from pkgs/webview-ui/app/package-lock.json rename to pkgs/ui/webview-ui/app/package-lock.json diff --git a/pkgs/webview-ui/app/package.json b/pkgs/ui/webview-ui/app/package.json similarity index 100% rename from pkgs/webview-ui/app/package.json rename to pkgs/ui/webview-ui/app/package.json diff --git a/pkgs/webview-ui/app/postcss.config.js b/pkgs/ui/webview-ui/app/postcss.config.js similarity index 100% rename from pkgs/webview-ui/app/postcss.config.js rename to pkgs/ui/webview-ui/app/postcss.config.js diff --git a/pkgs/webview-ui/app/prettier.config.js b/pkgs/ui/webview-ui/app/prettier.config.js similarity index 100% rename from pkgs/webview-ui/app/prettier.config.js rename to pkgs/ui/webview-ui/app/prettier.config.js diff --git a/pkgs/webview-ui/app/src/App.tsx b/pkgs/ui/webview-ui/app/src/App.tsx similarity index 100% rename from pkgs/webview-ui/app/src/App.tsx rename to pkgs/ui/webview-ui/app/src/App.tsx diff --git a/pkgs/webview-ui/app/src/Form/base/index.tsx b/pkgs/ui/webview-ui/app/src/Form/base/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/base/index.tsx rename to pkgs/ui/webview-ui/app/src/Form/base/index.tsx diff --git a/pkgs/webview-ui/app/src/Form/base/label.tsx b/pkgs/ui/webview-ui/app/src/Form/base/label.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/base/label.tsx rename to pkgs/ui/webview-ui/app/src/Form/base/label.tsx diff --git a/pkgs/webview-ui/app/src/Form/fields/FormSection.tsx b/pkgs/ui/webview-ui/app/src/Form/fields/FormSection.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/fields/FormSection.tsx rename to pkgs/ui/webview-ui/app/src/Form/fields/FormSection.tsx diff --git a/pkgs/webview-ui/app/src/Form/fields/Select.tsx b/pkgs/ui/webview-ui/app/src/Form/fields/Select.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/fields/Select.tsx rename to pkgs/ui/webview-ui/app/src/Form/fields/Select.tsx diff --git a/pkgs/webview-ui/app/src/Form/fields/TextInput.tsx b/pkgs/ui/webview-ui/app/src/Form/fields/TextInput.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/fields/TextInput.tsx rename to pkgs/ui/webview-ui/app/src/Form/fields/TextInput.tsx diff --git a/pkgs/webview-ui/app/src/Form/fields/index.ts b/pkgs/ui/webview-ui/app/src/Form/fields/index.ts similarity index 100% rename from pkgs/webview-ui/app/src/Form/fields/index.ts rename to pkgs/ui/webview-ui/app/src/Form/fields/index.ts diff --git a/pkgs/webview-ui/app/src/Form/fields/layout.tsx b/pkgs/ui/webview-ui/app/src/Form/fields/layout.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/fields/layout.tsx rename to pkgs/ui/webview-ui/app/src/Form/fields/layout.tsx diff --git a/pkgs/webview-ui/app/src/Form/fieldset/index.tsx b/pkgs/ui/webview-ui/app/src/Form/fieldset/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/fieldset/index.tsx rename to pkgs/ui/webview-ui/app/src/Form/fieldset/index.tsx diff --git a/pkgs/webview-ui/app/src/Form/form/index.tsx b/pkgs/ui/webview-ui/app/src/Form/form/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/Form/form/index.tsx rename to pkgs/ui/webview-ui/app/src/Form/form/index.tsx diff --git a/pkgs/webview-ui/app/src/api/index.tsx b/pkgs/ui/webview-ui/app/src/api/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/api/index.tsx rename to pkgs/ui/webview-ui/app/src/api/index.tsx diff --git a/pkgs/webview-ui/app/src/api/inventory.ts b/pkgs/ui/webview-ui/app/src/api/inventory.ts similarity index 100% rename from pkgs/webview-ui/app/src/api/inventory.ts rename to pkgs/ui/webview-ui/app/src/api/inventory.ts diff --git a/pkgs/webview-ui/app/src/api/wifi.ts b/pkgs/ui/webview-ui/app/src/api/wifi.ts similarity index 100% rename from pkgs/webview-ui/app/src/api/wifi.ts rename to pkgs/ui/webview-ui/app/src/api/wifi.ts diff --git a/pkgs/webview-ui/app/src/api_test.tsx b/pkgs/ui/webview-ui/app/src/api_test.tsx similarity index 100% rename from pkgs/webview-ui/app/src/api_test.tsx rename to pkgs/ui/webview-ui/app/src/api_test.tsx diff --git a/pkgs/webview-ui/app/src/components/BackButton.tsx b/pkgs/ui/webview-ui/app/src/components/BackButton.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/BackButton.tsx rename to pkgs/ui/webview-ui/app/src/components/BackButton.tsx diff --git a/pkgs/webview-ui/app/src/components/FileInput.tsx b/pkgs/ui/webview-ui/app/src/components/FileInput.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/FileInput.tsx rename to pkgs/ui/webview-ui/app/src/components/FileInput.tsx diff --git a/pkgs/webview-ui/app/src/components/Helpers/List.tsx b/pkgs/ui/webview-ui/app/src/components/Helpers/List.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Helpers/List.tsx rename to pkgs/ui/webview-ui/app/src/components/Helpers/List.tsx diff --git a/pkgs/webview-ui/app/src/components/Helpers/index.tsx b/pkgs/ui/webview-ui/app/src/components/Helpers/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Helpers/index.tsx rename to pkgs/ui/webview-ui/app/src/components/Helpers/index.tsx diff --git a/pkgs/webview-ui/app/src/components/Menu.tsx b/pkgs/ui/webview-ui/app/src/components/Menu.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Menu.tsx rename to pkgs/ui/webview-ui/app/src/components/Menu.tsx diff --git a/pkgs/webview-ui/app/src/components/SelectInput.tsx b/pkgs/ui/webview-ui/app/src/components/SelectInput.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/SelectInput.tsx rename to pkgs/ui/webview-ui/app/src/components/SelectInput.tsx diff --git a/pkgs/webview-ui/app/src/components/Sidebar/SidebarFlyout/index.tsx b/pkgs/ui/webview-ui/app/src/components/Sidebar/SidebarFlyout/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/SidebarFlyout/index.tsx rename to pkgs/ui/webview-ui/app/src/components/Sidebar/SidebarFlyout/index.tsx diff --git a/pkgs/webview-ui/app/src/components/Sidebar/SidebarHeader.tsx b/pkgs/ui/webview-ui/app/src/components/Sidebar/SidebarHeader.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/SidebarHeader.tsx rename to pkgs/ui/webview-ui/app/src/components/Sidebar/SidebarHeader.tsx diff --git a/pkgs/webview-ui/app/src/components/Sidebar/SidebarListItem.tsx b/pkgs/ui/webview-ui/app/src/components/Sidebar/SidebarListItem.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/SidebarListItem.tsx rename to pkgs/ui/webview-ui/app/src/components/Sidebar/SidebarListItem.tsx diff --git a/pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-flyout.css b/pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-flyout.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-flyout.css rename to pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-flyout.css diff --git a/pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-header.css b/pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-header.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-header.css rename to pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-header.css diff --git a/pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-list-item.css b/pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-list-item.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-list-item.css rename to pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-list-item.css diff --git a/pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-profile.css b/pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-profile.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/css/sidebar-profile.css rename to pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar-profile.css diff --git a/pkgs/webview-ui/app/src/components/Sidebar/css/sidebar.css b/pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/css/sidebar.css rename to pkgs/ui/webview-ui/app/src/components/Sidebar/css/sidebar.css diff --git a/pkgs/webview-ui/app/src/components/Sidebar/index.tsx b/pkgs/ui/webview-ui/app/src/components/Sidebar/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Sidebar/index.tsx rename to pkgs/ui/webview-ui/app/src/components/Sidebar/index.tsx diff --git a/pkgs/webview-ui/app/src/components/Typography/css/typography-color.css b/pkgs/ui/webview-ui/app/src/components/Typography/css/typography-color.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/css/typography-color.css rename to pkgs/ui/webview-ui/app/src/components/Typography/css/typography-color.css diff --git a/pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/index.css b/pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/index.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/index.css rename to pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/index.css diff --git a/pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-body.css b/pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-body.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-body.css rename to pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-body.css diff --git a/pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-headline.css b/pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-headline.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-headline.css rename to pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-headline.css diff --git a/pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-label.css b/pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-label.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-label.css rename to pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-label.css diff --git a/pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-title.css b/pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-title.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-title.css rename to pkgs/ui/webview-ui/app/src/components/Typography/css/typography-hierarchy/typography-title.css diff --git a/pkgs/webview-ui/app/src/components/Typography/css/typography.css b/pkgs/ui/webview-ui/app/src/components/Typography/css/typography.css similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/css/typography.css rename to pkgs/ui/webview-ui/app/src/components/Typography/css/typography.css diff --git a/pkgs/webview-ui/app/src/components/Typography/index.tsx b/pkgs/ui/webview-ui/app/src/components/Typography/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/Typography/index.tsx rename to pkgs/ui/webview-ui/app/src/components/Typography/index.tsx diff --git a/pkgs/webview-ui/app/src/components/accordion/accordion.css b/pkgs/ui/webview-ui/app/src/components/accordion/accordion.css similarity index 100% rename from pkgs/webview-ui/app/src/components/accordion/accordion.css rename to pkgs/ui/webview-ui/app/src/components/accordion/accordion.css diff --git a/pkgs/webview-ui/app/src/components/accordion/index.tsx b/pkgs/ui/webview-ui/app/src/components/accordion/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/accordion/index.tsx rename to pkgs/ui/webview-ui/app/src/components/accordion/index.tsx diff --git a/pkgs/webview-ui/app/src/components/badge/index.tsx b/pkgs/ui/webview-ui/app/src/components/badge/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/badge/index.tsx rename to pkgs/ui/webview-ui/app/src/components/badge/index.tsx diff --git a/pkgs/webview-ui/app/src/components/button/button.examples.tsx b/pkgs/ui/webview-ui/app/src/components/button/button.examples.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/button/button.examples.tsx rename to pkgs/ui/webview-ui/app/src/components/button/button.examples.tsx diff --git a/pkgs/webview-ui/app/src/components/button/css/button-dark.css b/pkgs/ui/webview-ui/app/src/components/button/css/button-dark.css similarity index 100% rename from pkgs/webview-ui/app/src/components/button/css/button-dark.css rename to pkgs/ui/webview-ui/app/src/components/button/css/button-dark.css diff --git a/pkgs/webview-ui/app/src/components/button/css/button-ghost.css b/pkgs/ui/webview-ui/app/src/components/button/css/button-ghost.css similarity index 100% rename from pkgs/webview-ui/app/src/components/button/css/button-ghost.css rename to pkgs/ui/webview-ui/app/src/components/button/css/button-ghost.css diff --git a/pkgs/webview-ui/app/src/components/button/css/button-light.css b/pkgs/ui/webview-ui/app/src/components/button/css/button-light.css similarity index 100% rename from pkgs/webview-ui/app/src/components/button/css/button-light.css rename to pkgs/ui/webview-ui/app/src/components/button/css/button-light.css diff --git a/pkgs/webview-ui/app/src/components/button/css/index.css b/pkgs/ui/webview-ui/app/src/components/button/css/index.css similarity index 100% rename from pkgs/webview-ui/app/src/components/button/css/index.css rename to pkgs/ui/webview-ui/app/src/components/button/css/index.css diff --git a/pkgs/webview-ui/app/src/components/button/index.tsx b/pkgs/ui/webview-ui/app/src/components/button/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/button/index.tsx rename to pkgs/ui/webview-ui/app/src/components/button/index.tsx diff --git a/pkgs/webview-ui/app/src/components/fileSelect/index.tsx b/pkgs/ui/webview-ui/app/src/components/fileSelect/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/fileSelect/index.tsx rename to pkgs/ui/webview-ui/app/src/components/fileSelect/index.tsx diff --git a/pkgs/webview-ui/app/src/components/group/index.tsx b/pkgs/ui/webview-ui/app/src/components/group/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/group/index.tsx rename to pkgs/ui/webview-ui/app/src/components/group/index.tsx diff --git a/pkgs/webview-ui/app/src/components/icon/index.tsx b/pkgs/ui/webview-ui/app/src/components/icon/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/icon/index.tsx rename to pkgs/ui/webview-ui/app/src/components/icon/index.tsx diff --git a/pkgs/webview-ui/app/src/components/inputBase/index.tsx b/pkgs/ui/webview-ui/app/src/components/inputBase/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/inputBase/index.tsx rename to pkgs/ui/webview-ui/app/src/components/inputBase/index.tsx diff --git a/pkgs/webview-ui/app/src/components/machine-list-item/css/index.css b/pkgs/ui/webview-ui/app/src/components/machine-list-item/css/index.css similarity index 100% rename from pkgs/webview-ui/app/src/components/machine-list-item/css/index.css rename to pkgs/ui/webview-ui/app/src/components/machine-list-item/css/index.css diff --git a/pkgs/webview-ui/app/src/components/machine-list-item/index.tsx b/pkgs/ui/webview-ui/app/src/components/machine-list-item/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/machine-list-item/index.tsx rename to pkgs/ui/webview-ui/app/src/components/machine-list-item/index.tsx diff --git a/pkgs/webview-ui/app/src/components/modal/index.tsx b/pkgs/ui/webview-ui/app/src/components/modal/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/modal/index.tsx rename to pkgs/ui/webview-ui/app/src/components/modal/index.tsx diff --git a/pkgs/webview-ui/app/src/components/noiseThumbnail/index.tsx b/pkgs/ui/webview-ui/app/src/components/noiseThumbnail/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/noiseThumbnail/index.tsx rename to pkgs/ui/webview-ui/app/src/components/noiseThumbnail/index.tsx diff --git a/pkgs/webview-ui/app/src/components/toast/index.tsx b/pkgs/ui/webview-ui/app/src/components/toast/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/components/toast/index.tsx rename to pkgs/ui/webview-ui/app/src/components/toast/index.tsx diff --git a/pkgs/webview-ui/app/src/floating/index.tsx b/pkgs/ui/webview-ui/app/src/floating/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/floating/index.tsx rename to pkgs/ui/webview-ui/app/src/floating/index.tsx diff --git a/pkgs/webview-ui/app/src/hooks/index.ts b/pkgs/ui/webview-ui/app/src/hooks/index.ts similarity index 100% rename from pkgs/webview-ui/app/src/hooks/index.ts rename to pkgs/ui/webview-ui/app/src/hooks/index.ts diff --git a/pkgs/webview-ui/app/src/index.css b/pkgs/ui/webview-ui/app/src/index.css similarity index 100% rename from pkgs/webview-ui/app/src/index.css rename to pkgs/ui/webview-ui/app/src/index.css diff --git a/pkgs/webview-ui/app/src/index.tsx b/pkgs/ui/webview-ui/app/src/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/index.tsx rename to pkgs/ui/webview-ui/app/src/index.tsx diff --git a/pkgs/webview-ui/app/src/layout/header.tsx b/pkgs/ui/webview-ui/app/src/layout/header.tsx similarity index 100% rename from pkgs/webview-ui/app/src/layout/header.tsx rename to pkgs/ui/webview-ui/app/src/layout/header.tsx diff --git a/pkgs/webview-ui/app/src/layout/layout.tsx b/pkgs/ui/webview-ui/app/src/layout/layout.tsx similarity index 100% rename from pkgs/webview-ui/app/src/layout/layout.tsx rename to pkgs/ui/webview-ui/app/src/layout/layout.tsx diff --git a/pkgs/webview-ui/app/src/queries/index.ts b/pkgs/ui/webview-ui/app/src/queries/index.ts similarity index 100% rename from pkgs/webview-ui/app/src/queries/index.ts rename to pkgs/ui/webview-ui/app/src/queries/index.ts diff --git a/pkgs/webview-ui/app/src/routes/clans/create.tsx b/pkgs/ui/webview-ui/app/src/routes/clans/create.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/clans/create.tsx rename to pkgs/ui/webview-ui/app/src/routes/clans/create.tsx diff --git a/pkgs/webview-ui/app/src/routes/clans/details.tsx b/pkgs/ui/webview-ui/app/src/routes/clans/details.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/clans/details.tsx rename to pkgs/ui/webview-ui/app/src/routes/clans/details.tsx diff --git a/pkgs/webview-ui/app/src/routes/clans/index.ts b/pkgs/ui/webview-ui/app/src/routes/clans/index.ts similarity index 100% rename from pkgs/webview-ui/app/src/routes/clans/index.ts rename to pkgs/ui/webview-ui/app/src/routes/clans/index.ts diff --git a/pkgs/webview-ui/app/src/routes/clans/list.tsx b/pkgs/ui/webview-ui/app/src/routes/clans/list.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/clans/list.tsx rename to pkgs/ui/webview-ui/app/src/routes/clans/list.tsx diff --git a/pkgs/webview-ui/app/src/routes/colors/view.tsx b/pkgs/ui/webview-ui/app/src/routes/colors/view.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/colors/view.tsx rename to pkgs/ui/webview-ui/app/src/routes/colors/view.tsx diff --git a/pkgs/webview-ui/app/src/routes/components/index.tsx b/pkgs/ui/webview-ui/app/src/routes/components/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/components/index.tsx rename to pkgs/ui/webview-ui/app/src/routes/components/index.tsx diff --git a/pkgs/webview-ui/app/src/routes/deploy/index.tsx b/pkgs/ui/webview-ui/app/src/routes/deploy/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/deploy/index.tsx rename to pkgs/ui/webview-ui/app/src/routes/deploy/index.tsx diff --git a/pkgs/webview-ui/app/src/routes/disk/view.tsx b/pkgs/ui/webview-ui/app/src/routes/disk/view.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/disk/view.tsx rename to pkgs/ui/webview-ui/app/src/routes/disk/view.tsx diff --git a/pkgs/webview-ui/app/src/routes/flash/view.tsx b/pkgs/ui/webview-ui/app/src/routes/flash/view.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/flash/view.tsx rename to pkgs/ui/webview-ui/app/src/routes/flash/view.tsx diff --git a/pkgs/webview-ui/app/src/routes/hosts/view.tsx b/pkgs/ui/webview-ui/app/src/routes/hosts/view.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/hosts/view.tsx rename to pkgs/ui/webview-ui/app/src/routes/hosts/view.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/avatar.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/avatar.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/avatar.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/avatar.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/create.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/create.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/create.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/create.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/details.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/details.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/details.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/details.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/index.ts b/pkgs/ui/webview-ui/app/src/routes/machines/index.ts similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/index.ts rename to pkgs/ui/webview-ui/app/src/routes/machines/index.ts diff --git a/pkgs/webview-ui/app/src/routes/machines/install/disk-step.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/install/disk-step.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/install/disk-step.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/install/disk-step.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/install/hardware-step.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/install/hardware-step.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/install/hardware-step.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/install/hardware-step.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/install/summary-step.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/install/summary-step.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/install/summary-step.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/install/summary-step.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/install/vars-step.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/install/vars-step.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/install/vars-step.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/install/vars-step.tsx diff --git a/pkgs/webview-ui/app/src/routes/machines/list.tsx b/pkgs/ui/webview-ui/app/src/routes/machines/list.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/machines/list.tsx rename to pkgs/ui/webview-ui/app/src/routes/machines/list.tsx diff --git a/pkgs/webview-ui/app/src/routes/modules/add.tsx b/pkgs/ui/webview-ui/app/src/routes/modules/add.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/modules/add.tsx rename to pkgs/ui/webview-ui/app/src/routes/modules/add.tsx diff --git a/pkgs/webview-ui/app/src/routes/modules/details.tsx b/pkgs/ui/webview-ui/app/src/routes/modules/details.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/modules/details.tsx rename to pkgs/ui/webview-ui/app/src/routes/modules/details.tsx diff --git a/pkgs/webview-ui/app/src/routes/modules/list.tsx b/pkgs/ui/webview-ui/app/src/routes/modules/list.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/modules/list.tsx rename to pkgs/ui/webview-ui/app/src/routes/modules/list.tsx diff --git a/pkgs/webview-ui/app/src/routes/welcome/index.tsx b/pkgs/ui/webview-ui/app/src/routes/welcome/index.tsx similarity index 100% rename from pkgs/webview-ui/app/src/routes/welcome/index.tsx rename to pkgs/ui/webview-ui/app/src/routes/welcome/index.tsx diff --git a/pkgs/webview-ui/app/src/three.tsx b/pkgs/ui/webview-ui/app/src/three.tsx similarity index 100% rename from pkgs/webview-ui/app/src/three.tsx rename to pkgs/ui/webview-ui/app/src/three.tsx diff --git a/pkgs/webview-ui/app/stylelint.config.js b/pkgs/ui/webview-ui/app/stylelint.config.js similarity index 100% rename from pkgs/webview-ui/app/stylelint.config.js rename to pkgs/ui/webview-ui/app/stylelint.config.js diff --git a/pkgs/webview-ui/app/tailwind.config.ts b/pkgs/ui/webview-ui/app/tailwind.config.ts similarity index 100% rename from pkgs/webview-ui/app/tailwind.config.ts rename to pkgs/ui/webview-ui/app/tailwind.config.ts diff --git a/pkgs/webview-ui/app/tailwind/core-plugin.ts b/pkgs/ui/webview-ui/app/tailwind/core-plugin.ts similarity index 100% rename from pkgs/webview-ui/app/tailwind/core-plugin.ts rename to pkgs/ui/webview-ui/app/tailwind/core-plugin.ts diff --git a/pkgs/webview-ui/app/tailwind/typography.ts b/pkgs/ui/webview-ui/app/tailwind/typography.ts similarity index 100% rename from pkgs/webview-ui/app/tailwind/typography.ts rename to pkgs/ui/webview-ui/app/tailwind/typography.ts diff --git a/pkgs/webview-ui/app/tests/types.test.ts b/pkgs/ui/webview-ui/app/tests/types.test.ts similarity index 100% rename from pkgs/webview-ui/app/tests/types.test.ts rename to pkgs/ui/webview-ui/app/tests/types.test.ts diff --git a/pkgs/webview-ui/app/tsconfig.json b/pkgs/ui/webview-ui/app/tsconfig.json similarity index 100% rename from pkgs/webview-ui/app/tsconfig.json rename to pkgs/ui/webview-ui/app/tsconfig.json diff --git a/pkgs/webview-ui/app/util.ts b/pkgs/ui/webview-ui/app/util.ts similarity index 100% rename from pkgs/webview-ui/app/util.ts rename to pkgs/ui/webview-ui/app/util.ts diff --git a/pkgs/webview-ui/app/vite.config.ts b/pkgs/ui/webview-ui/app/vite.config.ts similarity index 100% rename from pkgs/webview-ui/app/vite.config.ts rename to pkgs/ui/webview-ui/app/vite.config.ts diff --git a/pkgs/webview-ui/bin/reload-python-api.sh b/pkgs/ui/webview-ui/bin/reload-python-api.sh similarity index 100% rename from pkgs/webview-ui/bin/reload-python-api.sh rename to pkgs/ui/webview-ui/bin/reload-python-api.sh diff --git a/pkgs/webview-ui/flake-module.nix b/pkgs/ui/webview-ui/flake-module.nix similarity index 98% rename from pkgs/webview-ui/flake-module.nix rename to pkgs/ui/webview-ui/flake-module.nix index 6496259e3..95e3fafb9 100644 --- a/pkgs/webview-ui/flake-module.nix +++ b/pkgs/ui/webview-ui/flake-module.nix @@ -60,7 +60,7 @@ ]; shellHook = '' export GIT_ROOT="$(git rev-parse --show-toplevel)" - export PKG_ROOT="$GIT_ROOT/pkgs/webview-ui" + export PKG_ROOT="$GIT_ROOT/pkgs/ui/webview-ui" export NODE_PATH="$PKG_ROOT/app/node_modules" scriptsPath="$PKG_ROOT/bin"