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
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:
2
Makefile
2
Makefile
@@ -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
|
||||||
|
|||||||
@@ -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%
|
||||||
|
|||||||
@@ -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"}
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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%
|
||||||
|
|||||||
@@ -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"}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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%
|
||||||
|
|||||||
@@ -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"}
|
||||||
|
|||||||
@@ -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:*
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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": [
|
||||||
|
|||||||
@@ -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%
|
||||||
|
|||||||
@@ -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"}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"node":"octavia","status":"down","ts":"2026-03-14T23:34:11Z"}
|
{"node":"octavia","status":"down","ts":"2026-03-14T23:54:51Z"}
|
||||||
|
|||||||
@@ -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++;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user