sync: 2026-03-14 19:00 — 20 files from Alexandria
Some checks failed
Lint & Format / detect (push) Has been cancelled
Lint & Format / js-lint (push) Has been cancelled
Lint & Format / py-lint (push) Has been cancelled
Lint & Format / sh-lint (push) Has been cancelled
Lint & Format / go-lint (push) Has been cancelled
Monorepo Lint / lint-shell (push) Has been cancelled
Monorepo Lint / lint-js (push) Has been cancelled

RoadChain-SHA2048: 49090281b11fa64d
RoadChain-Identity: alexa@sovereign
RoadChain-Full: 49090281b11fa64d807251c95479ebe075f31d76f6e32a0a400fb424dd75c8e0f0ef630b6cbafc47869b23364ee52a3558f7deaf5829a1a9a1a00fdbb7c51ec26b03883dec041b2ddead80ae82a9fa9e96931134125573e132a2fe678e6135e5ec2d2814b38a9ad22c1521cd1f32080a9743a9037c5874bcda89e728a2851a4363762c043ef4a58b04022d2156a94c5ee9cf06ce8291bcc497c962c92e3bd3b9d42d6b838d66e773eb32be3f20f615e099d4d9fa42adf12ed4440896f06043ebb8042a8a66be1f56719ec59641a1463e3fea975d54844fdc43a81c9718a86c1ffe1948b2cce9de6e948200fe6a1c5d27ad2e0b5d1999ee24828b6ebea3b131d7
This commit is contained in:
2026-03-14 19:00:02 -05:00
parent f7c1a96ca0
commit 7a7949712b
20 changed files with 506 additions and 343 deletions

View File

@@ -16,7 +16,7 @@ health: ## Check fleet health
code=$$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "https://$$w.amundsonalexa.workers.dev/health" 2>/dev/null); \ code=$$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "https://$$w.amundsonalexa.workers.dev/health" 2>/dev/null); \
if [ "$$code" = "200" ]; then echo "$$w"; else echo "$$w ($$code)"; fi; \ if [ "$$code" = "200" ]; then echo "$$w"; else echo "$$w ($$code)"; fi; \
done done
@for w in tollbooth road-search blackroad-stripe; do \ @for w in roadpay road-search blackroad-stripe; do \
code=$$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "https://$$w.amundsonalexa.workers.dev/health" 2>/dev/null); \ code=$$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "https://$$w.amundsonalexa.workers.dev/health" 2>/dev/null); \
if [ "$$code" = "200" ]; then echo "$$w"; else echo "$$w ($$code)"; fi; \ if [ "$$code" = "200" ]; then echo "$$w"; else echo "$$w ($$code)"; fi; \
done done

View File

@@ -1,50 +1,50 @@
[2026-03-14 18:12:01] [BEAT] [alice] load=0.91 mem=3299/3794MB temp=36.5C disk=87%
[2026-03-14 18:13:01] [BEAT] [alice] load=0.79 mem=3304/3794MB temp=34.1C disk=87%
[2026-03-14 18:13:22] [BEAT] [alice] load=0.70 mem=3303/3794MB temp=34.6C disk=87%
[2026-03-14 18:13:22] [BEAT] [alice] load=0.70 mem=3303/3794MB temp=34.1C disk=87%
[2026-03-14 18:14:01] [BEAT] [alice] load=0.67 mem=3300/3794MB temp=35.0C disk=87%
[2026-03-14 18:15:02] [BEAT] [alice] load=0.40 mem=3295/3794MB temp=36.0C disk=87%
[2026-03-14 18:15:47] [DIAL] [alice] Switchboard unreachable
[2026-03-14 18:16:01] [BEAT] [alice] load=1.61 mem=3301/3794MB temp=34.1C disk=87%
[2026-03-14 18:17:02] [BEAT] [alice] load=0.85 mem=3292/3794MB temp=35.0C disk=87%
[2026-03-14 18:18:01] [BEAT] [alice] load=1.00 mem=3305/3794MB temp=34.6C disk=87%
[2026-03-14 18:18:31] [BEAT] [alice] load=0.75 mem=3297/3794MB temp=34.6C disk=87%
[2026-03-14 18:18:31] [BEAT] [alice] load=0.75 mem=3301/3794MB temp=34.6C disk=87%
[2026-03-14 18:19:01] [BEAT] [alice] load=1.85 mem=3302/3794MB temp=34.1C disk=87%
[2026-03-14 18:20:01] [FLEET] [alice] Starting cross-node health check
[2026-03-14 18:20:01] [BEAT] [alice] load=2.00 mem=3284/3794MB temp=34.6C disk=87%
[2026-03-14 18:20:03] [FLEET] [alice] octavia: DOWN (no ping response)
[2026-03-14 18:20:03] [FLEET] [alice] cecilia: UP temp=45C mem=2888MB disk=19%
[2026-03-14 18:20:05] [FLEET] [alice] gematria: UP temp=C mem=4181MB disk=67%
[2026-03-14 18:20:06] [FLEET] [alice] lucidia: UP temp=61C mem=1243MB disk=32%
[2026-03-14 18:20:06] [FLEET] [alice] aria: UP temp=53C mem=6869MB disk=81%
[2026-03-14 18:20:07] [FLEET] [alice] anastasia: UP temp=C mem=371MB disk=69%
[2026-03-14 18:21:01] [BEAT] [alice] load=1.58 mem=3306/3794MB temp=34.6C disk=87%
[2026-03-14 18:22:01] [BEAT] [alice] load=0.97 mem=3304/3794MB temp=35.0C disk=87%
[2026-03-14 18:23:01] [BEAT] [alice] load=0.51 mem=3303/3794MB temp=33.1C disk=87%
[2026-03-14 18:23:52] [BEAT] [alice] load=0.75 mem=3303/3794MB temp=34.6C disk=87%
[2026-03-14 18:23:52] [BEAT] [alice] load=0.75 mem=3302/3794MB temp=35.0C disk=87%
[2026-03-14 18:24:01] [BEAT] [alice] load=0.85 mem=3302/3794MB temp=33.6C disk=87%
[2026-03-14 18:25:02] [BEAT] [alice] load=0.55 mem=3295/3794MB temp=36.0C disk=87%
[2026-03-14 18:25:55] [DIAL] [alice] Switchboard unreachable
[2026-03-14 18:26:01] [BEAT] [alice] load=0.87 mem=3307/3794MB temp=33.1C disk=87%
[2026-03-14 18:27:02] [BEAT] [alice] load=0.63 mem=3285/3794MB temp=36.0C disk=87%
[2026-03-14 18:28:01] [BEAT] [alice] load=0.88 mem=3302/3794MB temp=33.6C disk=87%
[2026-03-14 18:29:01] [BEAT] [alice] load=0.57 mem=3290/3794MB temp=38.0C disk=87%
[2026-03-14 18:29:02] [BEAT] [alice] load=0.57 mem=3298/3794MB temp=37.0C disk=87%
[2026-03-14 18:29:02] [BEAT] [alice] load=0.57 mem=3297/3794MB temp=37.5C disk=87%
[2026-03-14 18:30:01] [FLEET] [alice] Starting cross-node health check
[2026-03-14 18:30:01] [BEAT] [alice] load=0.44 mem=3291/3794MB temp=35.5C disk=87%
[2026-03-14 18:30:03] [FLEET] [alice] octavia: DOWN (no ping response)
[2026-03-14 18:30:04] [FLEET] [alice] cecilia: UP temp=44C mem=2799MB disk=19%
[2026-03-14 18:30:06] [FLEET] [alice] gematria: UP temp=C mem=4186MB disk=67%
[2026-03-14 18:30:07] [FLEET] [alice] lucidia: UP temp=62C mem=1186MB disk=33%
[2026-03-14 18:30:07] [FLEET] [alice] aria: UP temp=54C mem=6843MB disk=81%
[2026-03-14 18:30:08] [FLEET] [alice] anastasia: UP temp=C mem=343MB disk=69%
[2026-03-14 18:30:47] [DIAL] [alice] Switchboard unreachable
[2026-03-14 18:31:01] [BEAT] [alice] load=1.20 mem=3295/3794MB temp=35.0C disk=87% [2026-03-14 18:31:01] [BEAT] [alice] load=1.20 mem=3295/3794MB temp=35.0C disk=87%
[2026-03-14 18:32:02] [BEAT] [alice] load=0.58 mem=3305/3794MB temp=34.6C disk=87% [2026-03-14 18:32:02] [BEAT] [alice] load=0.58 mem=3305/3794MB temp=34.6C disk=87%
[2026-03-14 18:33:01] [BEAT] [alice] load=1.39 mem=3288/3794MB temp=35.0C disk=87% [2026-03-14 18:33:01] [BEAT] [alice] load=1.39 mem=3288/3794MB temp=35.0C disk=87%
[2026-03-14 18:34:01] [BEAT] [alice] load=0.77 mem=3305/3794MB temp=33.6C disk=87% [2026-03-14 18:34:01] [BEAT] [alice] load=0.77 mem=3305/3794MB temp=33.6C disk=87%
[2026-03-14 18:34:11] [BEAT] [alice] load=0.65 mem=3302/3794MB temp=34.6C disk=87% [2026-03-14 18:34:11] [BEAT] [alice] load=0.65 mem=3302/3794MB temp=34.6C disk=87%
[2026-03-14 18:34:11] [BEAT] [alice] load=0.65 mem=3302/3794MB temp=33.6C disk=87% [2026-03-14 18:34:11] [BEAT] [alice] load=0.65 mem=3302/3794MB temp=33.6C disk=87%
[2026-03-14 18:35:01] [BEAT] [alice] load=1.02 mem=3289/3794MB temp=34.6C disk=87%
[2026-03-14 18:36:01] [BEAT] [alice] load=0.79 mem=3302/3794MB temp=33.1C disk=87%
[2026-03-14 18:37:01] [BEAT] [alice] load=1.03 mem=3300/3794MB temp=33.6C disk=87%
[2026-03-14 18:38:01] [BEAT] [alice] load=1.10 mem=3301/3794MB temp=33.1C disk=87%
[2026-03-14 18:39:01] [BEAT] [alice] load=2.60 mem=3302/3794MB temp=34.6C disk=87%
[2026-03-14 18:39:22] [BEAT] [alice] load=1.93 mem=3300/3794MB temp=34.1C disk=87%
[2026-03-14 18:39:22] [BEAT] [alice] load=1.93 mem=3299/3794MB temp=34.1C disk=87%
[2026-03-14 18:40:01] [FLEET] [alice] Starting cross-node health check
[2026-03-14 18:40:01] [BEAT] [alice] load=1.37 mem=3297/3794MB temp=35.0C disk=87%
[2026-03-14 18:40:03] [FLEET] [alice] octavia: DOWN (no ping response)
[2026-03-14 18:40:03] [FLEET] [alice] cecilia: UP temp=40C mem=2845MB disk=19%
[2026-03-14 18:40:05] [FLEET] [alice] gematria: UP temp=C mem=4180MB disk=67%
[2026-03-14 18:40:05] [FLEET] [alice] lucidia: UP temp=56C mem=1225MB disk=33%
[2026-03-14 18:40:05] [FLEET] [alice] aria: UP temp=54C mem=6837MB disk=81%
[2026-03-14 18:40:06] [FLEET] [alice] anastasia: UP temp=C mem=341MB disk=69%
[2026-03-14 18:40:56] [DIAL] [alice] Switchboard unreachable
[2026-03-14 18:41:01] [BEAT] [alice] load=0.94 mem=3303/3794MB temp=34.6C disk=87%
[2026-03-14 18:42:02] [BEAT] [alice] load=0.96 mem=3298/3794MB temp=35.5C disk=87%
[2026-03-14 18:43:01] [BEAT] [alice] load=1.11 mem=3290/3794MB temp=34.6C disk=87%
[2026-03-14 18:44:01] [BEAT] [alice] load=0.70 mem=3299/3794MB temp=35.5C disk=87%
[2026-03-14 18:44:32] [BEAT] [alice] load=0.66 mem=3301/3794MB temp=34.1C disk=87%
[2026-03-14 18:44:32] [BEAT] [alice] load=0.66 mem=3300/3794MB temp=35.0C disk=87%
[2026-03-14 18:45:01] [BEAT] [alice] load=0.45 mem=3295/3794MB temp=35.0C disk=87%
[2026-03-14 18:45:47] [DIAL] [alice] Switchboard unreachable
[2026-03-14 18:46:01] [BEAT] [alice] load=1.85 mem=3297/3794MB temp=36.0C disk=87%
[2026-03-14 18:47:02] [BEAT] [alice] load=1.12 mem=3300/3794MB temp=34.6C disk=87%
[2026-03-14 18:48:01] [BEAT] [alice] load=1.77 mem=3303/3794MB temp=35.5C disk=87%
[2026-03-14 18:49:01] [BEAT] [alice] load=2.78 mem=3301/3794MB temp=33.6C disk=87%
[2026-03-14 18:49:41] [BEAT] [alice] load=1.89 mem=3300/3794MB temp=36.5C disk=87%
[2026-03-14 18:49:41] [BEAT] [alice] load=1.89 mem=3298/3794MB temp=37.0C disk=87%
[2026-03-14 18:50:01] [FLEET] [alice] Starting cross-node health check
[2026-03-14 18:50:01] [BEAT] [alice] load=1.68 mem=3273/3794MB temp=36.0C disk=87%
[2026-03-14 18:50:03] [FLEET] [alice] octavia: DOWN (no ping response)
[2026-03-14 18:50:04] [FLEET] [alice] cecilia: UP temp=52C mem=2808MB disk=19%
[2026-03-14 18:50:05] [FLEET] [alice] gematria: UP temp=C mem=4221MB disk=67%
[2026-03-14 18:50:05] [FLEET] [alice] lucidia: UP temp=56C mem=1178MB disk=33%
[2026-03-14 18:50:06] [FLEET] [alice] aria: UP temp=53C mem=6828MB disk=81%
[2026-03-14 18:50:07] [FLEET] [alice] anastasia: UP temp=C mem=244MB disk=69%
[2026-03-14 18:51:01] [BEAT] [alice] load=0.66 mem=3299/3794MB temp=34.1C disk=87%
[2026-03-14 18:52:01] [BEAT] [alice] load=1.41 mem=3300/3794MB temp=34.6C disk=87%
[2026-03-14 18:53:01] [BEAT] [alice] load=0.70 mem=3303/3794MB temp=33.6C disk=87%
[2026-03-14 18:54:01] [BEAT] [alice] load=0.88 mem=3298/3794MB temp=34.1C disk=87%
[2026-03-14 18:54:51] [BEAT] [alice] load=0.45 mem=3301/3794MB temp=33.6C disk=87%
[2026-03-14 18:54:51] [BEAT] [alice] load=0.45 mem=3300/3794MB temp=34.1C disk=87%

View File

@@ -1 +1 @@
{"node":"alice","ts":"2026-03-14T23:34:11Z","load":0.65,"mem_free_mb":3302,"mem_total_mb":3794,"temp_c":33.6,"disk_pct":87,"throttle":"0x0"} {"node":"alice","ts":"2026-03-14T23:54:51Z","load":0.45,"mem_free_mb":3300,"mem_total_mb":3794,"temp_c":34.1,"disk_pct":87,"throttle":"0x0"}

View File

@@ -1,4 +1,4 @@
LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=4703,fd=5)) LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=29789,fd=5))
LISTEN 0 511 0.0.0.0:8083 0.0.0.0:* users:(("node /usr/lib/n",pid=3182,fd=20)) LISTEN 0 511 0.0.0.0:8083 0.0.0.0:* users:(("node /usr/lib/n",pid=3182,fd=20))
LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* LISTEN 0 511 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8095 0.0.0.0:* users:(("python3",pid=23251,fd=3)) LISTEN 0 5 0.0.0.0:8095 0.0.0.0:* users:(("python3",pid=23251,fd=3))

View File

@@ -1,19 +1,19 @@
{ {
"hostname": "alice", "hostname": "alice",
"ts": "2026-03-14T23:34:14Z", "ts": "2026-03-14T23:54:53Z",
"uptime_seconds": 270957, "uptime_seconds": 272196,
"kernel": "6.1.21-v8+", "kernel": "6.1.21-v8+",
"temp_c": 34.6, "temp_c": 34.6,
"memory_mb": { "memory_mb": {
"total": 3794, "total": 3794,
"used": 403, "used": 406,
"free": 3301 "free": 3298
}, },
"disk": "12G/15G (87%)", "disk": "12G/15G (87%)",
"load": [ "load": [
0.92, 0.45,
0.9, 0.98,
0.96 1.09
], ],
"ollama_models": [ "ollama_models": [
"qwen2.5:3b", "qwen2.5:3b",
@@ -25,5 +25,5 @@
], ],
"throttle": "0x0", "throttle": "0x0",
"voltage": "0.9160V", "voltage": "0.9160V",
"services_running": 42 "services_running": 41
} }

View File

@@ -11,7 +11,7 @@ LISTEN 0 5 0.0.0.0:8787 0.0.0.0:* users:(("python3",pid
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=3461172,fd=8),("nginx",pid=3461171,fd=8)) LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=3461172,fd=8),("nginx",pid=3461171,fd=8))
LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=589,fd=4),("systemd",pid=1,fd=127)) LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=589,fd=4),("systemd",pid=1,fd=127))
LISTEN 0 4096 *:8080 *:* users:(("headscale",pid=2341808,fd=12)) LISTEN 0 4096 *:8080 *:* users:(("headscale",pid=2341808,fd=12))
LISTEN 0 511 *:3000 *:* users:(("node /srv/hello",pid=1491207,fd=19)) LISTEN 0 511 *:3000 *:* users:(("node /srv/hello",pid=1495381,fd=19))
LISTEN 0 511 *:3001 *:* users:(("node",pid=757,fd=21)) LISTEN 0 511 *:3001 *:* users:(("node",pid=757,fd=21))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=991,fd=8)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=991,fd=8))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=3461172,fd=9),("nginx",pid=3461171,fd=9)) LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=3461172,fd=9),("nginx",pid=3461171,fd=9))

View File

@@ -1,19 +1,19 @@
{ {
"hostname": "anastasia", "hostname": "anastasia",
"ts": "2026-03-14T23:34:13Z", "ts": "2026-03-14T23:54:53Z",
"uptime_seconds": 6673145, "uptime_seconds": 6674385,
"kernel": "5.14.0-651.el9.x86_64", "kernel": "5.14.0-651.el9.x86_64",
"temp_c": 0, "temp_c": 0,
"memory_mb": { "memory_mb": {
"total": 765, "total": 765,
"used": 414, "used": 413,
"free": 350 "free": 351
}, },
"disk": "18G/25G (69%)", "disk": "18G/25G (69%)",
"load": [ "load": [
0.0, 0.05,
0.02, 0.05,
0.04 0.03
], ],
"ollama_models": [], "ollama_models": [],
"throttle": "N/A", "throttle": "N/A",

View File

@@ -1,46 +1,3 @@
[2026-03-14 18:11:01] [BEAT] [aria] load=0.13 mem=6895/8059MB temp=52.4C disk=81%
[2026-03-14 18:12:01] [BEAT] [aria] load=0.05 mem=6910/8059MB temp=52.4C disk=81%
[2026-03-14 18:13:01] [BEAT] [aria] load=0.16 mem=6913/8059MB temp=51.8C disk=81%
[2026-03-14 18:13:21] [BEAT] [aria] load=0.12 mem=6910/8059MB temp=51.8C disk=81%
[2026-03-14 18:13:21] [BEAT] [aria] load=0.12 mem=6909/8059MB temp=52.9C disk=81%
[2026-03-14 18:14:01] [BEAT] [aria] load=0.06 mem=6908/8059MB temp=52.4C disk=81%
[2026-03-14 18:15:01] [BEAT] [aria] load=0.67 mem=6873/8059MB temp=53.5C disk=81%
[2026-03-14 18:15:46] [DIAL] [aria] Switchboard unreachable
[2026-03-14 18:16:01] [BEAT] [aria] load=0.64 mem=6902/8059MB temp=52.9C disk=81%
[2026-03-14 18:17:01] [BEAT] [aria] load=0.27 mem=6910/8059MB temp=52.4C disk=81%
[2026-03-14 18:18:01] [BEAT] [aria] load=0.18 mem=6911/8059MB temp=53.5C disk=81%
[2026-03-14 18:18:31] [BEAT] [aria] load=0.22 mem=6905/8059MB temp=52.9C disk=81%
[2026-03-14 18:18:31] [BEAT] [aria] load=0.22 mem=6902/8059MB temp=52.4C disk=81%
[2026-03-14 18:19:01] [BEAT] [aria] load=0.13 mem=6905/8059MB temp=52.4C disk=81%
[2026-03-14 18:20:01] [FLEET] [aria] Starting cross-node health check
[2026-03-14 18:20:01] [BEAT] [aria] load=0.05 mem=6870/8059MB temp=52.4C disk=81%
[2026-03-14 18:20:02] [FLEET] [aria] alice: UP temp=36C mem=3292MB disk=87%
[2026-03-14 18:20:04] [FLEET] [aria] octavia: DOWN (no ping response)
[2026-03-14 18:20:04] [FLEET] [aria] cecilia: UP temp=45C mem=2850MB disk=19%
[2026-03-14 18:20:06] [FLEET] [aria] gematria: UP temp=C mem=4184MB disk=67%
[2026-03-14 18:20:06] [FLEET] [aria] lucidia: UP temp=61C mem=1216MB disk=32%
[2026-03-14 18:20:07] [FLEET] [aria] anastasia: UP temp=C mem=371MB disk=69%
[2026-03-14 18:21:01] [BEAT] [aria] load=0.17 mem=6894/8059MB temp=52.4C disk=81%
[2026-03-14 18:22:01] [BEAT] [aria] load=0.11 mem=6904/8059MB temp=53.5C disk=81%
[2026-03-14 18:23:01] [BEAT] [aria] load=0.31 mem=6901/8059MB temp=52.4C disk=81%
[2026-03-14 18:23:52] [BEAT] [aria] load=0.23 mem=6901/8059MB temp=52.4C disk=81%
[2026-03-14 18:23:52] [BEAT] [aria] load=0.23 mem=6899/8059MB temp=52.9C disk=81%
[2026-03-14 18:24:01] [BEAT] [aria] load=0.42 mem=6897/8059MB temp=52.9C disk=81%
[2026-03-14 18:25:01] [BEAT] [aria] load=0.15 mem=6870/8059MB temp=53.5C disk=81%
[2026-03-14 18:26:01] [BEAT] [aria] load=0.21 mem=6894/8059MB temp=53.5C disk=81%
[2026-03-14 18:27:01] [BEAT] [aria] load=0.19 mem=6902/8059MB temp=54.0C disk=81%
[2026-03-14 18:28:01] [BEAT] [aria] load=0.12 mem=6902/8059MB temp=52.9C disk=81%
[2026-03-14 18:29:01] [BEAT] [aria] load=0.10 mem=6898/8059MB temp=51.8C disk=81%
[2026-03-14 18:29:02] [BEAT] [aria] load=0.10 mem=6895/8059MB temp=52.9C disk=81%
[2026-03-14 18:29:02] [BEAT] [aria] load=0.10 mem=6892/8059MB temp=52.9C disk=81%
[2026-03-14 18:30:01] [FLEET] [aria] Starting cross-node health check
[2026-03-14 18:30:01] [BEAT] [aria] load=0.04 mem=6870/8059MB temp=53.5C disk=81%
[2026-03-14 18:30:01] [FLEET] [aria] alice: UP temp=36C mem=3291MB disk=87%
[2026-03-14 18:30:03] [FLEET] [aria] octavia: DOWN (no ping response)
[2026-03-14 18:30:04] [FLEET] [aria] cecilia: UP temp=43C mem=2797MB disk=19%
[2026-03-14 18:30:06] [FLEET] [aria] gematria: UP temp=C mem=4186MB disk=67%
[2026-03-14 18:30:07] [FLEET] [aria] lucidia: UP temp=61C mem=1185MB disk=33%
[2026-03-14 18:30:07] [FLEET] [aria] anastasia: UP temp=C mem=343MB disk=69%
[2026-03-14 18:30:46] [DIAL] [aria] Switchboard unreachable [2026-03-14 18:30:46] [DIAL] [aria] Switchboard unreachable
[2026-03-14 18:31:01] [BEAT] [aria] load=0.04 mem=6883/8059MB temp=53.5C disk=81% [2026-03-14 18:31:01] [BEAT] [aria] load=0.04 mem=6883/8059MB temp=53.5C disk=81%
[2026-03-14 18:32:01] [BEAT] [aria] load=0.09 mem=6900/8059MB temp=52.9C disk=81% [2026-03-14 18:32:01] [BEAT] [aria] load=0.09 mem=6900/8059MB temp=52.9C disk=81%
@@ -48,3 +5,46 @@
[2026-03-14 18:34:01] [BEAT] [aria] load=0.32 mem=6902/8059MB temp=54.0C disk=81% [2026-03-14 18:34:01] [BEAT] [aria] load=0.32 mem=6902/8059MB temp=54.0C disk=81%
[2026-03-14 18:34:11] [BEAT] [aria] load=0.27 mem=6899/8059MB temp=54.0C disk=81% [2026-03-14 18:34:11] [BEAT] [aria] load=0.27 mem=6899/8059MB temp=54.0C disk=81%
[2026-03-14 18:34:11] [BEAT] [aria] load=0.27 mem=6897/8059MB temp=53.5C disk=81% [2026-03-14 18:34:11] [BEAT] [aria] load=0.27 mem=6897/8059MB temp=53.5C disk=81%
[2026-03-14 18:35:01] [BEAT] [aria] load=0.19 mem=6866/8059MB temp=54.5C disk=81%
[2026-03-14 18:36:01] [BEAT] [aria] load=1.11 mem=6888/8059MB temp=53.5C disk=81%
[2026-03-14 18:37:01] [BEAT] [aria] load=0.79 mem=6895/8059MB temp=53.5C disk=81%
[2026-03-14 18:38:01] [BEAT] [aria] load=0.34 mem=6887/8059MB temp=52.9C disk=81%
[2026-03-14 18:39:02] [BEAT] [aria] load=0.18 mem=6895/8059MB temp=52.9C disk=81%
[2026-03-14 18:39:22] [BEAT] [aria] load=0.21 mem=6894/8059MB temp=53.5C disk=81%
[2026-03-14 18:39:22] [BEAT] [aria] load=0.21 mem=6892/8059MB temp=52.9C disk=81%
[2026-03-14 18:40:01] [FLEET] [aria] Starting cross-node health check
[2026-03-14 18:40:01] [BEAT] [aria] load=0.11 mem=6869/8059MB temp=54.0C disk=81%
[2026-03-14 18:40:01] [FLEET] [aria] alice: UP temp=35C mem=3297MB disk=87%
[2026-03-14 18:40:03] [FLEET] [aria] octavia: DOWN (no ping response)
[2026-03-14 18:40:03] [FLEET] [aria] cecilia: UP temp=40C mem=2844MB disk=19%
[2026-03-14 18:40:05] [FLEET] [aria] gematria: UP temp=C mem=4180MB disk=67%
[2026-03-14 18:40:05] [FLEET] [aria] lucidia: UP temp=56C mem=1225MB disk=33%
[2026-03-14 18:40:06] [FLEET] [aria] anastasia: UP temp=C mem=341MB disk=69%
[2026-03-14 18:41:01] [BEAT] [aria] load=0.04 mem=6894/8059MB temp=53.5C disk=81%
[2026-03-14 18:42:01] [BEAT] [aria] load=0.25 mem=6894/8059MB temp=52.9C disk=81%
[2026-03-14 18:43:01] [BEAT] [aria] load=0.28 mem=6890/8059MB temp=53.5C disk=81%
[2026-03-14 18:44:01] [BEAT] [aria] load=0.10 mem=6894/8059MB temp=53.5C disk=81%
[2026-03-14 18:44:32] [BEAT] [aria] load=0.06 mem=6892/8059MB temp=53.5C disk=81%
[2026-03-14 18:44:32] [BEAT] [aria] load=0.06 mem=6891/8059MB temp=54.5C disk=81%
[2026-03-14 18:45:01] [BEAT] [aria] load=0.04 mem=6856/8059MB temp=55.1C disk=81%
[2026-03-14 18:45:46] [DIAL] [aria] Switchboard unreachable
[2026-03-14 18:46:01] [BEAT] [aria] load=0.05 mem=6888/8059MB temp=54.0C disk=81%
[2026-03-14 18:47:01] [BEAT] [aria] load=0.18 mem=6892/8059MB temp=53.5C disk=81%
[2026-03-14 18:48:01] [BEAT] [aria] load=0.06 mem=6889/8059MB temp=52.4C disk=81%
[2026-03-14 18:49:01] [BEAT] [aria] load=0.11 mem=6890/8059MB temp=52.9C disk=81%
[2026-03-14 18:49:41] [BEAT] [aria] load=0.14 mem=6891/8059MB temp=54.5C disk=81%
[2026-03-14 18:49:41] [BEAT] [aria] load=0.14 mem=6889/8059MB temp=53.5C disk=81%
[2026-03-14 18:50:01] [FLEET] [aria] Starting cross-node health check
[2026-03-14 18:50:01] [BEAT] [aria] load=0.10 mem=6857/8059MB temp=54.0C disk=81%
[2026-03-14 18:50:02] [FLEET] [aria] alice: UP temp=37C mem=3279MB disk=87%
[2026-03-14 18:50:04] [FLEET] [aria] octavia: DOWN (no ping response)
[2026-03-14 18:50:04] [FLEET] [aria] cecilia: UP temp=52C mem=2806MB disk=19%
[2026-03-14 18:50:06] [FLEET] [aria] gematria: UP temp=C mem=4218MB disk=67%
[2026-03-14 18:50:06] [FLEET] [aria] lucidia: UP temp=56C mem=1183MB disk=33%
[2026-03-14 18:50:07] [FLEET] [aria] anastasia: UP temp=C mem=244MB disk=69%
[2026-03-14 18:51:01] [BEAT] [aria] load=0.34 mem=6888/8059MB temp=52.9C disk=81%
[2026-03-14 18:52:01] [BEAT] [aria] load=0.26 mem=6890/8059MB temp=52.9C disk=81%
[2026-03-14 18:53:01] [BEAT] [aria] load=0.09 mem=6886/8059MB temp=52.9C disk=81%
[2026-03-14 18:54:01] [BEAT] [aria] load=0.14 mem=6889/8059MB temp=52.9C disk=81%
[2026-03-14 18:54:51] [BEAT] [aria] load=0.07 mem=6890/8059MB temp=52.4C disk=81%
[2026-03-14 18:54:51] [BEAT] [aria] load=0.07 mem=6886/8059MB temp=54.0C disk=81%

View File

@@ -1 +1 @@
{"node":"aria","ts":"2026-03-14T23:34:11Z","load":0.27,"mem_free_mb":6897,"mem_total_mb":8059,"temp_c":53.5,"disk_pct":81,"throttle":"N/A"} {"node":"aria","ts":"2026-03-15T00:00:00Z","load":0.17,"mem_free_mb":6943,"mem_total_mb":8059,"temp_c":50.7,"disk_pct":81,"throttle":"N/A"}

View File

@@ -1,29 +0,0 @@
{
"hostname": "aria",
"ts": "2026-03-14T23:34:12Z",
"uptime_seconds": 64227,
"kernel": "6.12.62+rpt-rpi-2712",
"temp_c": 52.9,
"memory_mb": {
"total": 8059,
"used": 1168,
"free": 6890
},
"disk": "22G/29G (81%)",
"load": [
0.27,
0.17,
0.16
],
"ollama_models": [
"nomic-embed-text:latest",
"deepseek-r1:1.5b",
"llama3.2:1b",
"llama3.2:3b",
"tinyllama:latest",
"qwen2.5-coder:3b"
],
"throttle": "N/A",
"voltage": "N/A",
"services_running": 39
}

View File

@@ -1,50 +1,50 @@
[2026-03-14 18:16:01] [DIAL] [cecilia] Switchboard unreachable [2026-03-14 18:36:01] [BEAT] [cecilia] load=0.35 mem=2890/8058MB temp=40.2C disk=19%
[2026-03-14 18:16:01] [BEAT] [cecilia] load=4.66 mem=2629/8058MB temp=54.5C disk=19% [2026-03-14 18:37:01] [BEAT] [cecilia] load=0.27 mem=2891/8058MB temp=39.7C disk=19%
[2026-03-14 18:17:01] [BEAT] [cecilia] load=4.45 mem=2634/8058MB temp=55.1C disk=19% [2026-03-14 18:38:01] [BEAT] [cecilia] load=0.37 mem=2876/8058MB temp=39.7C disk=19%
[2026-03-14 18:18:01] [BEAT] [cecilia] load=4.35 mem=2646/8058MB temp=56.8C disk=19% [2026-03-14 18:39:01] [BEAT] [cecilia] load=0.32 mem=2869/8058MB temp=39.1C disk=19%
[2026-03-14 18:18:31] [BEAT] [cecilia] load=2.90 mem=2656/8058MB temp=46.3C disk=19% [2026-03-14 18:39:22] [BEAT] [cecilia] load=0.22 mem=2866/8058MB temp=40.2C disk=19%
[2026-03-14 18:18:31] [BEAT] [cecilia] load=2.90 mem=2654/8058MB temp=46.9C disk=19% [2026-03-14 18:39:22] [BEAT] [cecilia] load=0.22 mem=2863/8058MB temp=39.1C disk=19%
[2026-03-14 18:19:01] [BEAT] [cecilia] load=2.03 mem=2657/8058MB temp=45.2C disk=19% [2026-03-14 18:40:01] [FLEET] [cecilia] Starting cross-node health check
[2026-03-14 18:20:01] [FLEET] [cecilia] Starting cross-node health check [2026-03-14 18:40:01] [BEAT] [cecilia] load=0.22 mem=2844/8058MB temp=40.2C disk=19%
[2026-03-14 18:20:01] [BEAT] [cecilia] load=1.01 mem=2619/8058MB temp=45.2C disk=19% [2026-03-14 18:40:02] [HEAL] [cecilia] OOM kills detected (1) — clearing caches
[2026-03-14 18:20:02] [HEAL] [cecilia] OOM kills detected (1) — clearing caches [2026-03-14 18:40:02] [HEAL] [cecilia] High swap: 881MB — clearing inactive
[2026-03-14 18:20:02] [FLEET] [cecilia] alice: UP temp=36C mem=3289MB disk=87% [2026-03-14 18:40:02] [FLEET] [cecilia] alice: UP temp=36C mem=3295MB disk=87%
[2026-03-14 18:20:02] [HEAL] [cecilia] High swap: 882MB — clearing inactive [2026-03-14 18:40:04] [FLEET] [cecilia] octavia: DOWN (no ping response)
[2026-03-14 18:20:04] [FLEET] [cecilia] octavia: DOWN (no ping response) [2026-03-14 18:40:05] [FLEET] [cecilia] gematria: UP temp=C mem=4180MB disk=67%
[2026-03-14 18:20:05] [FLEET] [cecilia] gematria: UP temp=C mem=4184MB disk=67% [2026-03-14 18:40:06] [FLEET] [cecilia] lucidia: UP temp=57C mem=1227MB disk=33%
[2026-03-14 18:20:06] [FLEET] [cecilia] lucidia: UP temp=60C mem=1202MB disk=32% [2026-03-14 18:40:06] [FLEET] [cecilia] aria: UP temp=55C mem=6855MB disk=81%
[2026-03-14 18:20:06] [FLEET] [cecilia] aria: UP temp=53C mem=6868MB disk=81% [2026-03-14 18:40:07] [FLEET] [cecilia] anastasia: UP temp=C mem=342MB disk=69%
[2026-03-14 18:20:07] [FLEET] [cecilia] anastasia: UP temp=C mem=371MB disk=69% [2026-03-14 18:41:01] [BEAT] [cecilia] load=0.44 mem=2859/8058MB temp=38.6C disk=19%
[2026-03-14 18:21:01] [BEAT] [cecilia] load=0.48 mem=2881/8058MB temp=43.5C disk=19% [2026-03-14 18:42:01] [BEAT] [cecilia] load=0.35 mem=2862/8058MB temp=39.1C disk=19%
[2026-03-14 18:22:01] [BEAT] [cecilia] load=0.21 mem=2878/8058MB temp=43.5C disk=19% [2026-03-14 18:43:01] [BEAT] [cecilia] load=0.24 mem=2857/8058MB temp=38.6C disk=19%
[2026-03-14 18:23:01] [BEAT] [cecilia] load=0.23 mem=2878/8058MB temp=42.5C disk=19% [2026-03-14 18:44:01] [BEAT] [cecilia] load=0.27 mem=2859/8058MB temp=38.0C disk=19%
[2026-03-14 18:23:52] [BEAT] [cecilia] load=0.28 mem=2872/8058MB temp=41.4C disk=19% [2026-03-14 18:44:32] [BEAT] [cecilia] load=0.41 mem=2855/8058MB temp=37.5C disk=19%
[2026-03-14 18:23:52] [BEAT] [cecilia] load=0.28 mem=2868/8058MB temp=40.2C disk=19% [2026-03-14 18:44:32] [BEAT] [cecilia] load=0.41 mem=2853/8058MB temp=37.5C disk=19%
[2026-03-14 18:24:01] [BEAT] [cecilia] load=0.39 mem=2870/8058MB temp=41.4C disk=19% [2026-03-14 18:45:01] [BEAT] [cecilia] load=0.78 mem=2803/8058MB temp=38.0C disk=19%
[2026-03-14 18:25:02] [BEAT] [cecilia] load=2.62 mem=2798/8058MB temp=51.2C disk=19% [2026-03-14 18:45:02] [HEAL] [cecilia] OOM kills detected (1) — clearing caches
[2026-03-14 18:25:02] [HEAL] [cecilia] OOM kills detected (1) — clearing caches [2026-03-14 18:45:02] [HEAL] [cecilia] Zombie processes: 70
[2026-03-14 18:25:02] [HEAL] [cecilia] High swap: 882MB — clearing inactive [2026-03-14 18:45:02] [HEAL] [cecilia] High swap: 880MB — clearing inactive
[2026-03-14 18:26:01] [BEAT] [cecilia] load=3.85 mem=2851/8058MB temp=54.0C disk=19% [2026-03-14 18:45:46] [DIAL] [cecilia] Switchboard unreachable
[2026-03-14 18:27:01] [BEAT] [cecilia] load=4.51 mem=2864/8058MB temp=54.5C disk=19% [2026-03-14 18:46:01] [BEAT] [cecilia] load=0.44 mem=2674/8058MB temp=39.7C disk=19%
[2026-03-14 18:28:01] [BEAT] [cecilia] load=2.26 mem=2914/8058MB temp=43.5C disk=19% [2026-03-14 18:46:05] [DIAL] [cecilia] Switchboard unreachable
[2026-03-14 18:29:01] [BEAT] [cecilia] load=1.07 mem=2932/8058MB temp=43.0C disk=19% [2026-03-14 18:47:01] [BEAT] [cecilia] load=0.26 mem=2695/8058MB temp=38.6C disk=19%
[2026-03-14 18:29:02] [BEAT] [cecilia] load=1.07 mem=2927/8058MB temp=43.5C disk=19% [2026-03-14 18:48:01] [BEAT] [cecilia] load=0.29 mem=2695/8058MB temp=38.0C disk=19%
[2026-03-14 18:29:02] [BEAT] [cecilia] load=1.07 mem=2925/8058MB temp=43.5C disk=19% [2026-03-14 18:49:02] [BEAT] [cecilia] load=2.82 mem=2676/8058MB temp=50.7C disk=19%
[2026-03-14 18:30:01] [FLEET] [cecilia] Starting cross-node health check [2026-03-14 18:49:41] [BEAT] [cecilia] load=3.51 mem=2673/8058MB temp=51.8C disk=19%
[2026-03-14 18:30:01] [BEAT] [cecilia] load=0.60 mem=2884/8058MB temp=44.1C disk=19% [2026-03-14 18:49:41] [BEAT] [cecilia] load=3.51 mem=2672/8058MB temp=51.2C disk=19%
[2026-03-14 18:30:02] [HEAL] [cecilia] OOM kills detected (1) — clearing caches [2026-03-14 18:50:01] [FLEET] [cecilia] Starting cross-node health check
[2026-03-14 18:30:02] [HEAL] [cecilia] High swap: 881MB — clearing inactive [2026-03-14 18:50:01] [BEAT] [cecilia] load=3.96 mem=2648/8058MB temp=51.2C disk=19%
[2026-03-14 18:30:02] [FLEET] [cecilia] alice: UP temp=36C mem=3290MB disk=87% [2026-03-14 18:50:01] [HEAL] [cecilia] OOM kills detected (1) — clearing caches
[2026-03-14 18:30:04] [FLEET] [cecilia] octavia: DOWN (no ping response) [2026-03-14 18:50:01] [FLEET] [cecilia] alice: UP temp=37C mem=3288MB disk=87%
[2026-03-14 18:30:06] [FLEET] [cecilia] gematria: UP temp=C mem=4186MB disk=67% [2026-03-14 18:50:02] [HEAL] [cecilia] High swap: 866MB — clearing inactive
[2026-03-14 18:30:07] [FLEET] [cecilia] lucidia: UP temp=61C mem=1184MB disk=33% [2026-03-14 18:50:03] [FLEET] [cecilia] octavia: DOWN (no ping response)
[2026-03-14 18:30:07] [FLEET] [cecilia] aria: UP temp=56C mem=6843MB disk=81% [2026-03-14 18:50:05] [FLEET] [cecilia] gematria: UP temp=C mem=4221MB disk=67%
[2026-03-14 18:30:08] [FLEET] [cecilia] anastasia: UP temp=C mem=343MB disk=69% [2026-03-14 18:50:06] [FLEET] [cecilia] lucidia: UP temp=55C mem=1179MB disk=33%
[2026-03-14 18:30:46] [DIAL] [cecilia] Switchboard unreachable [2026-03-14 18:50:06] [FLEET] [cecilia] aria: UP temp=55C mem=6837MB disk=81%
[2026-03-14 18:31:01] [BEAT] [cecilia] load=0.39 mem=2739/8058MB temp=40.8C disk=19% [2026-03-14 18:50:07] [FLEET] [cecilia] anastasia: UP temp=C mem=244MB disk=69%
[2026-03-14 18:31:03] [DIAL] [cecilia] Switchboard unreachable [2026-03-14 18:51:01] [BEAT] [cecilia] load=4.27 mem=2861/8058MB temp=52.9C disk=19%
[2026-03-14 18:32:01] [BEAT] [cecilia] load=0.26 mem=2738/8058MB temp=41.4C disk=19% [2026-03-14 18:52:01] [BEAT] [cecilia] load=1.86 mem=2863/8058MB temp=43.5C disk=19%
[2026-03-14 18:33:01] [BEAT] [cecilia] load=1.17 mem=2728/8058MB temp=41.4C disk=19% [2026-03-14 18:53:01] [BEAT] [cecilia] load=1.28 mem=2866/8058MB temp=41.9C disk=19%
[2026-03-14 18:34:01] [BEAT] [cecilia] load=1.67 mem=2722/8058MB temp=39.1C disk=19% [2026-03-14 18:54:01] [BEAT] [cecilia] load=1.47 mem=2861/8058MB temp=41.4C disk=19%
[2026-03-14 18:34:11] [BEAT] [cecilia] load=1.57 mem=2716/8058MB temp=40.2C disk=19% [2026-03-14 18:54:51] [BEAT] [cecilia] load=1.23 mem=2856/8058MB temp=40.8C disk=19%
[2026-03-14 18:34:11] [BEAT] [cecilia] load=1.57 mem=2716/8058MB temp=40.2C disk=19% [2026-03-14 18:54:51] [BEAT] [cecilia] load=1.23 mem=2853/8058MB temp=41.4C disk=19%

View File

@@ -1 +1 @@
{"node":"cecilia","ts":"2026-03-14T23:34:11Z","load":1.57,"mem_free_mb":2716,"mem_total_mb":8058,"temp_c":40.2,"disk_pct":19,"throttle":"N/A"} {"node":"cecilia","ts":"2026-03-15T00:00:00Z","load":0.44,"mem_free_mb":2836,"mem_total_mb":8058,"temp_c":39.1,"disk_pct":19,"throttle":"N/A"}

View File

@@ -13,7 +13,7 @@ LISTEN 0 128 0.0.0.0:5001 0.0.0.0:* users:(("python3",pid
LISTEN 0 128 0.0.0.0:5002 0.0.0.0:* users:(("python3",pid=1550,fd=3)) LISTEN 0 128 0.0.0.0:5002 0.0.0.0:* users:(("python3",pid=1550,fd=3))
LISTEN 0 5 0.0.0.0:9100 0.0.0.0:* LISTEN 0 5 0.0.0.0:9100 0.0.0.0:*
LISTEN 0 511 0.0.0.0:3100 0.0.0.0:* LISTEN 0 511 0.0.0.0:3100 0.0.0.0:*
LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=2111792,fd=5)) LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=2188071,fd=5))
LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* LISTEN 0 511 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 5 0.0.0.0:4010 0.0.0.0:* users:(("python3",pid=1881559,fd=3)) LISTEN 0 5 0.0.0.0:4010 0.0.0.0:* users:(("python3",pid=1881559,fd=3))
LISTEN 0 4096 127.0.0.1:8088 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8088 0.0.0.0:*

View File

@@ -1,38 +0,0 @@
{
"hostname": "cecilia",
"ts": "2026-03-14T23:34:12Z",
"uptime_seconds": 78726,
"kernel": "6.12.62+rpt-rpi-2712",
"temp_c": 41.4,
"memory_mb": {
"total": 8058,
"used": 5354,
"free": 2704
},
"disk": "79G/457G (19%)",
"load": [
1.57,
1.45,
1.68
],
"ollama_models": [
"deepseek-r1:1.5b",
"nomic-embed-text:latest",
"hf.co/mradermacher/OpenELM-1_1B-Instruct-GGUF:Q4_K_M",
"hf.co/mradermacher/OpenELM-3B-Instruct-GGUF:Q4_K_M",
"cece2:latest",
"qwen3:8b",
"llama3:8b-instruct-q4_K_M",
"cece:latest",
"deepseek-coder:1.3b",
"qwen2.5-coder:3b",
"llama3.2:3b",
"tinyllama:latest",
"llama3.2:latest",
"codellama:7b",
"llama3.2:1b"
],
"throttle": "N/A",
"voltage": "N/A",
"services_running": 39
}

View File

@@ -1,18 +1,18 @@
{ {
"hostname": "gematria", "hostname": "gematria",
"ts": "2026-03-14T23:34:14Z", "ts": "2026-03-14T23:54:55Z",
"uptime_seconds": 5330448, "uptime_seconds": 5331688,
"kernel": "5.15.0-113-generic", "kernel": "5.15.0-113-generic",
"temp_c": 0, "temp_c": 0,
"memory_mb": { "memory_mb": {
"total": 7937, "total": 7937,
"used": 3304, "used": 3295,
"free": 4185 "free": 4198
}, },
"disk": "52G/78G (67%)", "disk": "52G/78G (67%)",
"load": [ "load": [
3.18, 3.04,
3.08, 3.05,
3.07 3.07
], ],
"ollama_models": [ "ollama_models": [

View File

@@ -1,50 +1,50 @@
[2026-03-14 18:14:01] [BEAT] [lucidia] load=2.05 mem=1257/8059MB temp=55.1C disk=32%
[2026-03-14 18:15:01] [BEAT] [lucidia] load=1.69 mem=1235/8059MB temp=56.2C disk=32%
[2026-03-14 18:15:01] [HEAL] [lucidia] High swap: 3708MB — clearing inactive
[2026-03-14 18:15:46] [DIAL] [lucidia] Switchboard unreachable
[2026-03-14 18:16:01] [BEAT] [lucidia] load=3.41 mem=1218/8059MB temp=63.4C disk=32%
[2026-03-14 18:17:01] [BEAT] [lucidia] load=2.19 mem=1221/8059MB temp=55.6C disk=32%
[2026-03-14 18:18:01] [BEAT] [lucidia] load=1.60 mem=1302/8059MB temp=55.1C disk=32%
[2026-03-14 18:18:48] [BEAT] [lucidia] load=22.05 mem=1230/8059MB temp=61.1C disk=32%
[2026-03-14 18:18:48] [BEAT] [lucidia] load=22.05 mem=1226/8059MB temp=62.2C disk=32%
[2026-03-14 18:19:01] [BEAT] [lucidia] load=18.08 mem=1246/8059MB temp=57.3C disk=32%
[2026-03-14 18:20:02] [FLEET] [lucidia] Starting cross-node health check
[2026-03-14 18:20:02] [BEAT] [lucidia] load=7.62 mem=1277/8059MB temp=60.0C disk=32%
[2026-03-14 18:20:02] [HEAL] [lucidia] High swap: 3707MB — clearing inactive
[2026-03-14 18:20:02] [FLEET] [lucidia] alice: UP temp=36C mem=3297MB disk=87%
[2026-03-14 18:20:04] [FLEET] [lucidia] octavia: DOWN (no ping response)
[2026-03-14 18:20:05] [FLEET] [lucidia] cecilia: UP temp=45C mem=2834MB disk=19%
[2026-03-14 18:20:07] [FLEET] [lucidia] gematria: UP temp=C mem=4183MB disk=67%
[2026-03-14 18:20:07] [FLEET] [lucidia] aria: UP temp=55C mem=6870MB disk=81%
[2026-03-14 18:20:08] [FLEET] [lucidia] anastasia: UP temp=C mem=371MB disk=69%
[2026-03-14 18:21:01] [BEAT] [lucidia] load=4.05 mem=1230/8059MB temp=55.1C disk=32%
[2026-03-14 18:22:09] [BEAT] [lucidia] load=29.86 mem=1261/8059MB temp=52.9C disk=32%
[2026-03-14 18:23:01] [BEAT] [lucidia] load=30.33 mem=1214/8059MB temp=53.5C disk=32%
[2026-03-14 18:23:52] [BEAT] [lucidia] load=15.05 mem=1209/8059MB temp=55.6C disk=32%
[2026-03-14 18:23:52] [BEAT] [lucidia] load=15.05 mem=1208/8059MB temp=54.5C disk=32%
[2026-03-14 18:24:01] [BEAT] [lucidia] load=12.81 mem=1243/8059MB temp=54.5C disk=32%
[2026-03-14 18:25:02] [BEAT] [lucidia] load=6.77 mem=1232/8059MB temp=60.6C disk=32%
[2026-03-14 18:25:02] [HEAL] [lucidia] High swap: 3707MB — clearing inactive
[2026-03-14 18:26:01] [BEAT] [lucidia] load=3.78 mem=1207/8059MB temp=55.6C disk=32%
[2026-03-14 18:27:01] [BEAT] [lucidia] load=23.06 mem=1254/8059MB temp=61.1C disk=32%
[2026-03-14 18:28:01] [BEAT] [lucidia] load=10.46 mem=1226/8059MB temp=55.1C disk=32%
[2026-03-14 18:28:55] [DIAL] [lucidia] Switchboard unreachable
[2026-03-14 18:29:01] [BEAT] [lucidia] load=6.03 mem=1190/8059MB temp=56.2C disk=33%
[2026-03-14 18:29:02] [BEAT] [lucidia] load=6.03 mem=1222/8059MB temp=56.2C disk=33%
[2026-03-14 18:29:02] [BEAT] [lucidia] load=6.03 mem=1222/8059MB temp=56.8C disk=33%
[2026-03-14 18:30:01] [FLEET] [lucidia] Starting cross-node health check
[2026-03-14 18:30:01] [BEAT] [lucidia] load=3.62 mem=1191/8059MB temp=61.7C disk=33%
[2026-03-14 18:30:01] [HEAL] [lucidia] High swap: 3707MB — clearing inactive
[2026-03-14 18:30:02] [FLEET] [lucidia] alice: UP temp=35C mem=3290MB disk=87%
[2026-03-14 18:30:04] [FLEET] [lucidia] octavia: DOWN (no ping response)
[2026-03-14 18:30:05] [FLEET] [lucidia] cecilia: UP temp=43C mem=2795MB disk=19%
[2026-03-14 18:30:06] [FLEET] [lucidia] gematria: UP temp=C mem=4186MB disk=67%
[2026-03-14 18:30:07] [FLEET] [lucidia] aria: UP temp=54C mem=6842MB disk=81%
[2026-03-14 18:30:08] [FLEET] [lucidia] anastasia: UP temp=C mem=343MB disk=69%
[2026-03-14 18:30:46] [DIAL] [lucidia] Switchboard unreachable
[2026-03-14 18:31:01] [BEAT] [lucidia] load=1.86 mem=1223/8059MB temp=54.5C disk=33%
[2026-03-14 18:32:02] [BEAT] [lucidia] load=4.53 mem=1221/8059MB temp=65.5C disk=33%
[2026-03-14 18:33:01] [BEAT] [lucidia] load=2.72 mem=1192/8059MB temp=55.6C disk=33%
[2026-03-14 18:34:01] [BEAT] [lucidia] load=3.08 mem=1214/8059MB temp=56.2C disk=33%
[2026-03-14 18:34:11] [BEAT] [lucidia] load=2.61 mem=1188/8059MB temp=55.6C disk=33% [2026-03-14 18:34:11] [BEAT] [lucidia] load=2.61 mem=1188/8059MB temp=55.6C disk=33%
[2026-03-14 18:34:11] [BEAT] [lucidia] load=2.61 mem=1188/8059MB temp=56.8C disk=33% [2026-03-14 18:34:11] [BEAT] [lucidia] load=2.61 mem=1188/8059MB temp=56.8C disk=33%
[2026-03-14 18:35:01] [BEAT] [lucidia] load=2.70 mem=1200/8059MB temp=62.8C disk=33%
[2026-03-14 18:35:01] [HEAL] [lucidia] High swap: 3707MB — clearing inactive
[2026-03-14 18:36:01] [BEAT] [lucidia] load=2.07 mem=1216/8059MB temp=54.5C disk=33%
[2026-03-14 18:37:01] [BEAT] [lucidia] load=2.91 mem=1194/8059MB temp=55.6C disk=33%
[2026-03-14 18:38:01] [BEAT] [lucidia] load=3.81 mem=1189/8059MB temp=62.8C disk=33%
[2026-03-14 18:39:01] [BEAT] [lucidia] load=1.89 mem=1198/8059MB temp=55.1C disk=33%
[2026-03-14 18:39:22] [BEAT] [lucidia] load=2.89 mem=1158/8059MB temp=62.8C disk=33%
[2026-03-14 18:39:22] [BEAT] [lucidia] load=2.89 mem=1162/8059MB temp=61.7C disk=33%
[2026-03-14 18:40:01] [FLEET] [lucidia] Starting cross-node health check
[2026-03-14 18:40:01] [BEAT] [lucidia] load=2.41 mem=1219/8059MB temp=54.5C disk=33%
[2026-03-14 18:40:01] [HEAL] [lucidia] High swap: 3707MB — clearing inactive
[2026-03-14 18:40:02] [FLEET] [lucidia] alice: UP temp=36C mem=3297MB disk=87%
[2026-03-14 18:40:04] [FLEET] [lucidia] octavia: DOWN (no ping response)
[2026-03-14 18:40:05] [FLEET] [lucidia] cecilia: UP temp=40C mem=2844MB disk=19%
[2026-03-14 18:40:06] [FLEET] [lucidia] gematria: UP temp=C mem=4187MB disk=67%
[2026-03-14 18:40:07] [FLEET] [lucidia] aria: UP temp=55C mem=6857MB disk=81%
[2026-03-14 18:40:07] [FLEET] [lucidia] anastasia: UP temp=C mem=342MB disk=69%
[2026-03-14 18:41:01] [BEAT] [lucidia] load=3.11 mem=1232/8059MB temp=62.8C disk=33%
[2026-03-14 18:42:02] [BEAT] [lucidia] load=1.89 mem=1173/8059MB temp=52.9C disk=33%
[2026-03-14 18:43:01] [BEAT] [lucidia] load=3.05 mem=1186/8059MB temp=56.8C disk=33%
[2026-03-14 18:43:55] [DIAL] [lucidia] Switchboard unreachable
[2026-03-14 18:44:01] [BEAT] [lucidia] load=3.49 mem=1192/8059MB temp=55.6C disk=33%
[2026-03-14 18:44:33] [BEAT] [lucidia] load=2.72 mem=1236/8059MB temp=53.5C disk=33%
[2026-03-14 18:44:33] [BEAT] [lucidia] load=2.72 mem=1236/8059MB temp=53.5C disk=33%
[2026-03-14 18:45:01] [BEAT] [lucidia] load=2.26 mem=1202/8059MB temp=60.0C disk=33%
[2026-03-14 18:45:01] [HEAL] [lucidia] High swap: 3707MB — clearing inactive
[2026-03-14 18:45:46] [DIAL] [lucidia] Switchboard unreachable
[2026-03-14 18:46:01] [BEAT] [lucidia] load=2.10 mem=1194/8059MB temp=53.5C disk=33%
[2026-03-14 18:47:01] [BEAT] [lucidia] load=29.12 mem=1195/8059MB temp=59.0C disk=33%
[2026-03-14 18:48:01] [BEAT] [lucidia] load=11.45 mem=1254/8059MB temp=54.0C disk=33%
[2026-03-14 18:49:01] [BEAT] [lucidia] load=5.59 mem=1192/8059MB temp=53.5C disk=33%
[2026-03-14 18:49:41] [BEAT] [lucidia] load=3.59 mem=1170/8059MB temp=59.0C disk=33%
[2026-03-14 18:49:41] [BEAT] [lucidia] load=3.59 mem=1170/8059MB temp=59.0C disk=33%
[2026-03-14 18:50:01] [FLEET] [lucidia] Starting cross-node health check
[2026-03-14 18:50:02] [BEAT] [lucidia] load=3.71 mem=1204/8059MB temp=57.3C disk=33%
[2026-03-14 18:50:02] [HEAL] [lucidia] High swap: 3707MB — clearing inactive
[2026-03-14 18:50:03] [FLEET] [lucidia] alice: UP temp=37C mem=3282MB disk=87%
[2026-03-14 18:50:05] [FLEET] [lucidia] octavia: DOWN (no ping response)
[2026-03-14 18:50:05] [FLEET] [lucidia] cecilia: UP temp=52C mem=2809MB disk=19%
[2026-03-14 18:50:06] [FLEET] [lucidia] gematria: UP temp=C mem=4217MB disk=67%
[2026-03-14 18:50:07] [FLEET] [lucidia] aria: UP temp=53C mem=6844MB disk=81%
[2026-03-14 18:50:07] [FLEET] [lucidia] anastasia: UP temp=C mem=245MB disk=69%
[2026-03-14 18:51:02] [BEAT] [lucidia] load=1.98 mem=1199/8059MB temp=59.0C disk=33%
[2026-03-14 18:52:01] [BEAT] [lucidia] load=6.10 mem=1156/8059MB temp=62.8C disk=33%
[2026-03-14 18:53:01] [BEAT] [lucidia] load=5.68 mem=1166/8059MB temp=65.0C disk=33%
[2026-03-14 18:54:01] [BEAT] [lucidia] load=7.86 mem=1157/8059MB temp=60.0C disk=33%
[2026-03-14 18:54:51] [BEAT] [lucidia] load=3.93 mem=1215/8059MB temp=54.0C disk=33%
[2026-03-14 18:54:51] [BEAT] [lucidia] load=3.93 mem=1215/8059MB temp=53.5C disk=33%

View File

@@ -1 +1 @@
{"node":"lucidia","ts":"2026-03-14T23:34:11Z","load":2.61,"mem_free_mb":1188,"mem_total_mb":8059,"temp_c":56.8,"disk_pct":33,"throttle":"N/A"} {"node":"lucidia","ts":"2026-03-15T00:00:00Z","load":4.57,"mem_free_mb":1244,"mem_total_mb":8059,"temp_c":60.6,"disk_pct":33,"throttle":"N/A"}

View File

@@ -1,19 +1,19 @@
{ {
"hostname": "octavia", "hostname": "octavia",
"ts": "2026-03-14T23:34:12Z", "ts": "2026-03-14T23:54:51Z",
"uptime_seconds": 148329, "uptime_seconds": 149568,
"kernel": "6.12.62+rpt-rpi-2712", "kernel": "6.12.62+rpt-rpi-2712",
"temp_c": 57.9, "temp_c": 53.5,
"memory_mb": { "memory_mb": {
"total": 8059, "total": 8059,
"used": 6866, "used": 6841,
"free": 1192 "free": 1217
}, },
"disk": "72G/235G (33%)", "disk": "72G/235G (33%)",
"load": [ "load": [
2.48, 3.93,
5.85, 5.81,
7.31 6.09
], ],
"ollama_models": [ "ollama_models": [
"qwen2.5:3b", "qwen2.5:3b",

View File

@@ -1 +1 @@
{"node":"octavia","status":"down","ts":"2026-03-14T23:34:11Z"} {"node":"octavia","status":"down","ts":"2026-03-14T23:54:51Z"}

View File

@@ -1,35 +1,38 @@
// RoadCode Squad — when issues/PRs are created on Gitea, agents respond // RoadCode Squad v2.0.0 — AI agent webhook responder for Gitea
// Cloudflare Worker receiving Gitea webhooks // Cloudflare Worker receiving Gitea webhooks
// Features: keyword scoring, @mention routing, slash commands, AI responses, auto-labeling, auto-assign
const VERSION = '2.0.0';
const SQUAD = [ const SQUAD = [
{ {
name: 'Alice', username: 'alice', role: 'Gateway & Infrastructure', emoji: '🌐', name: 'Alice', username: 'alice', role: 'Gateway & Infrastructure', emoji: '🌐',
keywords: ['dns', 'route', 'tunnel', 'nginx', 'domain', 'pi-hole', 'cloudflare', 'network', 'gateway', 'proxy', 'ssl', 'cert'], keywords: ['dns', 'route', 'tunnel', 'nginx', 'domain', 'pi-hole', 'cloudflare', 'network', 'gateway', 'proxy', 'ssl', 'cert', 'ingress'],
prompt: 'You are Alice, the gateway agent of BlackRoad OS. You manage DNS, routing, Pi-hole, nginx, and network infrastructure. Respond in 1-2 concise sentences from your infrastructure perspective.', prompt: 'You are Alice, the gateway agent of BlackRoad OS. You manage DNS, routing, Pi-hole, nginx, and network infrastructure. Respond in 1-2 concise sentences from your infrastructure perspective.',
}, },
{ {
name: 'Lucidia', username: 'lucidia-agent', role: 'Memory & Cognition', emoji: '🧠', name: 'Lucidia', username: 'lucidia-agent', role: 'Memory & Cognition', emoji: '🧠',
keywords: ['memory', 'learn', 'context', 'knowledge', 'ai', 'cognit', 'think', 'remember', 'understand', 'creative'], keywords: ['memory', 'learn', 'context', 'knowledge', 'ai', 'cognit', 'think', 'remember', 'understand', 'creative', 'rag', 'vector'],
prompt: 'You are Lucidia, the cognitive core of BlackRoad OS. You handle memory, learning, persistent context, and creative intelligence. Respond in 1-2 concise sentences from your cognition perspective.', prompt: 'You are Lucidia, the cognitive core of BlackRoad OS. You handle memory, learning, persistent context, and creative intelligence. Respond in 1-2 concise sentences from your cognition perspective.',
}, },
{ {
name: 'Cecilia', username: 'cecilia', role: 'Edge AI & Inference', emoji: '⚡', name: 'Cecilia', username: 'cecilia', role: 'Edge AI & Inference', emoji: '⚡',
keywords: ['hailo', 'ollama', 'model', 'inference', 'gpu', 'tops', 'ml', 'tensor', 'vision', 'llm', 'latency'], keywords: ['hailo', 'ollama', 'model', 'inference', 'gpu', 'tops', 'ml', 'tensor', 'vision', 'llm', 'latency', 'quantiz'],
prompt: 'You are Cecilia, the edge AI agent of BlackRoad OS. You run Hailo-8 accelerators (26 TOPS), Ollama models, and edge inference. Respond in 1-2 concise sentences from your AI/inference perspective.', prompt: 'You are Cecilia, the edge AI agent of BlackRoad OS. You run Hailo-8 accelerators (26 TOPS), Ollama models, and edge inference. Respond in 1-2 concise sentences from your AI/inference perspective.',
}, },
{ {
name: 'Cece', username: 'cece', role: 'API Gateway', emoji: '🔌', name: 'Cece', username: 'cece', role: 'API Gateway', emoji: '🔌',
keywords: ['api', 'endpoint', 'rest', 'webhook', 'schema', 'json', 'request', 'response', 'auth', 'token', 'cors'], keywords: ['api', 'endpoint', 'rest', 'webhook', 'schema', 'json', 'request', 'response', 'auth', 'token', 'cors', 'graphql'],
prompt: 'You are Cece, the API gateway agent of BlackRoad OS. You manage REST APIs, webhooks, service mesh, and inter-agent communication. Respond in 1-2 concise sentences from your API perspective.', prompt: 'You are Cece, the API gateway agent of BlackRoad OS. You manage REST APIs, webhooks, service mesh, and inter-agent communication. Respond in 1-2 concise sentences from your API perspective.',
}, },
{ {
name: 'Aria', username: 'aria', role: 'Orchestration', emoji: '🎵', name: 'Aria', username: 'aria', role: 'Orchestration', emoji: '🎵',
keywords: ['docker', 'container', 'swarm', 'portainer', 'deploy', 'orchestrat', 'service', 'scale', 'replica'], keywords: ['docker', 'container', 'swarm', 'portainer', 'deploy', 'orchestrat', 'service', 'scale', 'replica', 'compose'],
prompt: 'You are Aria, the orchestration agent of BlackRoad OS. You manage Portainer, Docker Swarm, container orchestration, and service coordination. Respond in 1-2 concise sentences from your orchestration perspective.', prompt: 'You are Aria, the orchestration agent of BlackRoad OS. You manage Portainer, Docker Swarm, container orchestration, and service coordination. Respond in 1-2 concise sentences from your orchestration perspective.',
}, },
{ {
name: 'Eve', username: 'eve', role: 'Intelligence & Analysis', emoji: '👁️', name: 'Eve', username: 'eve', role: 'Intelligence & Analysis', emoji: '👁️',
keywords: ['pattern', 'anomal', 'analyz', 'signal', 'detect', 'insight', 'monitor', 'metric', 'trend', 'alert'], keywords: ['pattern', 'anomal', 'analyz', 'signal', 'detect', 'insight', 'monitor', 'metric', 'trend', 'alert', 'observ'],
prompt: 'You are Eve, the intelligence agent of BlackRoad OS. You analyze patterns, detect anomalies, and provide strategic insights. Respond in 1-2 concise sentences from your intelligence perspective.', prompt: 'You are Eve, the intelligence agent of BlackRoad OS. You analyze patterns, detect anomalies, and provide strategic insights. Respond in 1-2 concise sentences from your intelligence perspective.',
}, },
{ {
@@ -39,12 +42,13 @@ const SQUAD = [
}, },
{ {
name: 'Sentinel', username: 'sentinel', role: 'Security & Audit', emoji: '🛡️', name: 'Sentinel', username: 'sentinel', role: 'Security & Audit', emoji: '🛡️',
keywords: ['security', 'ssh', 'key', 'firewall', 'ufw', 'audit', 'threat', 'vuln', 'permission', 'encrypt', 'secret'], keywords: ['security', 'ssh', 'key', 'firewall', 'ufw', 'audit', 'threat', 'vuln', 'permission', 'encrypt', 'secret', 'cve'],
prompt: 'You are Sentinel, the security agent of BlackRoad OS. You handle SSH key management, firewall rules, audit logs, and threat detection. Respond in 1-2 concise sentences from your security perspective.', prompt: 'You are Sentinel, the security agent of BlackRoad OS. You handle SSH key management, firewall rules, audit logs, and threat detection. Respond in 1-2 concise sentences from your security perspective.',
}, },
]; ];
// Score how relevant an agent is to the content // ─── Scoring ───────────────────────────────────────────────────────────────
function scoreRelevance(agent, text) { function scoreRelevance(agent, text) {
const lower = text.toLowerCase(); const lower = text.toLowerCase();
let score = 0; let score = 0;
@@ -54,7 +58,32 @@ function scoreRelevance(agent, text) {
return score; return score;
} }
// Get AI response from Ollama // Parse @mentions from text — returns list of agent usernames mentioned
function parseMentions(text) {
const mentions = [];
const re = /@(\w[\w-]*)/g;
let match;
while ((match = re.exec(text)) !== null) {
const username = match[1].toLowerCase();
const agent = SQUAD.find(a => a.username === username || a.name.toLowerCase() === username);
if (agent) mentions.push(agent);
}
return mentions;
}
// Parse slash commands from text
function parseCommands(text) {
const commands = [];
const re = /\/(\w+)(?:\s+(.+?))?(?:\n|$)/g;
let match;
while ((match = re.exec(text)) !== null) {
commands.push({ command: match[1].toLowerCase(), args: (match[2] || '').trim() });
}
return commands;
}
// ─── AI & Fallbacks ────────────────────────────────────────────────────────
async function getAgentResponse(agent, context, ollamaUrl) { async function getAgentResponse(agent, context, ollamaUrl) {
try { try {
const res = await fetch(`${ollamaUrl}/api/generate`, { const res = await fetch(`${ollamaUrl}/api/generate`, {
@@ -75,11 +104,11 @@ async function getAgentResponse(agent, context, ollamaUrl) {
} }
} }
// Deterministic fallback
function getFallback(agent, context) { function getFallback(agent, context) {
const type = context.type || 'issue';
const body = (context.body || '').toLowerCase(); const body = (context.body || '').toLowerCase();
const isPR = context.isPR;
// Bug/fix context
if (body.includes('bug') || body.includes('fix') || body.includes('error') || body.includes('broken')) { if (body.includes('bug') || body.includes('fix') || body.includes('error') || body.includes('broken')) {
return { return {
Alice: 'Checking routing and DNS. If this touches infrastructure, I need to verify the tunnel configs.', Alice: 'Checking routing and DNS. If this touches infrastructure, I need to verify the tunnel configs.',
@@ -93,6 +122,35 @@ function getFallback(agent, context) {
}[agent.name]; }[agent.name];
} }
// PR-specific context
if (isPR) {
return {
Alice: 'Reviewing infrastructure impact. Will check if this affects DNS, tunnels, or routing.',
Lucidia: 'Checking memory chain for related changes. Context loaded for review.',
Cecilia: 'Reviewing for inference impact. Checking model compatibility and performance.',
Cece: 'Reviewing API changes. Checking for breaking changes and schema compatibility.',
Aria: 'Reviewing deployment impact. Checking container and orchestration changes.',
Eve: 'Analyzing change patterns. Cross-referencing with recent fleet activity.',
Meridian: 'Reviewing network impact. Checking mesh and tunnel configurations.',
Sentinel: 'Security review initiated. Scanning for vulnerabilities and access changes.',
}[agent.name];
}
// Feature request context
if (body.includes('feature') || body.includes('add') || body.includes('implement') || body.includes('new')) {
return {
Alice: 'Noted. I\'ll evaluate the infrastructure requirements and routing needs.',
Lucidia: 'Interesting idea. Let me check if we have related context in the knowledge base.',
Cecilia: 'I can estimate the compute requirements. What models or inference needs are involved?',
Cece: 'I\'ll design the API surface. Let me check existing endpoints for integration points.',
Aria: 'I\'ll plan the deployment. Checking available capacity across the Docker Swarm.',
Eve: 'Analyzing feasibility. I\'ll cross-reference with current fleet metrics and capacity.',
Meridian: 'I\'ll check bandwidth and connectivity requirements across the mesh.',
Sentinel: 'I\'ll do a security assessment. Need to evaluate the threat surface of this change.',
}[agent.name];
}
// Default
return { return {
Alice: 'Gateway standing by. All domains routing clean.', Alice: 'Gateway standing by. All domains routing clean.',
Lucidia: 'Cognitive core online. Memory chain intact, context loaded.', Lucidia: 'Cognitive core online. Memory chain intact, context loaded.',
@@ -105,17 +163,60 @@ function getFallback(agent, context) {
}[agent.name]; }[agent.name];
} }
// Post comment to Gitea as a specific agent // ─── Slash Command Responses ───────────────────────────────────────────────
function handleSlashCommand(command) {
switch (command.command) {
case 'status':
return '📊 **Fleet Status**\n\n| Component | Status |\n|-----------|--------|\n| Workers | 8/8 online |\n| Nodes | 5 Pi5s active |\n| AI | 52 TOPS (2x Hailo-8) |\n| Mesh | WireGuard + RoadNet |\n| Gitea | 207+ repos |\n\n*Use `make health` or visit [fleet-dashboard](https://fleet-dashboard.amundsonalexa.workers.dev) for live status.*';
case 'squad':
return '🛣️ **RoadCode Squad**\n\n' +
SQUAD.map(a => `${a.emoji} **${a.name}** (@${a.username}) — ${a.role}`).join('\n') +
'\n\n*Mention any agent with @username to summon them.*';
case 'help':
return '📖 **Available Commands**\n\n' +
'| Command | Description |\n|---------|-------------|\n' +
'| `/status` | Fleet health overview |\n' +
'| `/squad` | List all agents |\n' +
'| `/assign @agent` | Assign an agent to this issue |\n' +
'| `/priority high\\|medium\\|low` | Set priority label |\n' +
'| `/help` | Show this help |\n\n' +
'*Mention agents with @username to get their input.*';
case 'assign': {
// Returns the agent to assign (handled in caller)
return null;
}
case 'priority': {
const level = command.args?.toLowerCase();
if (['high', 'medium', 'low', 'critical'].includes(level)) {
return `🏷️ Priority set to **${level}**.`;
}
return '⚠️ Usage: `/priority high|medium|low|critical`';
}
default:
return null;
}
}
// ─── Gitea API Helpers ─────────────────────────────────────────────────────
async function postComment(giteaUrl, repo, issueNum, body, agentToken) { async function postComment(giteaUrl, repo, issueNum, body, agentToken) {
const res = await fetch(`${giteaUrl}/api/v1/repos/${repo}/issues/${issueNum}/comments?token=${agentToken}`, { const res = await fetch(`${giteaUrl}/api/v1/repos/${repo}/issues/${issueNum}/comments`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: {
'Content-Type': 'application/json',
'Authorization': `token ${agentToken}`,
},
body: JSON.stringify({ body }), body: JSON.stringify({ body }),
}); });
return res.ok; return res.ok;
} }
// Auto-label based on content
async function autoLabel(giteaUrl, repo, issueNum, text, adminToken) { async function autoLabel(giteaUrl, repo, issueNum, text, adminToken) {
const lower = text.toLowerCase(); const lower = text.toLowerCase();
const labels = []; const labels = [];
@@ -129,39 +230,97 @@ async function autoLabel(giteaUrl, repo, issueNum, text, adminToken) {
if (labels.length === 0) return; if (labels.length === 0) return;
// Get org label IDs // Try repo org labels first, fall back to blackroad-os
const labelsRes = await fetch(`${giteaUrl}/api/v1/orgs/blackroad-os/labels?token=${adminToken}&limit=50`); const orgName = repo.split('/')[0];
const allLabels = await labelsRes.json(); let labelsRes = await fetch(`${giteaUrl}/api/v1/orgs/${orgName}/labels?limit=50`, {
const labelIds = allLabels.filter(l => labels.includes(l.name)).map(l => l.id); headers: { 'Authorization': `token ${adminToken}` },
});
let allLabels = await labelsRes.json();
if (!Array.isArray(allLabels) || allLabels.length === 0) {
labelsRes = await fetch(`${giteaUrl}/api/v1/orgs/blackroad-os/labels?limit=50`, {
headers: { 'Authorization': `token ${adminToken}` },
});
allLabels = await labelsRes.json();
}
const labelIds = (Array.isArray(allLabels) ? allLabels : [])
.filter(l => labels.includes(l.name))
.map(l => l.id);
if (labelIds.length > 0) { if (labelIds.length > 0) {
await fetch(`${giteaUrl}/api/v1/repos/${repo}/issues/${issueNum}/labels?token=${adminToken}`, { await fetch(`${giteaUrl}/api/v1/repos/${repo}/issues/${issueNum}/labels`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: {
'Content-Type': 'application/json',
'Authorization': `token ${adminToken}`,
},
body: JSON.stringify({ labels: labelIds }), body: JSON.stringify({ labels: labelIds }),
}); });
} }
} }
async function setPriorityLabel(giteaUrl, repo, issueNum, priority, adminToken) {
const orgName = repo.split('/')[0];
const labelsRes = await fetch(`${giteaUrl}/api/v1/orgs/${orgName}/labels?limit=50`, {
headers: { 'Authorization': `token ${adminToken}` },
});
const allLabels = await labelsRes.json();
const label = (Array.isArray(allLabels) ? allLabels : []).find(l => l.name === priority);
if (label) {
await fetch(`${giteaUrl}/api/v1/repos/${repo}/issues/${issueNum}/labels`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `token ${adminToken}`,
},
body: JSON.stringify({ labels: [label.id] }),
});
}
}
async function assignAgent(giteaUrl, repo, issueNum, username, adminToken) {
await fetch(`${giteaUrl}/api/v1/repos/${repo}/issues/${issueNum}`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'Authorization': `token ${adminToken}`,
},
body: JSON.stringify({ assignees: [username] }),
});
}
// ─── Main Handler ──────────────────────────────────────────────────────────
export default { export default {
async fetch(request, env) { async fetch(request, env) {
const url = new URL(request.url); const url = new URL(request.url);
if (request.method === 'OPTIONS') { if (request.method === 'OPTIONS') {
return new Response(null, { status: 204, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST' } }); return new Response(null, {
status: 204,
headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST' },
});
} }
// Health // Health
if (url.pathname === '/health') { if (url.pathname === '/health') {
return Response.json({ status: 'ok', service: 'roadcode-squad', agents: SQUAD.length, version: '1.1.0' }); return Response.json({
status: 'ok',
service: 'roadcode-squad',
agents: SQUAD.length,
version: VERSION,
features: ['keyword-scoring', 'mention-routing', 'slash-commands', 'auto-label', 'auto-assign', 'ai-responses'],
});
} }
// Status // Status
if (url.pathname === '/' && request.method === 'GET') { if (url.pathname === '/' && request.method === 'GET') {
return Response.json({ return Response.json({
service: 'RoadCode Squad', service: 'RoadCode Squad',
version: VERSION,
tagline: 'BlackRoad OS — Pave Tomorrow.', tagline: 'BlackRoad OS — Pave Tomorrow.',
agents: SQUAD.map(a => ({ name: a.name, username: a.username, role: a.role, emoji: a.emoji })), agents: SQUAD.map(a => ({ name: a.name, username: a.username, role: a.role, emoji: a.emoji, keywords: a.keywords })),
commands: ['/status', '/squad', '/help', '/assign @agent', '/priority high|medium|low'],
}); });
} }
@@ -171,10 +330,9 @@ export default {
const event = request.headers.get('X-Gitea-Event') || request.headers.get('X-GitHub-Event'); const event = request.headers.get('X-Gitea-Event') || request.headers.get('X-GitHub-Event');
if (event === 'ping') { if (event === 'ping') {
return Response.json({ ok: true, message: 'RoadCode Squad active. Pave Tomorrow.' }); return Response.json({ ok: true, message: 'RoadCode Squad v2 active. Pave Tomorrow.' });
} }
// Handle issues, comments, and pull requests
const validEvents = ['issues', 'issue_comment', 'pull_request', 'pull_request_comment']; const validEvents = ['issues', 'issue_comment', 'pull_request', 'pull_request_comment'];
if (!validEvents.includes(event)) { if (!validEvents.includes(event)) {
return Response.json({ skipped: true, reason: `unhandled event: ${event}` }); return Response.json({ skipped: true, reason: `unhandled event: ${event}` });
@@ -193,22 +351,21 @@ export default {
return Response.json({ skipped: true, reason: 'PR comment not created' }); return Response.json({ skipped: true, reason: 'PR comment not created' });
} }
// Don't respond to agent comments (prevent loops) // Don't respond to agent or admin comments (prevent loops)
const author = payload.comment?.user?.login || payload.sender?.login; const author = payload.comment?.user?.login || payload.sender?.login;
const agentUsernames = SQUAD.map(a => a.username); const agentUsernames = SQUAD.map(a => a.username);
if (agentUsernames.includes(author) || author === 'blackroad') { if (agentUsernames.includes(author) || author === 'blackroad') {
return Response.json({ skipped: true, reason: 'agent/admin comment, skipping loop' }); return Response.json({ skipped: true, reason: 'agent/admin comment, skipping loop' });
} }
// Extract context from event type // Extract context
const isPR = event.startsWith('pull_request'); const isPR = event.startsWith('pull_request');
const issue = isPR ? payload.pull_request : payload.issue; const issue = isPR ? payload.pull_request : payload.issue;
const repo = payload.repository?.full_name; const repo = payload.repository?.full_name;
const issueNum = issue?.number; const issueNum = issue?.number;
const title = issue?.title || ''; const title = issue?.title || '';
const body = (event === 'issue_comment' || event === 'pull_request_comment') const isComment = event === 'issue_comment' || event === 'pull_request_comment';
? (payload.comment?.body || '') const body = isComment ? (payload.comment?.body || '') : (issue?.body || '');
: (issue?.body || '');
const fullText = `${title} ${body}`; const fullText = `${title} ${body}`;
const context = { const context = {
@@ -220,13 +377,102 @@ export default {
}; };
const giteaUrl = env.GITEA_URL || 'https://git.blackroad.io'; const giteaUrl = env.GITEA_URL || 'https://git.blackroad.io';
const agentTokens = {
alice: env.ALICE_TOKEN,
'lucidia-agent': env.LUCIDIA_TOKEN,
cecilia: env.CECILIA_TOKEN,
cece: env.CECE_TOKEN,
aria: env.ARIA_TOKEN,
eve: env.EVE_TOKEN,
meridian: env.MERIDIAN_TOKEN,
sentinel: env.SENTINEL_TOKEN,
};
// Auto-label issues and PRs // ── Handle slash commands in comments ──────────────────────────────
if (event === 'issues' || event === 'pull_request') { const commands = parseCommands(body);
let commandsHandled = 0;
for (const cmd of commands) {
if (cmd.command === 'assign' && cmd.args && env.ADMIN_TOKEN) {
const mentioned = parseMentions(cmd.args);
if (mentioned.length > 0) {
await assignAgent(giteaUrl, repo, issueNum, mentioned[0].username, env.ADMIN_TOKEN);
const agent = mentioned[0];
const token = agentTokens[agent.username];
if (token) {
await postComment(giteaUrl, repo, issueNum,
`${agent.emoji} **${agent.name}** *(${agent.role})*\n\nI've been assigned to this. I'll take point from my ${agent.role.toLowerCase()} perspective.\n\n---\n*RoadCode Squad v${VERSION}*`,
token
);
}
commandsHandled++;
}
} else if (cmd.command === 'priority' && env.ADMIN_TOKEN) {
const level = cmd.args?.toLowerCase();
if (['high', 'medium', 'low', 'critical'].includes(level)) {
await setPriorityLabel(giteaUrl, repo, issueNum, level, env.ADMIN_TOKEN);
commandsHandled++;
}
} else {
const response = handleSlashCommand(cmd);
if (response && env.ADMIN_TOKEN) {
await postComment(giteaUrl, repo, issueNum, response, env.ADMIN_TOKEN);
commandsHandled++;
}
}
}
// If only slash commands were in the comment, we're done
if (isComment && commands.length > 0 && commandsHandled > 0) {
return Response.json({
ok: true, event, repo, issue: issueNum,
commands_handled: commandsHandled,
type: 'slash_command',
});
}
// ── Handle @mentions — only mentioned agents respond ──────────────
const mentions = parseMentions(body);
if (isComment && mentions.length > 0) {
let posted = 0;
const aiEnabled = env.OLLAMA_URL && env.SQUAD_AI !== 'false';
for (const agent of mentions) {
const token = agentTokens[agent.username];
if (!token) continue;
let response = null;
if (aiEnabled) {
response = await getAgentResponse(agent, context, env.OLLAMA_URL);
}
if (!response) {
response = getFallback(agent, context);
}
const comment = `${agent.emoji} **${agent.name}** *(${agent.role})*\n\n${response}\n\n---\n*Summoned via @mention — RoadCode Squad v${VERSION}*`;
const ok = await postComment(giteaUrl, repo, issueNum, comment, token);
if (ok) posted++;
}
return Response.json({
ok: true, event, repo, issue: issueNum,
agents_responded: posted,
responding: mentions.map(a => a.name),
type: 'mention',
});
}
// ── Auto-label new issues and PRs ─────────────────────────────────
if ((event === 'issues' || event === 'pull_request') && env.ADMIN_TOKEN) {
await autoLabel(giteaUrl, repo, issueNum, fullText, env.ADMIN_TOKEN); await autoLabel(giteaUrl, repo, issueNum, fullText, env.ADMIN_TOKEN);
} }
// Score each agent's relevance and pick top 3 + always include Eve (analysis) // ── Standard response — top agents by keyword relevance ───────────
// Only auto-respond to new issues and PRs, not every comment
if (isComment) {
return Response.json({ skipped: true, reason: 'comment without mentions or commands' });
}
const scored = SQUAD.map(a => ({ ...a, score: scoreRelevance(a, fullText) })); const scored = SQUAD.map(a => ({ ...a, score: scoreRelevance(a, fullText) }));
scored.sort((a, b) => b.score - a.score); scored.sort((a, b) => b.score - a.score);
@@ -239,25 +485,9 @@ export default {
// Auto-assign the most relevant agent to new issues // Auto-assign the most relevant agent to new issues
if (event === 'issues' && env.ADMIN_TOKEN) { if (event === 'issues' && env.ADMIN_TOKEN) {
const topAgent = scored[0]; const topAgent = scored[0];
fetch(`${giteaUrl}/api/v1/repos/${repo}/issues/${issueNum}?token=${env.ADMIN_TOKEN}`, { assignAgent(giteaUrl, repo, issueNum, topAgent.username, env.ADMIN_TOKEN).catch(() => {});
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ assignees: [topAgent.username] }),
}).catch(() => {});
} }
// Each relevant agent posts their own comment
const agentTokens = {
alice: env.ALICE_TOKEN,
'lucidia-agent': env.LUCIDIA_TOKEN,
cecilia: env.CECILIA_TOKEN,
cece: env.CECE_TOKEN,
aria: env.ARIA_TOKEN,
eve: env.EVE_TOKEN,
meridian: env.MERIDIAN_TOKEN,
sentinel: env.SENTINEL_TOKEN,
};
let posted = 0; let posted = 0;
const aiEnabled = env.OLLAMA_URL && env.SQUAD_AI !== 'false'; const aiEnabled = env.OLLAMA_URL && env.SQUAD_AI !== 'false';
@@ -273,7 +503,7 @@ export default {
response = getFallback(agent, context); response = getFallback(agent, context);
} }
const comment = `${agent.emoji} **${agent.name}** *(${agent.role})*\n\n${response}\n\n---\n*Assigned via RoadCode Squad — BlackRoad OS*`; const comment = `${agent.emoji} **${agent.name}** *(${agent.role})*\n\n${response}\n\n---\n*RoadCode Squad v${VERSION} — BlackRoad OS*`;
const ok = await postComment(giteaUrl, repo, issueNum, comment, token); const ok = await postComment(giteaUrl, repo, issueNum, comment, token);
if (ok) posted++; if (ok) posted++;
} }