diff --git a/flake.lock b/flake.lock index ac82b7d..843f14a 100644 --- a/flake.lock +++ b/flake.lock @@ -35,6 +35,27 @@ } }, "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1782949081, + "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { "inputs": { "nixpkgs-lib": [ "nix", @@ -79,10 +100,57 @@ "type": "github" } }, + "hermes-agent": { + "inputs": { + "flake-parts": "flake-parts_2", + "home-manager": "home-manager", + "nixpkgs": [ + "nixpkgs" + ], + "npm-lockfile-fix": "npm-lockfile-fix", + "pyproject-build-systems": "pyproject-build-systems", + "pyproject-nix": "pyproject-nix", + "uv2nix": "uv2nix" + }, + "locked": { + "lastModified": 1788877844, + "narHash": "sha256-9Ik9egIxYhW/IDw1mz/dYN0IqLTP3bEe+LdEFtP9FWM=", + "owner": "NousResearch", + "repo": "hermes-agent", + "rev": "c8aa5608c24e3636e77c267650c0f1f52e44adb0", + "type": "github" + }, + "original": { + "owner": "NousResearch", + "repo": "hermes-agent", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1786487128, + "narHash": "sha256-ad60hrRVhH/bo3Jl1YLzO+QcS3mUNZr9LNJdzhMO2P4=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "f404edbfa4117810c96b97048299242fc50e5362", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, "nix": { "inputs": { "flake-compat": "flake-compat", - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts_3", "git-hooks-nix": "git-hooks-nix", "nixpkgs": "nixpkgs", "nixpkgs-23-11": "nixpkgs-23-11", @@ -257,9 +325,81 @@ "type": "indirect" } }, + "npm-lockfile-fix": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775903712, + "narHash": "sha256-2GV79U6iVH4gKAPWYrxUReB0S41ty/Y3dBLquU8AlaA=", + "owner": "jeslie0", + "repo": "npm-lockfile-fix", + "rev": "c6093acb0c0548e0f9b8b3d82918823721930fe8", + "type": "github" + }, + "original": { + "owner": "jeslie0", + "repo": "npm-lockfile-fix", + "type": "github" + } + }, + "pyproject-build-systems": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ], + "pyproject-nix": [ + "hermes-agent", + "pyproject-nix" + ], + "uv2nix": [ + "hermes-agent", + "uv2nix" + ] + }, + "locked": { + "lastModified": 1785115949, + "narHash": "sha256-8AM37BfyGaL2v/SZyg4PupRxJ01Y4htvM+WrTjWrPpo=", + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "rev": "62c0d86027edb1c4f39a5facc09876348144f7c9", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "type": "github" + } + }, + "pyproject-nix": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784591072, + "narHash": "sha256-zP/WaDxrRu8GANZM61+V2LT/7ycEEdoyLWn7M6WzU7M=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "e3b599ca2e7fcf93d4edf65d7f19bbf6491724f3", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, "root": { "inputs": { "flake-parts": "flake-parts", + "hermes-agent": "hermes-agent", "nix": "nix", "nixos-generators": "nixos-generators", "nixos-hardware": "nixos-hardware", @@ -287,6 +427,31 @@ "repo": "sops-nix", "type": "github" } + }, + "uv2nix": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ], + "pyproject-nix": [ + "hermes-agent", + "pyproject-nix" + ] + }, + "locked": { + "lastModified": 1785277507, + "narHash": "sha256-9Tq3UDX2hD/aveW/HvkBlAmEwJTOlY5HQXJM+L5BGmE=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "5a836d395cbf5fc22670eb98dd4aa4fc4d406977", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 0b4a512..64a9f1f 100644 --- a/flake.nix +++ b/flake.nix @@ -15,6 +15,10 @@ url = "github:Mic92/sops-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + hermes-agent = { + url = "github:NousResearch/hermes-agent"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; diff --git a/machines/configuration.nix b/machines/configuration.nix index eee3f25..731ba72 100644 --- a/machines/configuration.nix +++ b/machines/configuration.nix @@ -5,6 +5,7 @@ let nixpkgs-unstable nixos-hardware sops-nix + hermes-agent #hyprland ; nixosSystem = nixpkgs.lib.makeOverridable nixpkgs.lib.nixosSystem; @@ -62,6 +63,7 @@ in specialArgs = { inherit self; }; modules = defaultModules ++ [ # nixos-hardware.nixosModules.mibook + hermes-agent.nixosModules.default ./mibook/configuration.nix ]; }; diff --git a/machines/mibook/environments.nix b/machines/mibook/environments.nix index 286209b..9b2ff82 100644 --- a/machines/mibook/environments.nix +++ b/machines/mibook/environments.nix @@ -10,6 +10,7 @@ _: { development.enable = true; docker.enable = true; claude-code.enable = true; + hermes-agent.enable = true; }; my.hardware = { diff --git a/machines/mibook/secrets.nix b/machines/mibook/secrets.nix index 9678642..37b50c6 100644 --- a/machines/mibook/secrets.nix +++ b/machines/mibook/secrets.nix @@ -2,11 +2,10 @@ # via machines/core/sops.nix. { ... }: { - # Pipeline smoke test — proves host-key decryption works end to end. - # Safe to delete once a real secret is in place. - sops.secrets.placeholder = { + sops.secrets.hermes-env = { + owner = "hermes"; + group = "hermes"; mode = "0400"; - owner = "root"; - group = "root"; + restartUnits = [ "hermes-agent.service" ]; # confirmed/fixed in Task 4 if the unit name differs }; } diff --git a/modules/environments/default.nix b/modules/environments/default.nix index 9158f6a..a910b44 100644 --- a/modules/environments/default.nix +++ b/modules/environments/default.nix @@ -20,5 +20,6 @@ ./jellyfin ./jellyseerr ./immich + ./hermes-agent ]; } diff --git a/modules/environments/hermes-agent/default.nix b/modules/environments/hermes-agent/default.nix new file mode 100644 index 0000000..81d2ba3 --- /dev/null +++ b/modules/environments/hermes-agent/default.nix @@ -0,0 +1,23 @@ +# Hermes Agent — Telegram + Email messaging gateway (Claude subscription auth) +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.my.profiles.hermes-agent; +in +{ + options.my.profiles.hermes-agent.enable = + lib.mkEnableOption "Hermes Agent (Telegram + Email gateway)"; + + config = lib.mkIf cfg.enable { + services.hermes-agent = { + enable = true; + settings.model.default = "anthropic/claude-sonnet-4-5"; + environmentFiles = [ config.sops.secrets."hermes-env".path ]; + addToSystemPackages = true; + }; + }; +}