From 391574feb772a03d9d57a1d551f9145fdd12023c Mon Sep 17 00:00:00 2001 From: gitricko Date: Sat, 5 Sep 2026 13:48:21 -0400 Subject: [PATCH 01/10] Update version numbers in post-create-cmd.sh --- .devcontainer/post-create-cmd.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/post-create-cmd.sh b/.devcontainer/post-create-cmd.sh index df4d286..d7435dc 100755 --- a/.devcontainer/post-create-cmd.sh +++ b/.devcontainer/post-create-cmd.sh @@ -1,10 +1,10 @@ #!/bin/bash HERMES_VERSION="v2026.8.31" -OMNIROUTE_VERSION=3.8.49 +OMNIROUTE_VERSION=3.8.50 MODELRELAY_VERSION=1.22.1 -MNEMON_VERSION=0.2.7 -PI_AGENT_VERSION=0.84.4 +MNEMON_VERSION=0.2.8 +PI_AGENT_VERSION=0.85.1 HERDR_VERSION=0.7.4 SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" From 4b999780510d91c1392210899fe5a7337161838c Mon Sep 17 00:00:00 2001 From: gitricko Date: Sat, 5 Sep 2026 14:00:03 -0400 Subject: [PATCH 02/10] Suppress npm prompts by setting CI environment variable Set CI environment variable to true to suppress npm prompts. --- .devcontainer/post-create-cmd.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.devcontainer/post-create-cmd.sh b/.devcontainer/post-create-cmd.sh index d7435dc..3f747af 100755 --- a/.devcontainer/post-create-cmd.sh +++ b/.devcontainer/post-create-cmd.sh @@ -58,6 +58,8 @@ if ! curl -fsSL --max-time 15 --retry 3 -o "$INSTALL_SCRIPT" "$HERMES_INSTALL_UR fi fi +# to get rid of npm prompt +export CI=true if ! bash "$INSTALL_SCRIPT" --skip-setup; then echo "[$SCRIPT_NAME] Hermes installer failed." rm -f "$INSTALL_SCRIPT" From 6fd94dc7f2effc2a3aa28544a6eaf5fb29fdfbf9 Mon Sep 17 00:00:00 2001 From: gitricko Date: Sat, 5 Sep 2026 14:07:43 -0400 Subject: [PATCH 03/10] Increase MAX_ATTEMPTS for OmniRoute readiness check Increased the maximum attempts to wait for OmniRoute to be ready from 10 to 180. --- .devcontainer/post-create-cmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/post-create-cmd.sh b/.devcontainer/post-create-cmd.sh index 3f747af..9fa6196 100755 --- a/.devcontainer/post-create-cmd.sh +++ b/.devcontainer/post-create-cmd.sh @@ -332,7 +332,7 @@ mnemon setup --yes --global --target claude-code # Preconfigure Omniroute # Wait for OmniRoute to be ready -MAX_ATTEMPTS=10 +MAX_ATTEMPTS=180 for ((attempt=1; attempt<=MAX_ATTEMPTS; attempt++)); do echo "[$SCRIPT_NAME] Waiting for OmniRoute to be ready (attempt $attempt/$MAX_ATTEMPTS)..." From b2622b4b42e748896e64a9ab3c17d8a991852a28 Mon Sep 17 00:00:00 2001 From: gitricko Date: Sat, 5 Sep 2026 14:32:03 -0400 Subject: [PATCH 04/10] Change health check URL for OmniRoute readiness --- .devcontainer/post-create-cmd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/post-create-cmd.sh b/.devcontainer/post-create-cmd.sh index 9fa6196..49feca7 100755 --- a/.devcontainer/post-create-cmd.sh +++ b/.devcontainer/post-create-cmd.sh @@ -336,7 +336,7 @@ MAX_ATTEMPTS=180 for ((attempt=1; attempt<=MAX_ATTEMPTS; attempt++)); do echo "[$SCRIPT_NAME] Waiting for OmniRoute to be ready (attempt $attempt/$MAX_ATTEMPTS)..." - if curl -s --max-time 3 -o /dev/null -w "%{http_code}" http://localhost:20128/v1/models | grep -q "200"; then + if curl -s --max-time 3 -o /dev/null -w "%{http_code}" http://localhost:20128/login | grep -q "200"; then break fi if [ "$attempt" -eq "$MAX_ATTEMPTS" ]; then From b95e79b6263fc3e764e8d7d69b5895cab169e9ca Mon Sep 17 00:00:00 2001 From: gitricko Date: Sat, 5 Sep 2026 15:01:58 -0400 Subject: [PATCH 05/10] Update post-create-cmd.sh --- .devcontainer/post-create-cmd.sh | 44 ++++++++++---------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/.devcontainer/post-create-cmd.sh b/.devcontainer/post-create-cmd.sh index 49feca7..9da5956 100755 --- a/.devcontainer/post-create-cmd.sh +++ b/.devcontainer/post-create-cmd.sh @@ -336,7 +336,7 @@ MAX_ATTEMPTS=180 for ((attempt=1; attempt<=MAX_ATTEMPTS; attempt++)); do echo "[$SCRIPT_NAME] Waiting for OmniRoute to be ready (attempt $attempt/$MAX_ATTEMPTS)..." - if curl -s --max-time 3 -o /dev/null -w "%{http_code}" http://localhost:20128/login | grep -q "200"; then + if curl -s --max-time 3 -o /dev/null -w "%{http_code}" http://localhost:20128/healthz | grep -q "200"; then break fi if [ "$attempt" -eq "$MAX_ATTEMPTS" ]; then @@ -357,43 +357,25 @@ conn.commit() conn.close() " -# Create auto-fastest combo -while ! omniroute combo create auto-fastest --strategy auto ; do +# Create auto-fastest combo (.50 change cli that needs --models) +while ! omniroute combo create auto-fastest --strategy auto --models '["oc/deepseek-v4-flash-free","oc/big-pickle","opencode-zen/deepseek-v4-flash-free","opencode-zen/hy3-free","opencode-zen/mimo-v2.5-free","opencode-zen/north-mini-code-free","opencode-zen/nemotron-3-ultra-free","opencode-zen/big-pickle"]' ; do echo "[$SCRIPT_NAME] omniroute still not ready yet, retrying..." sleep 3 done echo "[$SCRIPT_NAME] OmniRoute Combo auto-fastest created!" -# Enable OmniRoute MCP if not already enabled -if omniroute mcp status --json 2>/dev/null | python3 -c "import sys,json;exit(0 if json.load(sys.stdin).get('enabled') else 1)"; then - echo "[$SCRIPT_NAME] MCP enabled" -else - echo "[$SCRIPT_NAME] Enabling MCP..." - curl -s -X PATCH http://localhost:20128/api/settings \ - -H "Content-Type: application/json" -d '{"mcpEnabled":true}' >/dev/null - echo "[$SCRIPT_NAME] MCP enabled" -fi +# Enable OmniRoute MCP if not already enabled - Disable MCP +# if omniroute mcp status --json 2>/dev/null | python3 -c "import sys,json;exit(0 if json.load(sys.stdin).get('enabled') else 1)"; then +# echo "[$SCRIPT_NAME] MCP enabled" +# else +# echo "[$SCRIPT_NAME] Enabling MCP..." +# curl -s -X PATCH http://localhost:20128/api/settings \ +# -H "Content-Type: application/json" -d '{"mcpEnabled":true}' >/dev/null +# echo "[$SCRIPT_NAME] MCP enabled" +# fi # Add omniroute MCP to hermes -yes Y | hermes mcp add omniroute --command omniroute --args --mcp - -# 2. Get the combo ID (skip the banner line from CLI output) -COMBO_ID=$(omniroute combo list --json | grep -v "📋" | \ -python3 -c "import sys,json; d=json.load(sys.stdin); print([c['id'] for c in d['combos'] if c['name']=='auto-fastest'][0])") - -# 3. Add models + config via API -curl -s -X PUT "http://localhost:20128/api/combos/$COMBO_ID" \ --H "Content-Type: application/json" \ --d '{ - "models": ["oc/deepseek-v4-flash-free","oc/big-pickle","opencode-zen/deepseek-v4-flash-free","opencode-zen/hy3-free","opencode-zen/mimo-v2.5-free","opencode-zen/north-mini-code-free","opencode-zen/nemotron-3-ultra-free","opencode-zen/big-pickle"], - "strategy": "auto", - "config": { - "maxRetries": 2, - "retryDelayMs": 1000, - "timeoutMs": 120000, - "healthCheckEnabled": true - } -}' +# yes Y | hermes mcp add omniroute --command omniroute --args --mcp echo "[$SCRIPT_NAME] OmniRoute initialization complete!" From 08b77a748d3d9c6cb8648d00f8f653ce755fb30c Mon Sep 17 00:00:00 2001 From: code <37886057+intricko@users.noreply.github.com> Date: Sat, 5 Sep 2026 19:44:08 +0000 Subject: [PATCH 06/10] Increase wait time for Hermes dashboard readiness and update retrieval checks to use Hermes instead of Claude --- .devcontainer/start-hermes.sh | 6 +++--- .github/workflows/devcontainer-ci.yml | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/.devcontainer/start-hermes.sh b/.devcontainer/start-hermes.sh index 0eb798a..0ee4412 100755 --- a/.devcontainer/start-hermes.sh +++ b/.devcontainer/start-hermes.sh @@ -112,13 +112,13 @@ fi # Wait for Hermes dashboard to be ready (replaces brittle sleep 15) echo "[$SCRIPT_NAME] Waiting for Hermes dashboard to become healthy..." -for i in $(seq 1 20); do +for i in $(seq 1 200); do if curl -s -o /dev/null -w "%{http_code}" http://localhost:9119 2>/dev/null | grep -q "200\|302\|401"; then echo "[$SCRIPT_NAME] Dashboard ready after $((i * 3)) seconds." break fi - if [ "$i" -eq 20 ]; then - echo "[$SCRIPT_NAME] WARNING: Dashboard did not respond within 60 seconds. Check ~/.hermes/logs/dashboard.log" + if [ "$i" -eq 200 ]; then + echo "[$SCRIPT_NAME] WARNING: Dashboard did not respond within 600 seconds. Check ~/.hermes/logs/dashboard.log" fi sleep 3 done diff --git a/.github/workflows/devcontainer-ci.yml b/.github/workflows/devcontainer-ci.yml index b4d986c..553d730 100644 --- a/.github/workflows/devcontainer-ci.yml +++ b/.github/workflows/devcontainer-ci.yml @@ -94,13 +94,20 @@ jobs: mnemon recall "$TEST_NAME" --limit 5 2>&1 | grep -q "$TEST_NAME" \ || { echo "FAIL: mnemon recall did not find $TEST_NAME"; exit 1; } - echo "[3/3] Claude retrieves via mnemon..." - CLAUDE_OUTPUT=$(timeout 60 \ - $HOME/.local/bin/claude --dangerously-skip-permissions -p \ - "Use mnemon recall to find my name. Reply with ONLY the name." 2>&1) - echo "Claude: $CLAUDE_OUTPUT" + # echo "[3/3] Claude retrieves via mnemon..." + # CLAUDE_OUTPUT=$(timeout 60 docker exec -u abc "$CONTAINER_NAME" \ + # /config/.local/bin/claude --dangerously-skip-permissions -p \ + # "Use mnemon recall to find my name. Reply with ONLY the name." 2>&1) || true + # echo "Claude: $CLAUDE_OUTPUT" + # echo "$CLAUDE_OUTPUT" | grep -q "$TEST_NAME" \ + # || { echo "FAIL: Claude did not return $TEST_NAME"; } + echo "[3/3] Hermes retrieves via mnemon..." + CLAUDE_OUTPUT=$(timeout 60 docker exec -u abc "$CONTAINER_NAME" \ + hermes chat -q \ + "Use mnemon recall to find my name. Reply with ONLY the name." 2>&1) || true + echo "Hermes: $CLAUDE_OUTPUT" echo "$CLAUDE_OUTPUT" | grep -q "$TEST_NAME" \ - || { echo "FAIL: Claude did not return $TEST_NAME"; exit 1; } + || { echo "FAIL: Hermes did not return $TEST_NAME"; } echo "=== ALL MNEMON CHECKS PASSED ===" From 7cafcabcaf9eefe99102c7179563e599c713e282 Mon Sep 17 00:00:00 2001 From: code <37886057+intricko@users.noreply.github.com> Date: Sat, 5 Sep 2026 19:58:03 +0000 Subject: [PATCH 07/10] Replace Claude with Hermes in retrieval checks and remove commented-out code --- .github/workflows/devcontainer-ci.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/workflows/devcontainer-ci.yml b/.github/workflows/devcontainer-ci.yml index 553d730..57c6976 100644 --- a/.github/workflows/devcontainer-ci.yml +++ b/.github/workflows/devcontainer-ci.yml @@ -94,20 +94,13 @@ jobs: mnemon recall "$TEST_NAME" --limit 5 2>&1 | grep -q "$TEST_NAME" \ || { echo "FAIL: mnemon recall did not find $TEST_NAME"; exit 1; } - # echo "[3/3] Claude retrieves via mnemon..." - # CLAUDE_OUTPUT=$(timeout 60 docker exec -u abc "$CONTAINER_NAME" \ - # /config/.local/bin/claude --dangerously-skip-permissions -p \ - # "Use mnemon recall to find my name. Reply with ONLY the name." 2>&1) || true - # echo "Claude: $CLAUDE_OUTPUT" - # echo "$CLAUDE_OUTPUT" | grep -q "$TEST_NAME" \ - # || { echo "FAIL: Claude did not return $TEST_NAME"; } - echo "[3/3] Hermes retrieves via mnemon..." - CLAUDE_OUTPUT=$(timeout 60 docker exec -u abc "$CONTAINER_NAME" \ - hermes chat -q \ + echo "[3/3] Claude retrieves via mnemon..." + CLAUDE_OUTPUT=$(docker exec -u abc "$CONTAINER_NAME" \ + /config/.local/bin/claude --dangerously-skip-permissions -p \ "Use mnemon recall to find my name. Reply with ONLY the name." 2>&1) || true - echo "Hermes: $CLAUDE_OUTPUT" + echo "Claude: $CLAUDE_OUTPUT" echo "$CLAUDE_OUTPUT" | grep -q "$TEST_NAME" \ - || { echo "FAIL: Hermes did not return $TEST_NAME"; } + || { echo "FAIL: Claude did not return $TEST_NAME"; } echo "=== ALL MNEMON CHECKS PASSED ===" From c19d81364ace878fba6d845cb36c54d66e5cb27b Mon Sep 17 00:00:00 2001 From: code <37886057+intricko@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:01:18 +0000 Subject: [PATCH 08/10] Update PI Agent and OmniRoute versions in README.md; adjust Claude path in devcontainer-ci.yml --- .github/workflows/devcontainer-ci.yml | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/devcontainer-ci.yml b/.github/workflows/devcontainer-ci.yml index 57c6976..2a90b0b 100644 --- a/.github/workflows/devcontainer-ci.yml +++ b/.github/workflows/devcontainer-ci.yml @@ -96,7 +96,7 @@ jobs: echo "[3/3] Claude retrieves via mnemon..." CLAUDE_OUTPUT=$(docker exec -u abc "$CONTAINER_NAME" \ - /config/.local/bin/claude --dangerously-skip-permissions -p \ + $HOME/.local/bin/claude --dangerously-skip-permissions -p \ "Use mnemon recall to find my name. Reply with ONLY the name." 2>&1) || true echo "Claude: $CLAUDE_OUTPUT" echo "$CLAUDE_OUTPUT" | grep -q "$TEST_NAME" \ diff --git a/README.md b/README.md index 4588b96..373b435 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Dev Container](https://img.shields.io/badge/devcontainer-ready-blue?logo=docker)](https://containers.dev/) [![Hermes Agent](https://img.shields.io/badge/Hermes%20Agent-v2026.8.31-purple?logo=github)](https://github.com/NousResearch/hermes-agent) -[![PI Agent](https://img.shields.io/badge/PI%20Agent-v0.84.4-brown?logo=github)](https://pi.dev) +[![PI Agent](https://img.shields.io/badge/PI%20Agent-v0.85.1-brown?logo=github)](https://pi.dev) [![ModelRelay](https://img.shields.io/badge/ModelRelay-1.22.1-green?logo=npm)](https://www.npmjs.com/package/modelrelay) -[![OmniRoute](https://img.shields.io/badge/OmniRoute-3.8.49-orange?logo=npm)](https://www.npmjs.com/package/omniroute) +[![OmniRoute](https://img.shields.io/badge/OmniRoute-3.8.50-orange?logo=npm)](https://www.npmjs.com/package/omniroute) [![Ollama](https://img.shields.io/badge/Ollama-0.33.2-yellow?logo=ollama)](https://github.com/ollama/ollama) -[![Mnemon](https://img.shields.io/badge/Mnemon-0.2.7-pink?logo=github)](https://github.com/mnemon-dev/mnemon) +[![Mnemon](https://img.shields.io/badge/Mnemon-0.2.8-pink?logo=github)](https://github.com/mnemon-dev/mnemon) Fork this repo before [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/gitricko/hermes-codespace) From 9dd6d554a07a205da8856f375d595952663b367d Mon Sep 17 00:00:00 2001 From: gitricko Date: Sat, 5 Sep 2026 16:21:31 -0400 Subject: [PATCH 09/10] Fix CLAUDE_OUTPUT assignment in CI workflow --- .github/workflows/devcontainer-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/devcontainer-ci.yml b/.github/workflows/devcontainer-ci.yml index 2a90b0b..3591354 100644 --- a/.github/workflows/devcontainer-ci.yml +++ b/.github/workflows/devcontainer-ci.yml @@ -95,7 +95,7 @@ jobs: || { echo "FAIL: mnemon recall did not find $TEST_NAME"; exit 1; } echo "[3/3] Claude retrieves via mnemon..." - CLAUDE_OUTPUT=$(docker exec -u abc "$CONTAINER_NAME" \ + CLAUDE_OUTPUT=$( \ $HOME/.local/bin/claude --dangerously-skip-permissions -p \ "Use mnemon recall to find my name. Reply with ONLY the name." 2>&1) || true echo "Claude: $CLAUDE_OUTPUT" From 83d640fd3794c693de3e3e9d86b27120d722b5ef Mon Sep 17 00:00:00 2001 From: code <37886057+intricko@users.noreply.github.com> Date: Sat, 5 Sep 2026 17:07:53 -0400 Subject: [PATCH 10/10] Update CI workflow to trigger on specific paths --- .github/workflows/devcontainer-ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/devcontainer-ci.yml b/.github/workflows/devcontainer-ci.yml index 3591354..a342248 100644 --- a/.github/workflows/devcontainer-ci.yml +++ b/.github/workflows/devcontainer-ci.yml @@ -3,8 +3,15 @@ name: Dev Container CI on: push: branches: [main] + paths: + - '.devcontainer/**' + - '.github/workflows/**' + pull_request: branches: [main] + paths: + - '.devcontainer/**' + - '.github/workflows/**' permissions: contents: read