sync: 2026-03-16 22:30 — 34 files from Alexandria
Some checks failed
Lint & Format / detect (push) Failing after 32s
Monorepo Lint / lint-shell (push) Failing after 41s
Monorepo Lint / lint-js (push) Failing after 47s
Lint & Format / js-lint (push) Has been skipped
Lint & Format / py-lint (push) Has been skipped
Lint & Format / sh-lint (push) Has been skipped
Lint & Format / go-lint (push) Has been skipped

RoadChain-SHA2048: 9ea9121d5072e206
RoadChain-Identity: alexa@sovereign
RoadChain-Full: 9ea9121d5072e20636efae2a25ea95edbd5085cc1e54e0d83186de315c63efc5aa77bd1e839f9178915aae84c5bd91b5faa0fee960e2dac8440ea1942132c9834a922f7d4d433931c7ea3f9ee4cd4706510ec5ff5be6a3fb55963a6df808b14184cb4517852fcdb8514dc14ca02fe16e318cab78ddf1993e76352bc409570415536bf1664cf5536b54acae7080fdc802508fea911ad7246da47bad7b0d31e6c745e93730ed8593f0221336af7378df60c54e2e86e96986a205641cd3a5f1380d5bd54b68d0a0f779fb152b0d8a5b0dbfd5118fc15d32b115ed581b0d715874460ae4e4420d83156dec9e9051047c95fb3ff4abb56e25bd8fc884a5eeb4d05b0a
This commit is contained in:
2026-03-16 22:30:03 -05:00
parent 558634c0e6
commit 78fbb23fac
34 changed files with 658 additions and 151 deletions

View File

@@ -40,3 +40,4 @@
0 3 * * * /Users/alexa/blackroad-operator/scripts/memory/memory-watchdog.sh sweep >> /Users/alexa/.blackroad/logs/collab-watchdog.log 2>&1
0 9 * * * /Users/alexa/blackroad-operator/scripts/memory/memory-watchdog.sh digest --slack >> /Users/alexa/.blackroad/logs/collab-watchdog.log 2>&1
*/5 * * * * /usr/bin/python3 /Users/alexa/blackroad-operator/scripts/memory/memory-slack-sync.py full >> /tmp/slack-sync.log 2>&1
*/5 * * * * /Users/alexa/network-welcome.sh >> /Users/alexa/.blackroad/network/welcome.log 2>&1

Binary file not shown.

View File

@@ -1 +1 @@
{"node":"alice","ts":"2026-03-17T02:59:55Z","load":1.33,"mem_free_mb":3251,"mem_total_mb":3794,"temp_c":34.1,"disk_pct":84,"throttle":"0x0"}
{"node":"alice","ts":"2026-03-17T03:26:57Z","load":4.59,"mem_free_mb":3381,"mem_total_mb":3794,"temp_c":34.6,"disk_pct":84,"throttle":"0x0"}

View File

@@ -1,35 +1,29 @@
LISTEN 0 5 0.0.0.0:8184 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8092 0.0.0.0:* users:(("python3",pid=31558,fd=3))
LISTEN 0 5 0.0.0.0:8095 0.0.0.0:* users:(("python3",pid=18662,fd=3))
LISTEN 0 511 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 511 127.0.0.1:6379 0.0.0.0:*
LISTEN 0 511 0.0.0.0:8083 0.0.0.0:* users:(("node /usr/lib/n",pid=3890,fd=20))
LISTEN 0 5 0.0.0.0:4010 0.0.0.0:* users:(("python3",pid=610,fd=3))
LISTEN 0 5 0.0.0.0:8011 0.0.0.0:* users:(("python3",pid=828,fd=3))
LISTEN 0 5 0.0.0.0:8010 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8013 0.0.0.0:* users:(("python3",pid=622,fd=3))
LISTEN 0 5 0.0.0.0:8012 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8013 0.0.0.0:* users:(("python3",pid=695,fd=3))
LISTEN 0 5 0.0.0.0:8014 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8001 0.0.0.0:* users:(("python3",pid=617,fd=6))
LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=6196,fd=5))
LISTEN 0 5 0.0.0.0:8010 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8011 0.0.0.0:* users:(("python3",pid=903,fd=3))
LISTEN 0 2048 0.0.0.0:8001 0.0.0.0:* users:(("python3",pid=692,fd=6))
LISTEN 0 5 0.0.0.0:4010 0.0.0.0:* users:(("python3",pid=688,fd=3))
LISTEN 0 5 0.0.0.0:8095 0.0.0.0:* users:(("python3",pid=684,fd=3))
LISTEN 0 511 0.0.0.0:8083 0.0.0.0:* users:(("node /usr/lib/n",pid=3707,fd=20))
LISTEN 0 5 0.0.0.0:8184 0.0.0.0:*
LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=776,fd=9))
LISTEN 0 200 0.0.0.0:443 0.0.0.0:*
LISTEN 0 128 127.0.0.1:11434 0.0.0.0:*
LISTEN 0 32 0.0.0.0:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 244 127.0.0.1:5432 0.0.0.0:*
LISTEN 0 200 0.0.0.0:80 0.0.0.0:*
LISTEN 0 1024 0.0.0.0:6333 0.0.0.0:*
LISTEN 0 128 0.0.0.0:6334 0.0.0.0:*
LISTEN 0 200 0.0.0.0:80 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:20241 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 32 0.0.0.0:53 0.0.0.0:*
LISTEN 0 128 127.0.0.1:11434 0.0.0.0:*
LISTEN 0 511 0.0.0.0:3000 0.0.0.0:*
LISTEN 0 511 0.0.0.0:9000 0.0.0.0:*
LISTEN 0 244 127.0.0.1:5432 0.0.0.0:*
LISTEN 0 128 [::1]:11434 [::]:*
LISTEN 0 244 [::1]:5432 [::]:*
LISTEN 0 511 *:8090 *:* users:(("node",pid=25140,fd=27))
LISTEN 0 511 [::]:8080 [::]:*
LISTEN 0 200 [::]:443 [::]:*
LISTEN 0 511 [::1]:6379 [::]:*
LISTEN 0 200 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 200 [::]:443 [::]:*
LISTEN 0 32 [::]:53 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 200 [::]:80 [::]:*
LISTEN 0 244 [::1]:5432 [::]:*
LISTEN 0 128 [::1]:11434 [::]:*
LISTEN 0 511 *:8787 *:*

View File

@@ -16,8 +16,6 @@ dhcpcd.service
docker.service
getty@tty1.service
hciuart.service
nginx.service
packagekit.service
pi-fleet-dashboard.service
pihole-FTL.service
pm2-pi.service

View File

@@ -1,19 +1,19 @@
{
"hostname": "alice",
"ts": "2026-03-17T02:59:58Z",
"uptime_seconds": 87336,
"ts": "2026-03-17T03:26:58Z",
"uptime_seconds": 87,
"kernel": "6.1.21-v8+",
"temp_c": 33.1,
"temp_c": 35.0,
"memory_mb": {
"total": 3794,
"used": 443,
"free": 3249
"used": 323,
"free": 3381
},
"disk": "12G/15G (84%)",
"load": [
1.23,
1.13,
1.06
4.59,
1.86,
0.68
],
"ollama_models": [
"qwen2.5:3b",
@@ -25,5 +25,5 @@
],
"throttle": "0x0",
"voltage": "0.9160V",
"services_running": 45
"services_running": 43
}

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 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 511 *:3000 *:* users:(("node /srv/hello",pid=1984822,fd=19))
LISTEN 0 511 *:3000 *:* users:(("node /srv/hello",pid=1989954,fd=19))
LISTEN 0 511 *:3001 *:* users:(("node",pid=757,fd=21))
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))

View File

@@ -1,19 +1,19 @@
{
"hostname": "anastasia",
"ts": "2026-03-17T02:59:55Z",
"uptime_seconds": 6858287,
"ts": "2026-03-17T03:26:58Z",
"uptime_seconds": 6859910,
"kernel": "5.14.0-651.el9.x86_64",
"temp_c": 0,
"memory_mb": {
"total": 765,
"used": 437,
"free": 327
"used": 468,
"free": 296
},
"disk": "18G/25G (69%)",
"load": [
0.01,
0.06,
0.06
0.02,
0.04,
0.03
],
"ollama_models": [],
"throttle": "N/A",

Binary file not shown.

View File

@@ -1 +1 @@
{"node":"aria","ts":"2026-03-16T03:01:04Z","load":0.16,"mem_free_mb":7103,"mem_total_mb":8059,"temp_c":45.8,"disk_pct":81,"throttle":"N/A"}
{"node":"aria","ts":"2026-03-17T03:26:56Z","load":0.41,"mem_free_mb":7091,"mem_total_mb":8059,"temp_c":40.2,"disk_pct":81,"throttle":"N/A"}

View File

@@ -1,26 +1,26 @@
LISTEN 0 5 0.0.0.0:7890 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8000 0.0.0.0:* users:(("python3",pid=740,fd=6))
LISTEN 0 5 0.0.0.0:8180 0.0.0.0:*
LISTEN 0 5 0.0.0.0:3000 0.0.0.0:* users:(("python3",pid=973,fd=3))
LISTEN 0 5 0.0.0.0:3000 0.0.0.0:* users:(("python3",pid=971,fd=3))
LISTEN 0 4096 127.0.0.1:8088 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:20241 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:45067 0.0.0.0:*
LISTEN 0 32 127.0.0.1:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:34001 0.0.0.0:*
LISTEN 0 5 0.0.0.0:7890 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8180 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8000 0.0.0.0:* users:(("python3",pid=740,fd=6))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9000 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9443 0.0.0.0:*
LISTEN 0 128 0.0.0.0:34001 0.0.0.0:*
LISTEN 0 32 127.0.0.1:53 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:32785 0.0.0.0:*
LISTEN 0 128 127.0.0.1:631 0.0.0.0:*
LISTEN 0 128 127.0.0.1:9090 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9000 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 *:11434 *:*
LISTEN 0 4096 *:8086 *:*
LISTEN 0 128 *:8090 *:*
LISTEN 0 4096 *:11434 *:*
LISTEN 0 16 *:5900 *:*
LISTEN 0 4096 [::]:9443 [::]:*
LISTEN 0 4096 [::]:9000 [::]:*
LISTEN 0 4096 *:9100 *:*
LISTEN 0 32 [::1]:53 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 4096 *:9100 *:*
LISTEN 0 4096 [::]:9000 [::]:*
LISTEN 0 4096 [::]:9443 [::]:*
LISTEN 0 128 [::1]:631 [::]:*
LISTEN 0 32 [::1]:53 [::]:*
LISTEN 0 16 *:5900 *:*

View File

@@ -19,6 +19,7 @@ NetworkManager.service
nginx.service
node_exporter.service
ollama.service
packagekit.service
pironman5.service
polkit.service
roadnet-failover.service

View File

@@ -1 +1 @@
{"node":"aria","status":"down","ts":"2026-03-17T02:59:54Z"}
{"node":"aria","status":"down","ts":"2026-03-17T03:20:28Z"}

View File

@@ -1,19 +1,19 @@
{
"hostname": "aria",
"ts": "2026-03-16T03:01:04Z",
"uptime_seconds": 933,
"ts": "2026-03-17T03:26:57Z",
"uptime_seconds": 282,
"kernel": "6.12.62+rpt-rpi-2712",
"temp_c": 45.8,
"temp_c": 41.9,
"memory_mb": {
"total": 8059,
"used": 964,
"free": 7094
"used": 974,
"free": 7084
},
"disk": "22G/29G (81%)",
"load": [
0.16,
0.44,
0.5
0.41,
1.11,
0.6
],
"ollama_models": [
"nomic-embed-text:latest",
@@ -25,5 +25,5 @@
],
"throttle": "N/A",
"voltage": "N/A",
"services_running": 39
"services_running": 40
}

View File

@@ -0,0 +1,50 @@
[2026-03-16 22:00:02] [DIAL] [cecilia] Switchboard unreachable
[2026-03-16 22:01:01] [BEAT] [cecilia] load=0.31 mem=496/8062MB temp=35.9C disk=33%
[2026-03-16 22:02:01] [BEAT] [cecilia] load=0.21 mem=494/8062MB temp=35.9C disk=33%
[2026-03-16 22:03:02] [BEAT] [cecilia] load=0.17 mem=493/8062MB temp=35.3C disk=33%
[2026-03-16 22:04:01] [BEAT] [cecilia] load=0.16 mem=489/8062MB temp=35.9C disk=33%
[2026-03-16 22:05:01] [BEAT] [cecilia] load=0.30 mem=458/8062MB temp=37.0C disk=33%
[2026-03-16 22:05:01] [HEAL] [cecilia] High swap: 2038MB — clearing inactive
[2026-03-16 22:06:01] [BEAT] [cecilia] load=0.27 mem=513/8062MB temp=35.9C disk=33%
[2026-03-16 22:06:23] [DIAL] [cecilia] Switchboard unreachable
[2026-03-16 22:07:01] [BEAT] [cecilia] load=0.30 mem=490/8062MB temp=35.3C disk=33%
[2026-03-16 22:08:01] [BEAT] [cecilia] load=0.27 mem=487/8062MB temp=35.9C disk=33%
[2026-03-16 22:09:01] [BEAT] [cecilia] load=1.14 mem=521/8062MB temp=35.3C disk=33%
[2026-03-16 22:10:01] [FLEET] [cecilia] Starting cross-node health check
[2026-03-16 22:10:01] [FLEET] [cecilia] alice: DOWN (no ping response)
[2026-03-16 22:10:01] [FLEET] [cecilia] octavia: DOWN (no ping response)
[2026-03-16 22:10:01] [FLEET] [cecilia] gematria: DOWN (no ping response)
[2026-03-16 22:10:01] [BEAT] [cecilia] load=1.13 mem=479/8062MB temp=37.0C disk=33%
[2026-03-16 22:10:01] [FLEET] [cecilia] lucidia: DOWN (no ping response)
[2026-03-16 22:10:01] [FLEET] [cecilia] aria: DOWN (no ping response)
[2026-03-16 22:10:01] [FLEET] [cecilia] anastasia: DOWN (no ping response)
[2026-03-16 22:10:01] [HEAL] [cecilia] High swap: 2038MB — clearing inactive
[2026-03-16 22:11:01] [BEAT] [cecilia] load=0.69 mem=524/8062MB temp=35.3C disk=33%
[2026-03-16 22:12:01] [BEAT] [cecilia] load=0.40 mem=517/8062MB temp=35.9C disk=33%
[2026-03-16 22:13:01] [BEAT] [cecilia] load=0.31 mem=518/8062MB temp=35.9C disk=33%
[2026-03-16 22:14:01] [BEAT] [cecilia] load=0.22 mem=517/8062MB temp=34.8C disk=33%
[2026-03-16 22:15:01] [BEAT] [cecilia] load=0.18 mem=482/8062MB temp=37.0C disk=33%
[2026-03-16 22:15:01] [HEAL] [cecilia] High swap: 2038MB — clearing inactive
[2026-03-16 22:15:01] [DIAL] [cecilia] Switchboard unreachable
[2026-03-16 22:16:01] [BEAT] [cecilia] load=0.27 mem=508/8062MB temp=35.9C disk=33%
[2026-03-16 22:17:01] [BEAT] [cecilia] load=0.21 mem=509/8062MB temp=36.4C disk=33%
[2026-03-16 22:18:01] [BEAT] [cecilia] load=0.19 mem=505/8062MB temp=35.9C disk=33%
[2026-03-16 22:19:01] [BEAT] [cecilia] load=0.25 mem=503/8062MB temp=35.9C disk=33%
[2026-03-16 22:20:01] [FLEET] [cecilia] Starting cross-node health check
[2026-03-16 22:20:01] [FLEET] [cecilia] alice: DOWN (no ping response)
[2026-03-16 22:20:01] [FLEET] [cecilia] octavia: DOWN (no ping response)
[2026-03-16 22:20:01] [BEAT] [cecilia] load=0.43 mem=479/8062MB temp=35.9C disk=33%
[2026-03-16 22:20:01] [FLEET] [cecilia] gematria: DOWN (no ping response)
[2026-03-16 22:20:01] [FLEET] [cecilia] lucidia: DOWN (no ping response)
[2026-03-16 22:20:01] [FLEET] [cecilia] aria: DOWN (no ping response)
[2026-03-16 22:20:01] [FLEET] [cecilia] anastasia: DOWN (no ping response)
[2026-03-16 22:20:02] [HEAL] [cecilia] High swap: 2038MB — clearing inactive
[2026-03-16 22:21:01] [BEAT] [cecilia] load=0.23 mem=523/8062MB temp=34.2C disk=33%
[2026-03-16 22:21:26] [DIAL] [cecilia] Switchboard unreachable
[2026-03-16 22:22:01] [BEAT] [cecilia] load=0.13 mem=513/8062MB temp=36.4C disk=33%
[2026-03-16 22:23:01] [BEAT] [cecilia] load=0.18 mem=494/8062MB temp=35.9C disk=33%
[2026-03-16 22:24:01] [BEAT] [cecilia] load=0.13 mem=491/8062MB temp=35.9C disk=33%
[2026-03-16 22:26:01] [BEAT] [cecilia] load=0.25 mem=7035/8062MB temp=38.6C disk=33%
[2026-03-16 22:26:43] [DIAL] [cecilia] Switchboard unreachable
[2026-03-16 22:26:56] [BEAT] [cecilia] load=0.20 mem=7051/8062MB temp=35.9C disk=33%
[2026-03-16 22:26:56] [BEAT] [cecilia] load=0.20 mem=7051/8062MB temp=38.0C disk=33%

View File

@@ -1 +1 @@
{"node":"cecilia","ts":"2026-03-16T07:31:43Z","load":0.51,"mem_free_mb":2119,"mem_total_mb":8062,"temp_c":39.1,"disk_pct":31,"throttle":"0x50000"}
{"node":"cecilia","ts":"2026-03-17T03:26:56Z","load":0.20,"mem_free_mb":7051,"mem_total_mb":8062,"temp_c":38.0,"disk_pct":33,"throttle":"N/A"}

View File

@@ -1 +1 @@
2026-03-15T21:49:17-05:00
2026-03-16T22:25:58-05:00

View File

@@ -0,0 +1,32 @@
LISTEN 0 200 127.0.0.1:5432 0.0.0.0:*
LISTEN 0 128 0.0.0.0:34001 0.0.0.0:*
LISTEN 0 32 192.168.4.96:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:5001 0.0.0.0:* users:(("python3",pid=1564,fd=3))
LISTEN 0 128 0.0.0.0:5002 0.0.0.0:* users:(("python3",pid=1551,fd=3))
LISTEN 0 5 0.0.0.0:9100 0.0.0.0:*
LISTEN 0 32 127.0.0.1:53 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8787 0.0.0.0:* users:(("python3",pid=1546,fd=3))
LISTEN 0 2048 0.0.0.0:8788 0.0.0.0:* users:(("python3",pid=1387,fd=16))
LISTEN 0 4096 127.0.0.1:9000 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 5 0.0.0.0:4010 0.0.0.0:* users:(("python3",pid=1034,fd=3))
LISTEN 0 511 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 5 0.0.0.0:7890 0.0.0.0:* users:(("python3",pid=1245,fd=5))
LISTEN 0 4096 127.0.0.1:8088 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:20241 0.0.0.0:*
LISTEN 0 5 0.0.0.0:11435 0.0.0.0:* users:(("python3",pid=1403,fd=3))
LISTEN 0 511 0.0.0.0:3100 0.0.0.0:*
LISTEN 0 5 0.0.0.0:3000 0.0.0.0:* users:(("python3",pid=1547,fd=3))
LISTEN 0 5 0.0.0.0:3001 0.0.0.0:*
LISTEN 0 16 *:5900 *:*
LISTEN 0 4096 *:9000 *:*
LISTEN 0 4096 *:9001 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 200 [::1]:5432 [::]:*
LISTEN 0 511 [::]:8080 [::]:*
LISTEN 0 4096 *:8086 *:*
LISTEN 0 4096 *:11434 *:*
LISTEN 0 32 [::1]:53 [::]:*
LISTEN 0 4096 [::1]:9000 [::]:*

View File

@@ -0,0 +1,39 @@
accounts-daemon.service
avahi-daemon.service
blackroad-agent.service
blackroad-dashboard.service
blackroad-monitor.service
blackroad-nats-agent.service
bluetooth.service
cece-api.service
cece-heartbeat.service
cloudflared.service
containerd.service
cron.service
dbus.service
dnsmasq.service
docker.service
getty@tty1.service
hailort.service
influxdb.service
minio.service
ModemManager.service
NetworkManager.service
ollama.service
pironman5.service
polkit.service
postgresql@17-main.service
roadnet-failover.service
serial-getty@ttyAMA10.service
ssh.service
stats-proxy.service
systemd-journald.service
systemd-logind.service
systemd-timesyncd.service
systemd-udevd.service
udisks2.service
user@1000.service
user@1001.service
wayvnc-control.service
wayvnc.service
wpa_supplicant.service

View File

@@ -1 +1 @@
{"node":"cecilia","status":"down","ts":"2026-03-17T02:59:54Z"}
{"node":"cecilia","status":"down","ts":"2026-03-17T03:20:28Z"}

View File

@@ -0,0 +1,38 @@
{
"hostname": "cecilia",
"ts": "2026-03-17T03:26:57Z",
"uptime_seconds": 126,
"kernel": "6.12.62+rpt-rpi-2712",
"temp_c": 37.0,
"memory_mb": {
"total": 8062,
"used": 1022,
"free": 7040
},
"disk": "142G/457G (33%)",
"load": [
0.2,
0.1,
0.03
],
"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

@@ -0,0 +1,14 @@
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=682329,fd=14))
LISTEN 0 4096 127.0.0.1:2019 0.0.0.0:* users:(("caddy",pid=26445,fd=9))
LISTEN 0 5 0.0.0.0:11435 0.0.0.0:* users:(("python3",pid=147655,fd=3))
LISTEN 0 5 0.0.0.0:8787 0.0.0.0:* users:(("python3",pid=577215,fd=3))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=3335327,fd=3))
LISTEN 0 4096 127.0.0.1:20241 0.0.0.0:* users:(("cloudflared",pid=156470,fd=3))
LISTEN 0 128 127.0.0.1:8011 0.0.0.0:* users:(("sshd",pid=4152649,fd=5))
LISTEN 0 4096 *:11434 *:* users:(("ollama",pid=279794,fd=3))
LISTEN 0 4096 *:11436 *:* users:(("caddy",pid=26445,fd=16))
LISTEN 0 4096 *:443 *:* users:(("caddy",pid=26445,fd=11))
LISTEN 0 4096 *:80 *:* users:(("caddy",pid=26445,fd=15))
LISTEN 0 4096 *:4222 *:* users:(("nats-server",pid=1353183,fd=6))
LISTEN 0 4096 *:8222 *:* users:(("nats-server",pid=1353183,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=3335327,fd=4))

View File

@@ -1,19 +1,19 @@
{
"hostname": "gematria",
"ts": "2026-03-17T02:59:57Z",
"uptime_seconds": 5515589,
"ts": "2026-03-17T03:27:00Z",
"uptime_seconds": 5517212,
"kernel": "5.15.0-113-generic",
"temp_c": 0,
"memory_mb": {
"total": 7937,
"used": 1225,
"free": 6262
"used": 1218,
"free": 6271
},
"disk": "53G/78G (68%)",
"load": [
0.02,
0.06,
0.08
0.05,
0.04
],
"ollama_models": [
"qwen2.5:7b",

Binary file not shown.

View File

@@ -1,14 +1,14 @@
blackroad-gitea Up 24 hours
road-pdns-admin Up 24 hours (healthy)
road-pdns Up 24 hours
road-dns-db Up 24 hours
roadauth Up 24 hours
roadapi Up 24 hours
blackroad-edge-agent Up 24 hours
blackroad.systems Up 24 hours
blackroadai.com Up 24 hours
blackroad-auth-gateway Up 24 hours
blackroad-metaverse Up 24 hours
blackroad-os Up 24 hours
blackroad-os-carpool Up 24 hours
pi-my-agent-1 Up 24 hours (healthy)
blackroad-gitea Up 3 minutes
road-pdns-admin Up 3 minutes (healthy)
road-pdns Up 3 minutes
road-dns-db Up 3 minutes
roadauth Up 3 minutes
roadapi Up 3 minutes
blackroad-edge-agent Up 3 minutes
blackroad.systems Up 3 minutes
blackroadai.com Up 3 minutes
blackroad-auth-gateway Up 3 minutes
blackroad-metaverse Up 3 minutes
blackroad-os Up 3 minutes
blackroad-os-carpool Up 3 minutes
pi-my-agent-1 Up 3 minutes (healthy)

View File

@@ -1 +1 @@
{"node":"lucidia","ts":"2026-03-17T02:59:53Z","load":1.58,"mem_free_mb":3293,"mem_total_mb":8063,"temp_c":46.9,"disk_pct":34,"throttle":"0x0"}
{"node":"lucidia","ts":"2026-03-17T03:26:56Z","load":3.01,"mem_free_mb":3497,"mem_total_mb":8063,"temp_c":52.4,"disk_pct":33,"throttle":"N/A"}

View File

@@ -1,54 +1,54 @@
LISTEN 0 4096 100.66.235.47:38850 0.0.0.0:*
LISTEN 0 511 127.0.0.1:4010 0.0.0.0:*
LISTEN 0 128 0.0.0.0:34001 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:8088 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:20241 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:20242 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8889 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8787 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:35031 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9090 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8889 0.0.0.0:*
LISTEN 0 128 127.0.0.1:631 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9192 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:9090 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 32 127.0.0.1:53 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:45253 0.0.0.0:*
LISTEN 0 200 127.0.0.1:5432 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:4001 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:4002 0.0.0.0:*
LISTEN 0 128 0.0.0.0:34001 0.0.0.0:*
LISTEN 0 5 0.0.0.0:3000 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3002 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3005 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3006 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:2222 0.0.0.0:*
LISTEN 0 4096 100.66.235.47:38850 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:20242 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:20241 0.0.0.0:*
LISTEN 0 511 127.0.0.1:4010 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:8088 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8011 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8000 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8180 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8182 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 511 0.0.0.0:8081 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:8082 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8180 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8182 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8011 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8000 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3109 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:4001 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:4002 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3100 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3005 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3006 0.0.0.0:*
LISTEN 0 5 0.0.0.0:3000 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3002 0.0.0.0:*
LISTEN 0 32 127.0.0.1:53 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:2222 0.0.0.0:*
LISTEN 0 128 127.0.0.1:631 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:3109 0.0.0.0:*
LISTEN 0 4096 [::]:9192 [::]:*
LISTEN 0 128 [::1]:631 [::]:*
LISTEN 0 4096 *:9100 *:*
LISTEN 0 4096 [::]:9090 [::]:*
LISTEN 0 4096 [::]:9192 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 128 [::1]:631 [::]:*
LISTEN 0 4096 [::]:4001 [::]:*
LISTEN 0 4096 [::]:4002 [::]:*
LISTEN 0 511 *:8090 *:*
LISTEN 0 4096 *:8086 *:*
LISTEN 0 4096 [::]:8080 [::]:*
LISTEN 0 4096 [::]:8082 [::]:*
LISTEN 0 4096 *:11434 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 32 [::1]:53 [::]:*
LISTEN 0 4096 [::]:3109 [::]:*
LISTEN 0 4096 [::]:3100 [::]:*
LISTEN 0 4096 [fd7a:115c:a1e0::5401:eb6c]:46193 [::]:*
LISTEN 0 200 [::1]:5432 [::]:*
LISTEN 0 4096 [::]:3002 [::]:*
LISTEN 0 4096 [::]:3005 [::]:*
LISTEN 0 4096 [::]:3006 [::]:*
LISTEN 0 4096 [::]:3002 [::]:*
LISTEN 0 4096 [::]:2222 [::]:*
LISTEN 0 200 [::1]:5432 [::]:*
LISTEN 0 4096 [fd7a:115c:a1e0::5401:eb6c]:46193 [::]:*
LISTEN 0 511 *:8090 *:*
LISTEN 0 4096 [::]:8080 [::]:*
LISTEN 0 4096 [::]:8082 [::]:*
LISTEN 0 4096 *:8086 *:*
LISTEN 0 4096 [::]:4001 [::]:*
LISTEN 0 4096 [::]:4002 [::]:*
LISTEN 0 4096 [::]:3100 [::]:*
LISTEN 0 4096 [::]:3109 [::]:*
LISTEN 0 4096 *:11434 *:*

View File

@@ -6,7 +6,6 @@ blackroad-agent.service
blackroad-api.service
blackroad-nats-agent.service
blackroad-relay.service
blackroad-ssh-tunnel.service
bluetooth.service
cloudflared.service
colord.service
@@ -29,7 +28,6 @@ pironman5.service
pm2-pi.service
polkit.service
postgresql@17-main.service
road-phone.service
roadnet-failover.service
rtkit-daemon.service
serial-getty@ttyAMA10.service

View File

@@ -1,19 +1,19 @@
{
"hostname": "octavia",
"ts": "2026-03-17T02:59:54Z",
"uptime_seconds": 87152,
"ts": "2026-03-17T03:26:57Z",
"uptime_seconds": 189,
"kernel": "6.12.62+rpt-rpi-2712",
"temp_c": 47.4,
"temp_c": 51.8,
"memory_mb": {
"total": 8063,
"used": 4781,
"free": 3281
"used": 4592,
"free": 3470
},
"disk": "74G/235G (34%)",
"disk": "74G/235G (33%)",
"load": [
1.58,
3.28,
4.17
3.01,
2.63,
1.13
],
"ollama_models": [
"qwen2.5:3b",
@@ -23,7 +23,7 @@
"tinyllama:latest",
"qwen2.5:1.5b"
],
"throttle": "0x0",
"voltage": "0.8587V",
"services_running": 48
"throttle": "N/A",
"voltage": "N/A",
"services_running": 46
}

View File

@@ -1 +1 @@
{"node":"octavia","status":"down","ts":"2026-03-17T02:59:54Z"}
{"node":"octavia","status":"down","ts":"2026-03-17T03:26:56Z"}

View File

@@ -0,0 +1,338 @@
#!/bin/bash
# BlackRoad Schedule Agent — Reads Google Calendar, posts to Slack, agents work on blocks
# Uses MCP calendar tools via the Slack Worker API
# Usage: memory-schedule.sh <command> [args]
set -e
COLLAB_DB="$HOME/.blackroad/collaboration.db"
SESSION_FILE="$HOME/.blackroad/memory/current-collab-session"
SLACK_API="https://blackroad-slack.amundsonalexa.workers.dev"
SCHEDULE_DB="$HOME/.blackroad/schedule.db"
PINK='\033[38;5;205m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
RED='\033[0;31m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m'
sql() { sqlite3 "$SCHEDULE_DB" "$@" 2>/dev/null; }
post_to_slack() {
curl -s --max-time 3 --connect-timeout 2 \
-X POST "$SLACK_API/post" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg t "$1" '{text:$t}')" >/dev/null 2>&1 || true
}
get_session() {
[[ -f "$SESSION_FILE" ]] && cat "$SESSION_FILE" || echo "unknown"
}
# ── INIT ──
cmd_init() {
mkdir -p "$(dirname "$SCHEDULE_DB")"
sqlite3 "$SCHEDULE_DB" <<'SQL'
PRAGMA journal_mode=WAL;
CREATE TABLE IF NOT EXISTS schedule_blocks (
block_id TEXT PRIMARY KEY,
date TEXT NOT NULL,
start_time TEXT NOT NULL,
end_time TEXT NOT NULL,
summary TEXT NOT NULL,
description TEXT DEFAULT '',
copilot_prompt TEXT DEFAULT '',
claimed_by TEXT DEFAULT '',
status TEXT DEFAULT 'open',
gcal_event_id TEXT DEFAULT ''
);
CREATE INDEX IF NOT EXISTS idx_blocks_date ON schedule_blocks(date);
CREATE TABLE IF NOT EXISTS block_logs (
log_id INTEGER PRIMARY KEY AUTOINCREMENT,
block_id TEXT NOT NULL,
session_id TEXT NOT NULL,
action TEXT NOT NULL,
details TEXT DEFAULT '',
created_at TEXT NOT NULL
);
SQL
echo -e "${GREEN}Schedule DB initialized${NC}"
}
# ── TODAY ──
cmd_today() {
local today
today=$(date +%Y-%m-%d)
echo -e "${PINK}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${PINK}${NC} ${BOLD}Schedule — $today${NC} ${PINK}${NC}"
echo -e "${PINK}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
# Check if we have today's blocks cached
local count
count=$(sql "SELECT count(*) FROM schedule_blocks WHERE date='$today';" 2>/dev/null || echo "0")
if [[ "$count" -eq 0 || "$count" == "0" ]]; then
echo -e " ${YELLOW}No blocks cached for today. Run: $0 sync${NC}"
echo ""
return
fi
sql "SELECT start_time, end_time, summary, claimed_by, status, copilot_prompt FROM schedule_blocks WHERE date='$today' ORDER BY start_time;" | while IFS='|' read -r start end summary claimed status prompt; do
local icon="⬜"
local extra=""
case "$status" in
claimed) icon="🔵"; extra=" ${DIM}(${claimed})${NC}" ;;
done) icon="✅" ;;
active) icon="🟢"; extra=" ${GREEN}ACTIVE${NC}" ;;
esac
echo -e " $icon ${BOLD}${start}-${end}${NC} $summary$extra"
if [[ -n "$prompt" && "$1" == "--prompts" ]]; then
echo -e " ${DIM}Prompt: ${prompt:0:120}${NC}"
fi
done
echo ""
local open claimed done
open=$(sql "SELECT count(*) FROM schedule_blocks WHERE date='$today' AND status='open';")
claimed=$(sql "SELECT count(*) FROM schedule_blocks WHERE date='$today' AND status='claimed';")
done=$(sql "SELECT count(*) FROM schedule_blocks WHERE date='$today' AND status='done';")
echo -e " ${GREEN}$done done${NC} | ${BLUE}$claimed claimed${NC} | ${YELLOW}$open open${NC}"
}
# ── SYNC — Import from calendar JSON cache ──
cmd_sync() {
cmd_init 2>/dev/null
local today
today=$(date +%Y-%m-%d)
echo -e "${BLUE}Syncing calendar for $today...${NC}"
# Find the latest calendar JSON from MCP tool results
local json_file
json_file=$(find "$HOME/.claude/projects" -name "*.json" -path "*/tool-results/*" -newer /tmp/.schedule-sync-marker 2>/dev/null | head -1)
if [[ -z "$json_file" ]]; then
# Try to find any recent calendar result
json_file=$(find "$HOME/.claude/projects" -name "*.json" -path "*/tool-results/*" -exec grep -l "calendar" {} \; 2>/dev/null | head -1)
fi
if [[ -n "$json_file" ]]; then
# Parse events from JSON
python3 -c "
import json, sys
with open('$json_file') as f:
data = json.load(f)
text = data[0]['text'] if isinstance(data, list) else data
events_data = json.loads(text) if isinstance(text, str) else text
events = events_data.get('events', [])
today = '$today'
for e in events:
start = e.get('start', {})
dt = start.get('dateTime', start.get('date', ''))
if not dt.startswith(today):
continue
start_time = dt[11:16] if len(dt) > 10 else '00:00'
end_dt = e.get('end', {}).get('dateTime', '')
end_time = end_dt[11:16] if len(end_dt) > 10 else '23:59'
summary = e.get('summary', '?').replace(\"'\", \"''\")
desc = (e.get('description', '') or '').replace(\"'\", \"''\")
# Extract Copilot prompt if present
prompt = ''
if 'Copilot Prompt:' in desc:
prompt = desc.split('Copilot Prompt:')[1].strip().strip(\"'\").replace(\"'\", \"''\")
event_id = e.get('id', '')
block_id = f'{today}-{start_time}'
print(f\"INSERT OR REPLACE INTO schedule_blocks (block_id, date, start_time, end_time, summary, description, copilot_prompt, gcal_event_id) VALUES ('{block_id}', '{today}', '{start_time}', '{end_time}', '{summary}', '{desc[:500]}', '{prompt[:500]}', '{event_id}');\")
" 2>/dev/null | sqlite3 "$SCHEDULE_DB" 2>/dev/null
local synced
synced=$(sql "SELECT count(*) FROM schedule_blocks WHERE date='$today';")
echo -e "${GREEN}Synced $synced blocks for $today${NC}"
touch /tmp/.schedule-sync-marker
else
echo -e "${YELLOW}No calendar data found. Use MCP calendar tools first, then re-run sync.${NC}"
fi
}
# ── CLAIM ──
cmd_claim() {
local time_or_id="$1"
[[ -z "$time_or_id" ]] && { echo -e "${RED}Usage: $0 claim <start-time or block-id>${NC}"; exit 1; }
local session
session=$(get_session)
local today
today=$(date +%Y-%m-%d)
local now
now=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Try matching by start_time first
local block_id
block_id=$(sql "SELECT block_id FROM schedule_blocks WHERE (start_time='$time_or_id' OR block_id='$time_or_id') AND date='$today' LIMIT 1;")
if [[ -z "$block_id" ]]; then
echo -e "${RED}No block found matching '$time_or_id' for today${NC}"
return 1
fi
sql "UPDATE schedule_blocks SET claimed_by='$session', status='claimed' WHERE block_id='$block_id';"
local summary
summary=$(sql "SELECT summary FROM schedule_blocks WHERE block_id='$block_id';")
echo -e "${GREEN}Claimed:${NC} $summary"
# Show the Copilot prompt
local prompt
prompt=$(sql "SELECT copilot_prompt FROM schedule_blocks WHERE block_id='$block_id';")
if [[ -n "$prompt" ]]; then
echo -e "${CYAN}Copilot Prompt:${NC} $prompt"
fi
post_to_slack "🔵 *Block Claimed* [$session]: $summary" &
sql "INSERT INTO block_logs (block_id, session_id, action, details, created_at) VALUES ('$block_id', '$session', 'claimed', '$summary', '$now');"
}
# ── COMPLETE ──
cmd_complete() {
local time_or_id="$1"
[[ -z "$time_or_id" ]] && { echo -e "${RED}Usage: $0 complete <start-time or block-id>${NC}"; exit 1; }
local today
today=$(date +%Y-%m-%d)
local now
now=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
local session
session=$(get_session)
local block_id
block_id=$(sql "SELECT block_id FROM schedule_blocks WHERE (start_time='$time_or_id' OR block_id='$time_or_id') AND date='$today' LIMIT 1;")
if [[ -z "$block_id" ]]; then
echo -e "${RED}No block found matching '$time_or_id'${NC}"
return 1
fi
sql "UPDATE schedule_blocks SET status='done' WHERE block_id='$block_id';"
local summary
summary=$(sql "SELECT summary FROM schedule_blocks WHERE block_id='$block_id';")
echo -e "${GREEN}✅ Completed:${NC} $summary"
post_to_slack "✅ *Block Done*: $summary" &
sql "INSERT INTO block_logs (block_id, session_id, action, details, created_at) VALUES ('$block_id', '$session', 'completed', '$summary', '$now');"
}
# ── PROMPT — Show the Copilot prompt for a block ──
cmd_prompt() {
local time_or_id="$1"
[[ -z "$time_or_id" ]] && { echo -e "${RED}Usage: $0 prompt <start-time>${NC}"; exit 1; }
local today
today=$(date +%Y-%m-%d)
local result
result=$(sql "SELECT summary, copilot_prompt, description FROM schedule_blocks WHERE (start_time='$time_or_id' OR block_id='$time_or_id') AND date='$today' LIMIT 1;")
if [[ -z "$result" ]]; then
echo -e "${RED}No block found${NC}"
return 1
fi
IFS='|' read -r summary prompt desc <<< "$result"
echo -e "${BOLD}$summary${NC}"
echo ""
if [[ -n "$prompt" ]]; then
echo -e "${CYAN}Copilot Prompt:${NC}"
echo "$prompt"
else
echo -e "${DIM}No Copilot prompt — full description:${NC}"
echo "$desc"
fi
}
# ── POST — Post today's schedule to Slack ──
cmd_post() {
local today
today=$(date +%Y-%m-%d)
local msg="📅 *Schedule — $today*\n"
sql "SELECT start_time, end_time, summary, status FROM schedule_blocks WHERE date='$today' ORDER BY start_time;" | while IFS='|' read -r start end summary status; do
local icon="⬜"
case "$status" in
claimed) icon="🔵" ;;
done) icon="✅" ;;
active) icon="🟢" ;;
esac
msg="${msg}\n${icon} ${start}-${end} ${summary}"
done
post_to_slack "$msg"
echo -e "${GREEN}Schedule posted to Slack${NC}"
}
# ── NEXT — What block is coming up? ──
cmd_next() {
local today
today=$(date +%Y-%m-%d)
local now_time
now_time=$(date +%H:%M)
local result
result=$(sql "SELECT start_time, end_time, summary, copilot_prompt FROM schedule_blocks WHERE date='$today' AND start_time >= '$now_time' AND status='open' ORDER BY start_time LIMIT 1;")
if [[ -z "$result" ]]; then
echo -e "${GREEN}No more open blocks today!${NC}"
return
fi
IFS='|' read -r start end summary prompt <<< "$result"
echo -e "${BOLD}Next:${NC} ${start}-${end} ${CYAN}$summary${NC}"
if [[ -n "$prompt" ]]; then
echo -e "${DIM}Prompt: ${prompt:0:150}${NC}"
fi
}
# ── HELP ──
cmd_help() {
cat <<EOF
${PINK}╔════════════════════════════════════════════════════════════╗${NC}
${PINK}║${NC} ${BOLD}BlackRoad Schedule Agent${NC} ${PINK}║${NC}
${PINK}╚════════════════════════════════════════════════════════════╝${NC}
${BOLD}Commands:${NC}
${CYAN}today [--prompts]${NC} Show today's schedule (add --prompts for Copilot prompts)
${CYAN}sync${NC} Import today's events from calendar cache
${CYAN}next${NC} Show next upcoming open block
${CYAN}claim <time>${NC} Claim a block (e.g. claim 13:00)
${CYAN}complete <time>${NC} Mark a block as done
${CYAN}prompt <time>${NC} Show Copilot prompt for a block
${CYAN}post${NC} Post schedule to Slack
${BOLD}Examples:${NC}
$0 sync # Import from Google Calendar
$0 today --prompts # Show schedule with AI prompts
$0 claim 13:00 # Claim the 1pm block
$0 prompt 16:00 # Show the Copilot prompt for 4pm
$0 complete 13:00 # Mark 1pm block done
EOF
}
case "${1:-help}" in
init) cmd_init ;;
today|t) shift 2>/dev/null || true; cmd_today "$@" ;;
sync|s) cmd_sync ;;
claim|c) shift; cmd_claim "$@" ;;
complete|done|d) shift; cmd_complete "$@" ;;
prompt|p) shift; cmd_prompt "$@" ;;
post) cmd_post ;;
next|n) cmd_next ;;
help|--help|-h) cmd_help ;;
*)
echo -e "${RED}Unknown: $1${NC}"
cmd_help
exit 1
;;
esac

1
roadc/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
__pycache__/

3
roadc/CODEOWNERS Normal file
View File

@@ -0,0 +1,3 @@
# BlackRoad OS, Inc. — Code Ownership
# All changes require review from the founder
* @blackboxprogramming