From c0f064add0c4a3d4bf4eccb79b95c3f74388fad7 Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 16:05:55 -0700 Subject: [PATCH 01/15] fix: include messaging dependency group in default Hermes build Adds discord.py, python-telegram-bot, slack-bolt, and other messaging platform libraries to the default Hermes derivation. This is required for Discord/Slack/Telegram channel integration in k3s-deployed agents. The [all] extras group stopped including messaging on 2026-05-12 (switched to lazy-install), but our Nix-built container images have no pip available for runtime lazy installation. Closes #2 --- nix/packages.nix | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nix/packages.nix b/nix/packages.nix index dbf6356..ffe367b 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -4,9 +4,10 @@ let pkgs = inputs.nixpkgs.legacyPackages.${system}; in { - default = inputs.hermes-agent.packages.${system}.default; - - speckl-config = pkgs.writeTextDir "speckl-config.yaml" '' + # Hermes agent with messaging platform support (Discord, Slack, Telegram) + default = inputs.hermes-agent.packages.${system}.default.override { + extraDependencyGroups = [ "messaging" ]; + }; = pkgs.writeTextDir "speckl-config.yaml" '' # Speckl SME — generated config # Override via services.hermes-speckl.settings model: From 1169f7a63893cd88d9645ef26da306775cc816fb Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:34:41 -0700 Subject: [PATCH 02/15] fix: restore speckl-config key after botched edit --- nix/packages.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nix/packages.nix b/nix/packages.nix index ffe367b..226bca9 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -7,7 +7,9 @@ # Hermes agent with messaging platform support (Discord, Slack, Telegram) default = inputs.hermes-agent.packages.${system}.default.override { extraDependencyGroups = [ "messaging" ]; - }; = pkgs.writeTextDir "speckl-config.yaml" '' + }; + + speckl-config = pkgs.writeTextDir "speckl-config.yaml" '' # Speckl SME — generated config # Override via services.hermes-speckl.settings model: From c7a4db778ce6499c0e57700109e87b076afcb2dc Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:35:01 -0700 Subject: [PATCH 03/15] fix: move forAllSystems before flake.packages reference --- nix/packages.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nix/packages.nix b/nix/packages.nix index 226bca9..5f10cfc 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -1,5 +1,8 @@ { inputs, ... }: { + # Helper: build for the standard platforms + forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; + flake.packages = forAllSystems (system: let pkgs = inputs.nixpkgs.legacyPackages.${system}; @@ -23,7 +26,4 @@ ''; } ); - - # Helper: build for the standard platforms - forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; } From fcd3dde8baf49bb2adf1c8654edf269700e07042 Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:35:46 -0700 Subject: [PATCH 04/15] =?UTF-8?q?fix:=20revert=20to=20original=20scoping?= =?UTF-8?q?=20=E2=80=94=20forAllSystems=20as=20sibling=20attr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nix/packages.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nix/packages.nix b/nix/packages.nix index 5f10cfc..226bca9 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -1,8 +1,5 @@ { inputs, ... }: { - # Helper: build for the standard platforms - forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; - flake.packages = forAllSystems (system: let pkgs = inputs.nixpkgs.legacyPackages.${system}; @@ -26,4 +23,7 @@ ''; } ); + + # Helper: build for the standard platforms + forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; } From 2a728384fc2c58915f9ad2e9807a000f8e2066bb Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:36:04 -0700 Subject: [PATCH 05/15] chore: update flake.lock --- flake.lock | 267 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 flake.lock diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..f74e3fc --- /dev/null +++ b/flake.lock @@ -0,0 +1,267 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772408722, + "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "hermes-agent": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs", + "npm-lockfile-fix": "npm-lockfile-fix", + "pyproject-build-systems": "pyproject-build-systems", + "pyproject-nix": "pyproject-nix_2", + "uv2nix": "uv2nix_2" + }, + "locked": { + "lastModified": 1778808412, + "narHash": "sha256-aMswImSX08K+0RWBaTKbDJPjPv+saiU5d46d9qwyIl4=", + "owner": "NousResearch", + "repo": "hermes-agent", + "rev": "1702a94c889911da28015449544640648e8c3db2", + "type": "github" + }, + "original": { + "owner": "NousResearch", + "repo": "hermes-agent", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1775036866, + "narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6201e203d09599479a3b3450ed24fa81537ebc4e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1778443072, + "narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "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": "pyproject-nix", + "uv2nix": "uv2nix" + }, + "locked": { + "lastModified": 1772555609, + "narHash": "sha256-3BA3HnUvJSbHJAlJj6XSy0Jmu7RyP2gyB/0fL7XuEDo=", + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "rev": "c37f66a953535c394244888598947679af231863", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "type": "github" + } + }, + "pyproject-nix": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "pyproject-build-systems", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769936401, + "narHash": "sha256-kwCOegKLZJM9v/e/7cqwg1p/YjjTAukKPqmxKnAZRgA=", + "owner": "nix-community", + "repo": "pyproject.nix", + "rev": "b0d513eeeebed6d45b4f2e874f9afba2021f7812", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "pyproject.nix", + "type": "github" + } + }, + "pyproject-nix_2": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772865871, + "narHash": "sha256-/ZTSg97aouL0SlPHaokA4r3iuH9QzHVuWPACD2CUCFY=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "e537db02e72d553cea470976b9733581bcf5b3ed", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, + "pyproject-nix_3": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "uv2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771518446, + "narHash": "sha256-nFJSfD89vWTu92KyuJWDoTQJuoDuddkJV3TlOl1cOic=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "eb204c6b3335698dec6c7fc1da0ebc3c6df05937", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "hermes-agent": "hermes-agent", + "nixpkgs": "nixpkgs_2" + } + }, + "uv2nix": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "pyproject-build-systems", + "nixpkgs" + ], + "pyproject-nix": [ + "hermes-agent", + "pyproject-build-systems", + "pyproject-nix" + ] + }, + "locked": { + "lastModified": 1770770348, + "narHash": "sha256-A2GzkmzdYvdgmMEu5yxW+xhossP+txrYb7RuzRaqhlg=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "5d1b2cb4fe3158043fbafbbe2e46238abbc954b0", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } + }, + "uv2nix_2": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ], + "pyproject-nix": "pyproject-nix_3" + }, + "locked": { + "lastModified": 1773039484, + "narHash": "sha256-+boo33KYkJDw9KItpeEXXv8+65f7hHv/earxpcyzQ0I=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "b68be7cfeacbed9a3fa38a2b5adc0cfb81d9bb1f", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} From 2b9a3975a368914e143dc84433547cf82627de8e Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:39:23 -0700 Subject: [PATCH 06/15] fix: use let binding for forAllSystems to resolve scoping in flake-parts module --- nix/packages.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nix/packages.nix b/nix/packages.nix index 226bca9..f15e5c5 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -1,4 +1,7 @@ { inputs, ... }: +let + forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; +in { flake.packages = forAllSystems (system: let @@ -23,7 +26,4 @@ ''; } ); - - # Helper: build for the standard platforms - forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; } From c65e6da3d3507c68b3e9b42e04c75f27ebc44b60 Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:40:52 -0700 Subject: [PATCH 07/15] feat: add OCI container image for k3s deployment --- nix/packages.nix | 28 ++++++++++++++++++++++++++-- result | 1 + 2 files changed, 27 insertions(+), 2 deletions(-) create mode 120000 result diff --git a/nix/packages.nix b/nix/packages.nix index f15e5c5..cc35fda 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -6,12 +6,36 @@ in flake.packages = forAllSystems (system: let pkgs = inputs.nixpkgs.legacyPackages.${system}; - in { + # Hermes agent with messaging platform support (Discord, Slack, Telegram) - default = inputs.hermes-agent.packages.${system}.default.override { + hermesMessaging = inputs.hermes-agent.packages.${system}.default.override { extraDependencyGroups = [ "messaging" ]; }; + # OCI container image for k3s deployment + hermesImage = pkgs.dockerTools.buildLayeredImage { + name = "hermes-speckl/sme"; + tag = "latest"; + created = "now"; + contents = [ + hermesMessaging + pkgs.cacert + pkgs.tzdata + pkgs.bash + pkgs.coreutils + ]; + config = { + Entrypoint = [ "/bin/hermes" "gateway" "run" ]; + Env = [ + "PATH=/bin" + "SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" + ]; + }; + }; + in { + default = hermesMessaging; + docker-image = hermesImage; + speckl-config = pkgs.writeTextDir "speckl-config.yaml" '' # Speckl SME — generated config # Override via services.hermes-speckl.settings diff --git a/result b/result new file mode 120000 index 0000000..993bf92 --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/wmr5qjizys6dsbsrgvydc0c7ijx4inra-hermes-agent-0.13.0 \ No newline at end of file From e683fa33d3b0c571f6b0109ce3b186f2ed003057 Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:49:52 -0700 Subject: [PATCH 08/15] fix: remove committed build artifact (result symlink) --- result | 1 - 1 file changed, 1 deletion(-) delete mode 120000 result diff --git a/result b/result deleted file mode 120000 index 993bf92..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/wmr5qjizys6dsbsrgvydc0c7ijx4inra-hermes-agent-0.13.0 \ No newline at end of file From f9071e6f49c9545eec6d48a2c5bff87756ef3f99 Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 18:51:48 -0700 Subject: [PATCH 09/15] fix: include messaging dependency group in default Hermes build (#3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What this fixes Adds `discord.py`, `python-telegram-bot`, `slack-bolt`, and other messaging platform libraries to the default Hermes derivation. Also adds a `docker-image` OCI image target for k3s deployment. Fixes https://os.scoble.me/forgejo/sscoble/hermes-speckl/issues/2 ## Problem The `[all]` extras group in upstream hermes-agent (NousResearch) stopped including the `messaging` dependency group on 2026-05-12 — it switched to lazy-install at runtime. But our Nix-built container images running on k3s have no `pip` available, so lazy installation fails. Agent logs show: ``` WARNING gateway.run: Discord: discord.py not installed WARNING gateway.run: No adapter available for discord ``` ## Changes - Added `extraDependencyGroups = ["messaging"]` override on the hermes-agent derivation - Added `docker-image` OCI image target built with `dockerTools.buildLayeredImage` - Fixed scoping: `forAllSystems` moved into `let...in` binding for flake-parts compatibility - Added `flake.lock` (previously missing) ## After Merge 1. Build the OCI image: ``` nix build .#docker-image ``` 2. Import into containerd: ``` sudo ctr -n k8s.io images import result sudo ctr -n k8s.io images tag --force hermes-speckl/sme:latest docker.io/hermes-speckl/sme:latest ``` 3. Restart the demo concierge: ``` kubectl delete pod -n cust-demo -l agent=concierge ``` 4. Verify: ``` kubectl logs -n cust-demo -l agent=concierge --tail=5 # Should show Discord connected, not "discord.py not installed" ``` **Verified:** The image builds successfully and includes `discord.py==2.7.1`, `python-telegram-bot==22.6`, and `slack-bolt==1.27.0`. Image imported to containerd and ready for deployment. Reviewed-on: https://os.scoble.me/forgejo/forgejo/sscoble/hermes-speckl/pulls/3 Reviewed-by: sscoble Co-authored-by: agent-engineering Co-committed-by: agent-engineering --- flake.lock | 267 +++++++++++++++++++++++++++++++++++++++++++++++ nix/packages.nix | 35 ++++++- 2 files changed, 298 insertions(+), 4 deletions(-) create mode 100644 flake.lock diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..f74e3fc --- /dev/null +++ b/flake.lock @@ -0,0 +1,267 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772408722, + "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "hermes-agent": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs", + "npm-lockfile-fix": "npm-lockfile-fix", + "pyproject-build-systems": "pyproject-build-systems", + "pyproject-nix": "pyproject-nix_2", + "uv2nix": "uv2nix_2" + }, + "locked": { + "lastModified": 1778808412, + "narHash": "sha256-aMswImSX08K+0RWBaTKbDJPjPv+saiU5d46d9qwyIl4=", + "owner": "NousResearch", + "repo": "hermes-agent", + "rev": "1702a94c889911da28015449544640648e8c3db2", + "type": "github" + }, + "original": { + "owner": "NousResearch", + "repo": "hermes-agent", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1775036866, + "narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6201e203d09599479a3b3450ed24fa81537ebc4e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1778443072, + "narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "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": "pyproject-nix", + "uv2nix": "uv2nix" + }, + "locked": { + "lastModified": 1772555609, + "narHash": "sha256-3BA3HnUvJSbHJAlJj6XSy0Jmu7RyP2gyB/0fL7XuEDo=", + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "rev": "c37f66a953535c394244888598947679af231863", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "type": "github" + } + }, + "pyproject-nix": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "pyproject-build-systems", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769936401, + "narHash": "sha256-kwCOegKLZJM9v/e/7cqwg1p/YjjTAukKPqmxKnAZRgA=", + "owner": "nix-community", + "repo": "pyproject.nix", + "rev": "b0d513eeeebed6d45b4f2e874f9afba2021f7812", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "pyproject.nix", + "type": "github" + } + }, + "pyproject-nix_2": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772865871, + "narHash": "sha256-/ZTSg97aouL0SlPHaokA4r3iuH9QzHVuWPACD2CUCFY=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "e537db02e72d553cea470976b9733581bcf5b3ed", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, + "pyproject-nix_3": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "uv2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771518446, + "narHash": "sha256-nFJSfD89vWTu92KyuJWDoTQJuoDuddkJV3TlOl1cOic=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "eb204c6b3335698dec6c7fc1da0ebc3c6df05937", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "hermes-agent": "hermes-agent", + "nixpkgs": "nixpkgs_2" + } + }, + "uv2nix": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "pyproject-build-systems", + "nixpkgs" + ], + "pyproject-nix": [ + "hermes-agent", + "pyproject-build-systems", + "pyproject-nix" + ] + }, + "locked": { + "lastModified": 1770770348, + "narHash": "sha256-A2GzkmzdYvdgmMEu5yxW+xhossP+txrYb7RuzRaqhlg=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "5d1b2cb4fe3158043fbafbbe2e46238abbc954b0", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } + }, + "uv2nix_2": { + "inputs": { + "nixpkgs": [ + "hermes-agent", + "nixpkgs" + ], + "pyproject-nix": "pyproject-nix_3" + }, + "locked": { + "lastModified": 1773039484, + "narHash": "sha256-+boo33KYkJDw9KItpeEXXv8+65f7hHv/earxpcyzQ0I=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "b68be7cfeacbed9a3fa38a2b5adc0cfb81d9bb1f", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/nix/packages.nix b/nix/packages.nix index dbf6356..cc35fda 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -1,10 +1,40 @@ { inputs, ... }: +let + forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; +in { flake.packages = forAllSystems (system: let pkgs = inputs.nixpkgs.legacyPackages.${system}; + + # Hermes agent with messaging platform support (Discord, Slack, Telegram) + hermesMessaging = inputs.hermes-agent.packages.${system}.default.override { + extraDependencyGroups = [ "messaging" ]; + }; + + # OCI container image for k3s deployment + hermesImage = pkgs.dockerTools.buildLayeredImage { + name = "hermes-speckl/sme"; + tag = "latest"; + created = "now"; + contents = [ + hermesMessaging + pkgs.cacert + pkgs.tzdata + pkgs.bash + pkgs.coreutils + ]; + config = { + Entrypoint = [ "/bin/hermes" "gateway" "run" ]; + Env = [ + "PATH=/bin" + "SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" + ]; + }; + }; in { - default = inputs.hermes-agent.packages.${system}.default; + default = hermesMessaging; + docker-image = hermesImage; speckl-config = pkgs.writeTextDir "speckl-config.yaml" '' # Speckl SME — generated config @@ -20,7 +50,4 @@ ''; } ); - - # Helper: build for the standard platforms - forAllSystems = inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ]; } From 6c94b007a1a910c8cbf1da8be4fabdeb822b259b Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 20:19:28 -0700 Subject: [PATCH 10/15] fix: add libopus to container image for Discord voice codec --- nix/packages.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/nix/packages.nix b/nix/packages.nix index cc35fda..d1e3f3d 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -23,6 +23,7 @@ in pkgs.tzdata pkgs.bash pkgs.coreutils + pkgs.libopus ]; config = { Entrypoint = [ "/bin/hermes" "gateway" "run" ]; From f3414daa6f4b4bfc776b00d08db000f23f8d8fa6 Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 20:24:03 -0700 Subject: [PATCH 11/15] fix: add opusfile alongside libopus for proper codec detection --- nix/packages.nix | 1 + result | 1 + 2 files changed, 2 insertions(+) create mode 120000 result diff --git a/nix/packages.nix b/nix/packages.nix index d1e3f3d..a12cc33 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -24,6 +24,7 @@ in pkgs.bash pkgs.coreutils pkgs.libopus + pkgs.opusfile ]; config = { Entrypoint = [ "/bin/hermes" "gateway" "run" ]; diff --git a/result b/result new file mode 120000 index 0000000..a09acb8 --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/c7s8qfwkc5wky4h4bxz67rj3nqhvb0wl-sme.tar.gz \ No newline at end of file From 4a286a566820b207c4a742bb7efe0349d91671d6 Mon Sep 17 00:00:00 2001 From: agent-engineering Date: Thu, 14 May 2026 20:24:08 -0700 Subject: [PATCH 12/15] fix: remove committed build artifact --- result | 1 - 1 file changed, 1 deletion(-) delete mode 120000 result diff --git a/result b/result deleted file mode 120000 index a09acb8..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/c7s8qfwkc5wky4h4bxz67rj3nqhvb0wl-sme.tar.gz \ No newline at end of file From ffa0cf904f7fc2267afb990aa33f5ccf92f413ef Mon Sep 17 00:00:00 2001 From: sscoble Date: Thu, 5 Nov 2026 21:42:55 +0000 Subject: [PATCH 13/15] ci: add runner smoke test --- .forgejo/workflows/smoke.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .forgejo/workflows/smoke.yaml diff --git a/.forgejo/workflows/smoke.yaml b/.forgejo/workflows/smoke.yaml new file mode 100644 index 0000000..e5ca49c --- /dev/null +++ b/.forgejo/workflows/smoke.yaml @@ -0,0 +1,10 @@ +name: runner-smoke +on: + workflow_dispatch: {} +jobs: + smoke: + runs-on: [k8s] + steps: + - run: | + echo "hello from $(uname -m) runner" + docker info 2>/dev/null | head -3 From 0052f0381788782cb77d4def2467f1505dd8f710 Mon Sep 17 00:00:00 2001 From: sscoble Date: Thu, 5 Nov 2026 21:46:39 +0000 Subject: [PATCH 14/15] ci: simplify smoke (no docker in node image) --- .forgejo/workflows/smoke.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.forgejo/workflows/smoke.yaml b/.forgejo/workflows/smoke.yaml index e5ca49c..b9107d4 100644 --- a/.forgejo/workflows/smoke.yaml +++ b/.forgejo/workflows/smoke.yaml @@ -7,4 +7,3 @@ jobs: steps: - run: | echo "hello from $(uname -m) runner" - docker info 2>/dev/null | head -3 From 02e3a357424f1f80be0fbbde3be8c7cdc748276a Mon Sep 17 00:00:00 2001 From: sscoble Date: Thu, 5 Nov 2026 22:08:20 +0000 Subject: [PATCH 15/15] ci: mac-mini smoke --- .forgejo/workflows/mac-test.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .forgejo/workflows/mac-test.yaml diff --git a/.forgejo/workflows/mac-test.yaml b/.forgejo/workflows/mac-test.yaml new file mode 100644 index 0000000..d883f9f --- /dev/null +++ b/.forgejo/workflows/mac-test.yaml @@ -0,0 +1,9 @@ +name: mac-mini-test +on: + workflow_dispatch: {} +jobs: + hostjob: + runs-on: [macos] + steps: + - run: | + echo "running on $(uname -sm) via mac-mini runner"