Add 14 core scripts: models, routing, RAG, 30K orchestration
- Model interceptor and registry for LLM management - Color router for brand-aware request routing - 30K agent orchestrator and memory bridge - RAG pipeline for retrieval-augmented generation - Metrics API for telemetry collection - Code sandbox for safe execution - Pattern interceptor for request analysis - Equations engine for mathematical operations - Batch processor for bulk operations - NL shell for natural language commands - Vision LLM for multimodal inference Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
393
scripts/30k-orchestrator.sh
Normal file
393
scripts/30k-orchestrator.sh
Normal file
@@ -0,0 +1,393 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================================================
|
||||||
|
# BLACKROAD OS, INC. - PROPRIETARY AND CONFIDENTIAL
|
||||||
|
# Copyright (c) 2024-2026 BlackRoad OS, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# This code is the intellectual property of BlackRoad OS, Inc.
|
||||||
|
# AI-assisted development does not transfer ownership to AI providers.
|
||||||
|
# Unauthorized use, copying, or distribution is prohibited.
|
||||||
|
# NOT licensed for AI training or data extraction.
|
||||||
|
# ============================================================================
|
||||||
|
# BlackRoad 30K Agent Orchestrator
|
||||||
|
# Manages 30,000 AI agents across 4 hierarchy levels
|
||||||
|
# Level 1: 1 Operator (ALEXA)
|
||||||
|
# Level 2: 15 Division Commanders
|
||||||
|
# Level 3: 200 Service Managers
|
||||||
|
# Level 4: 29,784 Task Workers
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
AMBER='\033[38;5;214m'
|
||||||
|
BLUE='\033[38;5;69m'
|
||||||
|
VIOLET='\033[38;5;135m'
|
||||||
|
GREEN='\033[38;5;82m'
|
||||||
|
RED='\033[38;5;196m'
|
||||||
|
WHITE='\033[1;37m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
# Database
|
||||||
|
ORCHESTRATOR_DB="${HOME}/.blackroad-30k-orchestrator.db"
|
||||||
|
REGISTRY_DB="${HOME}/.blackroad-agent-registry.db"
|
||||||
|
|
||||||
|
# Hierarchy Constants
|
||||||
|
LEVEL_1_COUNT=1 # Operator
|
||||||
|
LEVEL_2_COUNT=15 # Division Commanders
|
||||||
|
LEVEL_3_COUNT=200 # Service Managers
|
||||||
|
LEVEL_4_COUNT=29784 # Task Workers
|
||||||
|
TOTAL_AGENTS=30000
|
||||||
|
|
||||||
|
# Division Names (Level 2)
|
||||||
|
DIVISIONS=(
|
||||||
|
"OS" # BlackRoad-OS
|
||||||
|
"AI" # BlackRoad-AI
|
||||||
|
"Cloud" # BlackRoad-Cloud
|
||||||
|
"Security" # BlackRoad-Security
|
||||||
|
"Media" # BlackRoad-Media
|
||||||
|
"Foundation" # BlackRoad-Foundation
|
||||||
|
"Interactive" # BlackRoad-Interactive
|
||||||
|
"Labs" # BlackRoad-Labs
|
||||||
|
"Hardware" # BlackRoad-Hardware
|
||||||
|
"Studio" # BlackRoad-Studio
|
||||||
|
"Ventures" # BlackRoad-Ventures
|
||||||
|
"Education" # BlackRoad-Education
|
||||||
|
"Gov" # BlackRoad-Gov
|
||||||
|
"Archive" # BlackRoad-Archive
|
||||||
|
"Blackbox" # Blackbox-Enterprises
|
||||||
|
)
|
||||||
|
|
||||||
|
banner() {
|
||||||
|
echo -e "${PINK}╔══════════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${PINK}║${RESET} ${WHITE}🖤🛣️ BLACKROAD 30K AGENT ORCHESTRATOR${RESET} ${PINK}║${RESET}"
|
||||||
|
echo -e "${PINK}║${RESET} ${VIOLET}Level 1: 1 Operator | Level 2: 15 Divisions${RESET} ${PINK}║${RESET}"
|
||||||
|
echo -e "${PINK}║${RESET} ${BLUE}Level 3: 200 Managers | Level 4: 29,784 Workers${RESET} ${PINK}║${RESET}"
|
||||||
|
echo -e "${PINK}╚══════════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize orchestrator database
|
||||||
|
init_db() {
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" <<'EOF'
|
||||||
|
-- Agent Hierarchy
|
||||||
|
CREATE TABLE IF NOT EXISTS agent_hierarchy (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
agent_id TEXT UNIQUE NOT NULL,
|
||||||
|
agent_name TEXT NOT NULL,
|
||||||
|
level INTEGER NOT NULL, -- 1=Operator, 2=Division, 3=Manager, 4=Worker
|
||||||
|
division TEXT, -- Which division (for L2+)
|
||||||
|
parent_id TEXT, -- Parent agent
|
||||||
|
status TEXT DEFAULT 'active',
|
||||||
|
current_task TEXT,
|
||||||
|
tasks_completed INTEGER DEFAULT 0,
|
||||||
|
last_heartbeat DATETIME,
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Task Queue
|
||||||
|
CREATE TABLE IF NOT EXISTS task_queue (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
task_id TEXT UNIQUE NOT NULL,
|
||||||
|
title TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
priority TEXT DEFAULT 'medium', -- urgent, high, medium, low
|
||||||
|
target_level INTEGER, -- Which level should handle
|
||||||
|
target_division TEXT, -- Optional: specific division
|
||||||
|
assigned_agent TEXT,
|
||||||
|
status TEXT DEFAULT 'pending', -- pending, assigned, in_progress, completed, failed
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
assigned_at DATETIME,
|
||||||
|
completed_at DATETIME,
|
||||||
|
result TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Service Registry
|
||||||
|
CREATE TABLE IF NOT EXISTS services (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
service_id TEXT UNIQUE NOT NULL,
|
||||||
|
service_name TEXT NOT NULL,
|
||||||
|
division TEXT,
|
||||||
|
endpoint TEXT,
|
||||||
|
port INTEGER,
|
||||||
|
health_check TEXT,
|
||||||
|
status TEXT DEFAULT 'unknown',
|
||||||
|
last_check DATETIME,
|
||||||
|
owner_agent TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Health Metrics
|
||||||
|
CREATE TABLE IF NOT EXISTS health_metrics (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
agent_id TEXT NOT NULL,
|
||||||
|
metric_type TEXT NOT NULL, -- cpu, memory, tasks, latency
|
||||||
|
value REAL,
|
||||||
|
recorded_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create indexes
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_hierarchy_level ON agent_hierarchy(level);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_hierarchy_division ON agent_hierarchy(division);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_tasks_status ON task_queue(status);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_health_agent ON health_metrics(agent_id);
|
||||||
|
EOF
|
||||||
|
echo -e "${GREEN}✓ Orchestrator database initialized${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Bootstrap the hierarchy
|
||||||
|
bootstrap() {
|
||||||
|
banner
|
||||||
|
echo -e "\n${AMBER}Bootstrapping 30K Agent Hierarchy...${RESET}\n"
|
||||||
|
|
||||||
|
init_db
|
||||||
|
|
||||||
|
# Level 1: Operator (ALEXA)
|
||||||
|
echo -e "${WHITE}Level 1: Creating Operator...${RESET}"
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "INSERT OR REPLACE INTO agent_hierarchy
|
||||||
|
(agent_id, agent_name, level, division, status, last_heartbeat)
|
||||||
|
VALUES ('operator-alexa', 'ALEXA', 1, 'ALL', 'active', datetime('now'));"
|
||||||
|
echo -e " ${GREEN}✓${RESET} operator-alexa (ALEXA)"
|
||||||
|
|
||||||
|
# Level 2: Division Commanders
|
||||||
|
echo -e "\n${WHITE}Level 2: Creating ${#DIVISIONS[@]} Division Commanders...${RESET}"
|
||||||
|
for div in "${DIVISIONS[@]}"; do
|
||||||
|
local div_lower=$(echo "$div" | tr '[:upper:]' '[:lower:]')
|
||||||
|
local agent_id="commander-${div_lower}"
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "INSERT OR REPLACE INTO agent_hierarchy
|
||||||
|
(agent_id, agent_name, level, division, parent_id, status, last_heartbeat)
|
||||||
|
VALUES ('$agent_id', '${div} Commander', 2, '$div', 'operator-alexa', 'active', datetime('now'));"
|
||||||
|
echo -e " ${GREEN}✓${RESET} $agent_id"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Level 3: Service Managers (200 total, ~13 per division)
|
||||||
|
echo -e "\n${WHITE}Level 3: Creating 200 Service Managers...${RESET}"
|
||||||
|
local manager_count=0
|
||||||
|
local managers_per_division=$((LEVEL_3_COUNT / LEVEL_2_COUNT))
|
||||||
|
|
||||||
|
for div in "${DIVISIONS[@]}"; do
|
||||||
|
local div_lower=$(echo "$div" | tr '[:upper:]' '[:lower:]')
|
||||||
|
for i in $(seq 1 $managers_per_division); do
|
||||||
|
local agent_id="manager-${div_lower}-$(printf '%03d' $i)"
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "INSERT OR REPLACE INTO agent_hierarchy
|
||||||
|
(agent_id, agent_name, level, division, parent_id, status)
|
||||||
|
VALUES ('$agent_id', '${div} Manager $i', 3, '$div', 'commander-${div_lower}', 'standby');"
|
||||||
|
((manager_count++))
|
||||||
|
done
|
||||||
|
done
|
||||||
|
# Add remaining managers to OS division
|
||||||
|
local remaining=$((LEVEL_3_COUNT - manager_count))
|
||||||
|
for i in $(seq 1 $remaining); do
|
||||||
|
local agent_id="manager-os-extra-$(printf '%03d' $i)"
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "INSERT OR REPLACE INTO agent_hierarchy
|
||||||
|
(agent_id, agent_name, level, division, parent_id, status)
|
||||||
|
VALUES ('$agent_id', 'OS Manager Extra $i', 3, 'OS', 'commander-os', 'standby');"
|
||||||
|
done
|
||||||
|
echo -e " ${GREEN}✓${RESET} 200 managers created"
|
||||||
|
|
||||||
|
# Level 4: Workers are created on-demand (virtual pool)
|
||||||
|
echo -e "\n${WHITE}Level 4: Worker Pool Configured...${RESET}"
|
||||||
|
echo -e " ${BLUE}ℹ${RESET} 29,784 workers available on-demand"
|
||||||
|
echo -e " ${BLUE}ℹ${RESET} Workers spawn when tasks are dispatched"
|
||||||
|
|
||||||
|
echo -e "\n${GREEN}✓ 30K Agent Hierarchy Bootstrapped!${RESET}"
|
||||||
|
stats
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show hierarchy statistics
|
||||||
|
stats() {
|
||||||
|
echo -e "\n${VIOLET}═══ HIERARCHY STATISTICS ═══${RESET}"
|
||||||
|
|
||||||
|
local l1=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=1;")
|
||||||
|
local l2=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=2;")
|
||||||
|
local l3=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=3;")
|
||||||
|
local l4=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=4;")
|
||||||
|
local active=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE status='active';")
|
||||||
|
local tasks_pending=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM task_queue WHERE status='pending';")
|
||||||
|
local tasks_completed=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM task_queue WHERE status='completed';")
|
||||||
|
|
||||||
|
echo -e " ${WHITE}Level 1 (Operator):${RESET} $l1 / $LEVEL_1_COUNT"
|
||||||
|
echo -e " ${WHITE}Level 2 (Commanders):${RESET} $l2 / $LEVEL_2_COUNT"
|
||||||
|
echo -e " ${WHITE}Level 3 (Managers):${RESET} $l3 / $LEVEL_3_COUNT"
|
||||||
|
echo -e " ${WHITE}Level 4 (Workers):${RESET} $l4 / $LEVEL_4_COUNT (on-demand)"
|
||||||
|
echo -e " ${GREEN}Active Agents:${RESET} $active"
|
||||||
|
echo -e " ${AMBER}Pending Tasks:${RESET} $tasks_pending"
|
||||||
|
echo -e " ${GREEN}Completed Tasks:${RESET} $tasks_completed"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dispatch a task to the hierarchy
|
||||||
|
dispatch() {
|
||||||
|
local title="$1"
|
||||||
|
local description="$2"
|
||||||
|
local priority="${3:-medium}"
|
||||||
|
local target_division="${4:-}"
|
||||||
|
|
||||||
|
if [[ -z "$title" ]]; then
|
||||||
|
echo -e "${RED}Usage: $0 dispatch <title> [description] [priority] [division]${RESET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local task_id="task-$(date +%s)-$(openssl rand -hex 4)"
|
||||||
|
local target_level=4 # Default to workers
|
||||||
|
|
||||||
|
# Urgent tasks go to commanders
|
||||||
|
[[ "$priority" == "urgent" ]] && target_level=2
|
||||||
|
[[ "$priority" == "high" ]] && target_level=3
|
||||||
|
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "INSERT INTO task_queue
|
||||||
|
(task_id, title, description, priority, target_level, target_division, status)
|
||||||
|
VALUES ('$task_id', '$title', '$description', '$priority', $target_level, '$target_division', 'pending');"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Task dispatched: ${WHITE}$task_id${RESET}"
|
||||||
|
echo -e " Title: $title"
|
||||||
|
echo -e " Priority: $priority"
|
||||||
|
echo -e " Target Level: $target_level"
|
||||||
|
[[ -n "$target_division" ]] && echo -e " Division: $target_division"
|
||||||
|
|
||||||
|
# Trigger assignment
|
||||||
|
assign_task "$task_id"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Assign pending tasks to agents
|
||||||
|
assign_task() {
|
||||||
|
local task_id="$1"
|
||||||
|
|
||||||
|
local task=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT target_level, target_division FROM task_queue WHERE task_id='$task_id' AND status='pending';")
|
||||||
|
|
||||||
|
if [[ -z "$task" ]]; then
|
||||||
|
echo -e "${AMBER}Task already assigned or not found${RESET}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local level=$(echo "$task" | cut -d'|' -f1)
|
||||||
|
local division=$(echo "$task" | cut -d'|' -f2)
|
||||||
|
|
||||||
|
# Find available agent
|
||||||
|
local query="SELECT agent_id FROM agent_hierarchy WHERE level=$level AND (status='active' OR status='standby')"
|
||||||
|
[[ -n "$division" ]] && query="$query AND division='$division'"
|
||||||
|
query="$query ORDER BY tasks_completed ASC LIMIT 1;"
|
||||||
|
|
||||||
|
local agent=$(sqlite3 "$ORCHESTRATOR_DB" "$query")
|
||||||
|
|
||||||
|
if [[ -n "$agent" ]]; then
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "
|
||||||
|
UPDATE task_queue SET assigned_agent='$agent', status='assigned', assigned_at=datetime('now') WHERE task_id='$task_id';
|
||||||
|
UPDATE agent_hierarchy SET status='active', current_task='$task_id' WHERE agent_id='$agent';
|
||||||
|
"
|
||||||
|
echo -e "${GREEN}✓ Assigned to: ${WHITE}$agent${RESET}"
|
||||||
|
else
|
||||||
|
# Spawn a Level 4 worker
|
||||||
|
local worker_id="worker-$(openssl rand -hex 6)"
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "
|
||||||
|
INSERT INTO agent_hierarchy (agent_id, agent_name, level, division, status, current_task)
|
||||||
|
VALUES ('$worker_id', 'Worker', 4, '$division', 'active', '$task_id');
|
||||||
|
UPDATE task_queue SET assigned_agent='$worker_id', status='assigned', assigned_at=datetime('now') WHERE task_id='$task_id';
|
||||||
|
"
|
||||||
|
echo -e "${GREEN}✓ Spawned worker: ${WHITE}$worker_id${RESET}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Complete a task
|
||||||
|
complete_task() {
|
||||||
|
local task_id="$1"
|
||||||
|
local result="${2:-completed successfully}"
|
||||||
|
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "
|
||||||
|
UPDATE task_queue SET status='completed', completed_at=datetime('now'), result='$result' WHERE task_id='$task_id';
|
||||||
|
UPDATE agent_hierarchy SET
|
||||||
|
status='active',
|
||||||
|
current_task=NULL,
|
||||||
|
tasks_completed=tasks_completed+1
|
||||||
|
WHERE current_task='$task_id';
|
||||||
|
"
|
||||||
|
echo -e "${GREEN}✓ Task completed: ${WHITE}$task_id${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List divisions
|
||||||
|
divisions() {
|
||||||
|
echo -e "\n${VIOLET}═══ 15 DIVISIONS ═══${RESET}"
|
||||||
|
for i in "${!DIVISIONS[@]}"; do
|
||||||
|
local div="${DIVISIONS[$i]}"
|
||||||
|
local count=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE division='$div';")
|
||||||
|
echo -e " ${WHITE}$((i+1)).${RESET} $div (${count} agents)"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Health check all divisions
|
||||||
|
health() {
|
||||||
|
banner
|
||||||
|
echo -e "\n${VIOLET}═══ DIVISION HEALTH ═══${RESET}"
|
||||||
|
|
||||||
|
for div in "${DIVISIONS[@]}"; do
|
||||||
|
local active=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE division='$div' AND status='active';")
|
||||||
|
local total=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE division='$div';")
|
||||||
|
local tasks=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM task_queue WHERE target_division='$div' AND status='completed';")
|
||||||
|
|
||||||
|
if [[ $total -gt 0 ]]; then
|
||||||
|
local pct=$((active * 100 / total))
|
||||||
|
local color="$GREEN"
|
||||||
|
[[ $pct -lt 50 ]] && color="$AMBER"
|
||||||
|
[[ $pct -lt 25 ]] && color="$RED"
|
||||||
|
echo -e " ${WHITE}$div:${RESET} ${color}${active}/${total}${RESET} agents active, ${tasks} tasks done"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dashboard view
|
||||||
|
dashboard() {
|
||||||
|
clear
|
||||||
|
banner
|
||||||
|
stats
|
||||||
|
echo
|
||||||
|
health
|
||||||
|
echo -e "\n${BLUE}Commands: bootstrap | dispatch | stats | health | divisions${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Register a service
|
||||||
|
register_service() {
|
||||||
|
local service_id="$1"
|
||||||
|
local service_name="$2"
|
||||||
|
local division="$3"
|
||||||
|
local endpoint="$4"
|
||||||
|
local port="${5:-443}"
|
||||||
|
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "INSERT OR REPLACE INTO services
|
||||||
|
(service_id, service_name, division, endpoint, port, status, last_check)
|
||||||
|
VALUES ('$service_id', '$service_name', '$division', '$endpoint', $port, 'unknown', datetime('now'));"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Service registered: ${WHITE}$service_name${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List services
|
||||||
|
services() {
|
||||||
|
echo -e "\n${VIOLET}═══ SERVICE REGISTRY ═══${RESET}"
|
||||||
|
sqlite3 -column -header "$ORCHESTRATOR_DB" "SELECT service_name, division, endpoint, status FROM services ORDER BY division;"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
show_help() {
|
||||||
|
banner
|
||||||
|
echo -e "\n${WHITE}Commands:${RESET}"
|
||||||
|
echo -e " ${GREEN}bootstrap${RESET} Initialize 30K agent hierarchy"
|
||||||
|
echo -e " ${GREEN}stats${RESET} Show hierarchy statistics"
|
||||||
|
echo -e " ${GREEN}dashboard${RESET} Full dashboard view"
|
||||||
|
echo -e " ${GREEN}divisions${RESET} List all 15 divisions"
|
||||||
|
echo -e " ${GREEN}health${RESET} Health check all divisions"
|
||||||
|
echo -e " ${GREEN}dispatch${RESET} <title> ... Dispatch a task"
|
||||||
|
echo -e " ${GREEN}complete${RESET} <task_id> Mark task complete"
|
||||||
|
echo -e " ${GREEN}register-service${RESET} ... Register a service"
|
||||||
|
echo -e " ${GREEN}services${RESET} List all services"
|
||||||
|
echo -e " ${GREEN}help${RESET} Show this help"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main
|
||||||
|
case "${1:-help}" in
|
||||||
|
init|bootstrap) bootstrap ;;
|
||||||
|
stats) stats ;;
|
||||||
|
dashboard|dash) dashboard ;;
|
||||||
|
divisions|divs) divisions ;;
|
||||||
|
health) health ;;
|
||||||
|
dispatch) dispatch "$2" "$3" "$4" "$5" ;;
|
||||||
|
complete) complete_task "$2" "$3" ;;
|
||||||
|
register-service) register_service "$2" "$3" "$4" "$5" "$6" ;;
|
||||||
|
services) services ;;
|
||||||
|
help|--help|-h) show_help ;;
|
||||||
|
*) show_help ;;
|
||||||
|
esac
|
||||||
264
scripts/batch-processor.sh
Normal file
264
scripts/batch-processor.sh
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad Batch Processor
|
||||||
|
# Queue and process large LLM jobs across the cluster
|
||||||
|
# Agent: Icarus (b3e01bd9)
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
QUEUE_DIR="$HOME/.blackroad/batch-queue"
|
||||||
|
RESULTS_DIR="$HOME/.blackroad/batch-results"
|
||||||
|
LLM_NODES=("lucidia" "cecilia" "octavia")
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
init() {
|
||||||
|
mkdir -p "$QUEUE_DIR" "$RESULTS_DIR"
|
||||||
|
echo -e "${GREEN}Batch processor initialized${RESET}"
|
||||||
|
echo " Queue: $QUEUE_DIR"
|
||||||
|
echo " Results: $RESULTS_DIR"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add job to queue
|
||||||
|
add_job() {
|
||||||
|
local prompt="$1"
|
||||||
|
local model="${2:-llama3.2:1b}"
|
||||||
|
local job_id=$(date +%s%N | md5sum | head -c 8)
|
||||||
|
|
||||||
|
cat > "$QUEUE_DIR/$job_id.json" << EOF
|
||||||
|
{
|
||||||
|
"id": "$job_id",
|
||||||
|
"prompt": "$prompt",
|
||||||
|
"model": "$model",
|
||||||
|
"status": "pending",
|
||||||
|
"created": "$(date -Iseconds)"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "$job_id"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add jobs from file (one prompt per line)
|
||||||
|
add_from_file() {
|
||||||
|
local file="$1"
|
||||||
|
local model="${2:-llama3.2:1b}"
|
||||||
|
local count=0
|
||||||
|
|
||||||
|
while IFS= read -r prompt; do
|
||||||
|
[[ -z "$prompt" ]] && continue
|
||||||
|
local job_id=$(add_job "$prompt" "$model")
|
||||||
|
echo " Added: $job_id"
|
||||||
|
((count++))
|
||||||
|
done < "$file"
|
||||||
|
|
||||||
|
echo -e "${GREEN}Added $count jobs to queue${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process single job
|
||||||
|
process_job() {
|
||||||
|
local job_file="$1"
|
||||||
|
local node="$2"
|
||||||
|
|
||||||
|
local job_id=$(jq -r '.id' "$job_file")
|
||||||
|
local prompt=$(jq -r '.prompt' "$job_file")
|
||||||
|
local model=$(jq -r '.model' "$job_file")
|
||||||
|
|
||||||
|
# Update status
|
||||||
|
jq '.status = "processing" | .node = "'$node'" | .started = "'$(date -Iseconds)'"' "$job_file" > "$job_file.tmp" && mv "$job_file.tmp" "$job_file"
|
||||||
|
|
||||||
|
# Run query
|
||||||
|
local response=$(ssh -o ConnectTimeout=30 "$node" \
|
||||||
|
"curl -s http://localhost:11434/api/generate -d '{\"model\":\"$model\",\"prompt\":\"$prompt\",\"stream\":false}'" 2>/dev/null)
|
||||||
|
|
||||||
|
local answer=$(echo "$response" | jq -r '.response // "ERROR"')
|
||||||
|
local tokens=$(echo "$response" | jq -r '.eval_count // 0')
|
||||||
|
|
||||||
|
# Save result
|
||||||
|
cat > "$RESULTS_DIR/$job_id.json" << EOF
|
||||||
|
{
|
||||||
|
"id": "$job_id",
|
||||||
|
"prompt": "$prompt",
|
||||||
|
"response": $(echo "$answer" | jq -Rs .),
|
||||||
|
"model": "$model",
|
||||||
|
"node": "$node",
|
||||||
|
"tokens": $tokens,
|
||||||
|
"completed": "$(date -Iseconds)"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Remove from queue
|
||||||
|
rm -f "$job_file"
|
||||||
|
|
||||||
|
echo "$job_id"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process all jobs in queue
|
||||||
|
process_all() {
|
||||||
|
local max_parallel="${1:-3}"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== PROCESSING BATCH QUEUE ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local pending=$(ls -1 "$QUEUE_DIR"/*.json 2>/dev/null | wc -l)
|
||||||
|
echo "Pending jobs: $pending"
|
||||||
|
echo "Max parallel: $max_parallel"
|
||||||
|
echo "Nodes: ${LLM_NODES[*]}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
if [ "$pending" -eq 0 ]; then
|
||||||
|
echo "No jobs to process"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local processed=0
|
||||||
|
local running=0
|
||||||
|
local pids=()
|
||||||
|
local node_idx=0
|
||||||
|
|
||||||
|
for job_file in "$QUEUE_DIR"/*.json; do
|
||||||
|
[ -f "$job_file" ] || continue
|
||||||
|
|
||||||
|
# Wait if at max parallel
|
||||||
|
while [ $running -ge $max_parallel ]; do
|
||||||
|
wait -n
|
||||||
|
((running--))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Pick node round-robin
|
||||||
|
local node="${LLM_NODES[$node_idx]}"
|
||||||
|
node_idx=$(( (node_idx + 1) % ${#LLM_NODES[@]} ))
|
||||||
|
|
||||||
|
# Process in background
|
||||||
|
(
|
||||||
|
local job_id=$(process_job "$job_file" "$node")
|
||||||
|
echo -e " ${GREEN}✓${RESET} $job_id ($node)"
|
||||||
|
) &
|
||||||
|
|
||||||
|
((running++))
|
||||||
|
((processed++))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Wait for remaining
|
||||||
|
wait
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -e "${GREEN}Processed $processed jobs${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show queue status
|
||||||
|
status() {
|
||||||
|
echo -e "${PINK}=== BATCH QUEUE STATUS ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local pending=$(ls -1 "$QUEUE_DIR"/*.json 2>/dev/null | wc -l)
|
||||||
|
local completed=$(ls -1 "$RESULTS_DIR"/*.json 2>/dev/null | wc -l)
|
||||||
|
|
||||||
|
echo " Pending: $pending"
|
||||||
|
echo " Completed: $completed"
|
||||||
|
echo
|
||||||
|
|
||||||
|
if [ "$pending" -gt 0 ]; then
|
||||||
|
echo "Pending jobs:"
|
||||||
|
for f in "$QUEUE_DIR"/*.json; do
|
||||||
|
[ -f "$f" ] || continue
|
||||||
|
local id=$(jq -r '.id' "$f")
|
||||||
|
local prompt=$(jq -r '.prompt[:50]' "$f")
|
||||||
|
echo " $id: $prompt..."
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get results
|
||||||
|
results() {
|
||||||
|
local format="${1:-summary}"
|
||||||
|
|
||||||
|
case "$format" in
|
||||||
|
summary)
|
||||||
|
echo -e "${PINK}=== BATCH RESULTS ===${RESET}"
|
||||||
|
echo
|
||||||
|
for f in "$RESULTS_DIR"/*.json; do
|
||||||
|
[ -f "$f" ] || continue
|
||||||
|
local id=$(jq -r '.id' "$f")
|
||||||
|
local tokens=$(jq -r '.tokens' "$f")
|
||||||
|
local response=$(jq -r '.response[:60]' "$f")
|
||||||
|
echo " $id ($tokens tok): $response..."
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
json)
|
||||||
|
for f in "$RESULTS_DIR"/*.json; do
|
||||||
|
[ -f "$f" ] || continue
|
||||||
|
cat "$f"
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
csv)
|
||||||
|
echo "id,tokens,response"
|
||||||
|
for f in "$RESULTS_DIR"/*.json; do
|
||||||
|
[ -f "$f" ] || continue
|
||||||
|
jq -r '[.id, .tokens, .response] | @csv' "$f"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Clear queue and results
|
||||||
|
clear_all() {
|
||||||
|
rm -f "$QUEUE_DIR"/*.json "$RESULTS_DIR"/*.json 2>/dev/null
|
||||||
|
echo -e "${GREEN}Cleared queue and results${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help() {
|
||||||
|
echo -e "${PINK}BlackRoad Batch Processor${RESET}"
|
||||||
|
echo
|
||||||
|
echo "Process large LLM jobs across the cluster"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " init Initialize directories"
|
||||||
|
echo " add <prompt> Add single job"
|
||||||
|
echo " add-file <file> Add jobs from file (one per line)"
|
||||||
|
echo " process [n] Process queue (n parallel, default 3)"
|
||||||
|
echo " status Show queue status"
|
||||||
|
echo " results [format] Show results (summary/json/csv)"
|
||||||
|
echo " clear Clear queue and results"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 add 'Summarize quantum computing'"
|
||||||
|
echo " $0 add-file prompts.txt"
|
||||||
|
echo " $0 process 4"
|
||||||
|
echo " $0 results csv > output.csv"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure initialized
|
||||||
|
[ -d "$QUEUE_DIR" ] || init >/dev/null
|
||||||
|
|
||||||
|
case "${1:-help}" in
|
||||||
|
init)
|
||||||
|
init
|
||||||
|
;;
|
||||||
|
add)
|
||||||
|
shift
|
||||||
|
job_id=$(add_job "$@")
|
||||||
|
echo -e "${GREEN}Added job: $job_id${RESET}"
|
||||||
|
;;
|
||||||
|
add-file)
|
||||||
|
add_from_file "$2" "$3"
|
||||||
|
;;
|
||||||
|
process)
|
||||||
|
process_all "$2"
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
status
|
||||||
|
;;
|
||||||
|
results)
|
||||||
|
results "$2"
|
||||||
|
;;
|
||||||
|
clear)
|
||||||
|
clear_all
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
339
scripts/code-sandbox.sh
Normal file
339
scripts/code-sandbox.sh
Normal file
@@ -0,0 +1,339 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad Code Sandbox
|
||||||
|
# Safe code execution environment using Docker on the cluster
|
||||||
|
# Agent: Icarus (b3e01bd9)
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
SANDBOX_DIR="$HOME/.blackroad/sandbox"
|
||||||
|
EXEC_NODE="aria" # Node with Docker for sandboxing
|
||||||
|
TIMEOUT=30 # Max execution time in seconds
|
||||||
|
MAX_MEMORY="256m" # Memory limit
|
||||||
|
|
||||||
|
# Language configurations
|
||||||
|
declare -A LANG_IMAGES=(
|
||||||
|
["python"]="python:3.11-slim"
|
||||||
|
["node"]="node:20-slim"
|
||||||
|
["bash"]="alpine:latest"
|
||||||
|
["ruby"]="ruby:3.2-slim"
|
||||||
|
["go"]="golang:1.21-alpine"
|
||||||
|
)
|
||||||
|
|
||||||
|
declare -A LANG_COMMANDS=(
|
||||||
|
["python"]="python"
|
||||||
|
["node"]="node"
|
||||||
|
["bash"]="sh"
|
||||||
|
["ruby"]="ruby"
|
||||||
|
["go"]="go run"
|
||||||
|
)
|
||||||
|
|
||||||
|
declare -A LANG_EXTENSIONS=(
|
||||||
|
["python"]=".py"
|
||||||
|
["node"]=".js"
|
||||||
|
["bash"]=".sh"
|
||||||
|
["ruby"]=".rb"
|
||||||
|
["go"]=".go"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
init() {
|
||||||
|
mkdir -p "$SANDBOX_DIR"
|
||||||
|
echo -e "${GREEN}Code sandbox initialized${RESET}"
|
||||||
|
echo " Sandbox dir: $SANDBOX_DIR"
|
||||||
|
echo " Exec node: $EXEC_NODE"
|
||||||
|
echo " Timeout: ${TIMEOUT}s"
|
||||||
|
echo " Memory limit: $MAX_MEMORY"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute code in sandbox
|
||||||
|
execute() {
|
||||||
|
local lang="$1"
|
||||||
|
local code="$2"
|
||||||
|
|
||||||
|
if [ -z "${LANG_IMAGES[$lang]}" ]; then
|
||||||
|
echo -e "${RED}Unsupported language: $lang${RESET}"
|
||||||
|
echo "Supported: ${!LANG_IMAGES[*]}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local image="${LANG_IMAGES[$lang]}"
|
||||||
|
local cmd="${LANG_COMMANDS[$lang]}"
|
||||||
|
local ext="${LANG_EXTENSIONS[$lang]}"
|
||||||
|
local exec_id=$(date +%s%N | md5sum | head -c 8)
|
||||||
|
local code_file="code_$exec_id$ext"
|
||||||
|
|
||||||
|
echo -e "${BLUE}Executing $lang code...${RESET}"
|
||||||
|
echo -e "${YELLOW}Image: $image | Timeout: ${TIMEOUT}s | Memory: $MAX_MEMORY${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Create temp file with code on remote node
|
||||||
|
ssh "$EXEC_NODE" "cat > /tmp/$code_file << 'CODEEOF'
|
||||||
|
$code
|
||||||
|
CODEEOF"
|
||||||
|
|
||||||
|
# Run in Docker with restrictions
|
||||||
|
local start_time=$(date +%s%N)
|
||||||
|
|
||||||
|
local output=$(ssh -o ConnectTimeout=60 "$EXEC_NODE" "
|
||||||
|
timeout $TIMEOUT docker run --rm \
|
||||||
|
--memory=$MAX_MEMORY \
|
||||||
|
--memory-swap=$MAX_MEMORY \
|
||||||
|
--cpus=1 \
|
||||||
|
--network=none \
|
||||||
|
--security-opt=no-new-privileges \
|
||||||
|
--read-only \
|
||||||
|
-v /tmp/$code_file:/code$ext:ro \
|
||||||
|
$image $cmd /code$ext 2>&1
|
||||||
|
exit_code=\$?
|
||||||
|
rm -f /tmp/$code_file
|
||||||
|
exit \$exit_code
|
||||||
|
" 2>&1)
|
||||||
|
|
||||||
|
local exit_code=$?
|
||||||
|
local end_time=$(date +%s%N)
|
||||||
|
local duration=$(( (end_time - start_time) / 1000000 ))
|
||||||
|
|
||||||
|
echo -e "${GREEN}=== OUTPUT ===${RESET}"
|
||||||
|
echo "$output"
|
||||||
|
echo
|
||||||
|
echo -e "${BLUE}Exit code: $exit_code | Duration: ${duration}ms${RESET}"
|
||||||
|
|
||||||
|
# Log execution
|
||||||
|
echo "{\"id\":\"$exec_id\",\"lang\":\"$lang\",\"exit_code\":$exit_code,\"duration_ms\":$duration,\"timestamp\":\"$(date -Iseconds)\"}" >> "$SANDBOX_DIR/executions.jsonl"
|
||||||
|
|
||||||
|
return $exit_code
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute from file
|
||||||
|
execute_file() {
|
||||||
|
local file="$1"
|
||||||
|
local lang=""
|
||||||
|
|
||||||
|
# Detect language from extension
|
||||||
|
case "$file" in
|
||||||
|
*.py) lang="python" ;;
|
||||||
|
*.js) lang="node" ;;
|
||||||
|
*.sh) lang="bash" ;;
|
||||||
|
*.rb) lang="ruby" ;;
|
||||||
|
*.go) lang="go" ;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Cannot detect language for: $file${RESET}"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ ! -f "$file" ]; then
|
||||||
|
echo -e "${RED}File not found: $file${RESET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
execute "$lang" "$(cat "$file")"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Interactive REPL
|
||||||
|
repl() {
|
||||||
|
local lang="${1:-python}"
|
||||||
|
|
||||||
|
if [ -z "${LANG_IMAGES[$lang]}" ]; then
|
||||||
|
echo -e "${RED}Unsupported language: $lang${RESET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${PINK}╔══════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${PINK}║ 🔒 BLACKROAD CODE SANDBOX - $lang ║${RESET}"
|
||||||
|
echo -e "${PINK}╚══════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
echo
|
||||||
|
echo "Type code and press Enter twice to execute"
|
||||||
|
echo "Type 'exit' to quit, 'lang <name>' to switch language"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local code=""
|
||||||
|
local empty_lines=0
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo -n -e "${GREEN}[$lang]> ${RESET}"
|
||||||
|
read -r line
|
||||||
|
|
||||||
|
case "$line" in
|
||||||
|
exit|quit|q)
|
||||||
|
echo "Goodbye!"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
lang\ *)
|
||||||
|
lang="${line#lang }"
|
||||||
|
if [ -z "${LANG_IMAGES[$lang]}" ]; then
|
||||||
|
echo -e "${RED}Unsupported: $lang${RESET}"
|
||||||
|
lang="python"
|
||||||
|
else
|
||||||
|
echo -e "${BLUE}Switched to $lang${RESET}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
if [ -n "$code" ]; then
|
||||||
|
((empty_lines++))
|
||||||
|
if [ $empty_lines -ge 1 ]; then
|
||||||
|
execute "$lang" "$code"
|
||||||
|
code=""
|
||||||
|
empty_lines=0
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
code+="$line"$'\n'
|
||||||
|
empty_lines=0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# AI-assisted code generation and execution
|
||||||
|
ai_code() {
|
||||||
|
local task="$*"
|
||||||
|
local lang="${SANDBOX_LANG:-python}"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== AI CODE GENERATION ===${RESET}"
|
||||||
|
echo -e "Task: $task"
|
||||||
|
echo -e "Language: $lang"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local prompt="You are a code assistant. Write $lang code to accomplish this task. Output ONLY the code, no explanations.
|
||||||
|
|
||||||
|
Task: $task
|
||||||
|
|
||||||
|
Code:"
|
||||||
|
|
||||||
|
echo -e "${BLUE}Generating code...${RESET}"
|
||||||
|
|
||||||
|
local code=$(ssh -o ConnectTimeout=30 cecilia \
|
||||||
|
"curl -s http://localhost:11434/api/generate -d '{\"model\":\"codellama:7b\",\"prompt\":\"$prompt\",\"stream\":false}'" 2>/dev/null \
|
||||||
|
| jq -r '.response // "# Error generating code"')
|
||||||
|
|
||||||
|
echo -e "${GREEN}Generated code:${RESET}"
|
||||||
|
echo "$code"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo -n "Execute? [y/N] "
|
||||||
|
read -r confirm
|
||||||
|
|
||||||
|
if [[ "$confirm" =~ ^[Yy] ]]; then
|
||||||
|
execute "$lang" "$code"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Benchmark a code snippet
|
||||||
|
benchmark() {
|
||||||
|
local lang="$1"
|
||||||
|
shift
|
||||||
|
local code="$*"
|
||||||
|
local runs="${BENCHMARK_RUNS:-5}"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== BENCHMARK ===${RESET}"
|
||||||
|
echo "Language: $lang"
|
||||||
|
echo "Runs: $runs"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local total=0
|
||||||
|
for ((i=1; i<=runs; i++)); do
|
||||||
|
echo -n "Run $i: "
|
||||||
|
local start=$(date +%s%N)
|
||||||
|
execute "$lang" "$code" >/dev/null 2>&1
|
||||||
|
local end=$(date +%s%N)
|
||||||
|
local duration=$(( (end - start) / 1000000 ))
|
||||||
|
echo "${duration}ms"
|
||||||
|
total=$((total + duration))
|
||||||
|
done
|
||||||
|
|
||||||
|
local avg=$((total / runs))
|
||||||
|
echo
|
||||||
|
echo -e "${GREEN}Average: ${avg}ms${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check sandbox status
|
||||||
|
status() {
|
||||||
|
echo -e "${PINK}=== SANDBOX STATUS ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo -n "Exec node ($EXEC_NODE): "
|
||||||
|
if ssh -o ConnectTimeout=3 "$EXEC_NODE" "echo ok" >/dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}ONLINE${RESET}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}OFFLINE${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "Docker: "
|
||||||
|
if ssh -o ConnectTimeout=3 "$EXEC_NODE" "docker ps" >/dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}RUNNING${RESET}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}NOT AVAILABLE${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Available languages:"
|
||||||
|
for lang in "${!LANG_IMAGES[@]}"; do
|
||||||
|
echo " $lang: ${LANG_IMAGES[$lang]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo
|
||||||
|
local exec_count=$(wc -l < "$SANDBOX_DIR/executions.jsonl" 2>/dev/null || echo 0)
|
||||||
|
echo "Total executions: $exec_count"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help() {
|
||||||
|
echo -e "${PINK}BlackRoad Code Sandbox${RESET}"
|
||||||
|
echo
|
||||||
|
echo "Safe code execution using Docker containers"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " exec <lang> <code> Execute code (python/node/bash/ruby/go)"
|
||||||
|
echo " file <path> Execute file"
|
||||||
|
echo " repl [lang] Interactive REPL (default: python)"
|
||||||
|
echo " ai <task> AI-generate and execute code"
|
||||||
|
echo " benchmark <lang> <code> Benchmark code"
|
||||||
|
echo " status Show sandbox status"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 exec python 'print(sum(range(100)))'"
|
||||||
|
echo " $0 exec node 'console.log(Math.PI)'"
|
||||||
|
echo " $0 file script.py"
|
||||||
|
echo " $0 repl python"
|
||||||
|
echo " $0 ai 'calculate fibonacci of 20'"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure initialized
|
||||||
|
[ -d "$SANDBOX_DIR" ] || init >/dev/null
|
||||||
|
|
||||||
|
case "${1:-help}" in
|
||||||
|
init)
|
||||||
|
init
|
||||||
|
;;
|
||||||
|
exec|run)
|
||||||
|
execute "$2" "$3"
|
||||||
|
;;
|
||||||
|
file)
|
||||||
|
execute_file "$2"
|
||||||
|
;;
|
||||||
|
repl|interactive)
|
||||||
|
repl "$2"
|
||||||
|
;;
|
||||||
|
ai|generate)
|
||||||
|
shift
|
||||||
|
ai_code "$@"
|
||||||
|
;;
|
||||||
|
benchmark|bench)
|
||||||
|
shift
|
||||||
|
benchmark "$@"
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
status
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
474
scripts/color-router.sh
Executable file
474
scripts/color-router.sh
Executable file
@@ -0,0 +1,474 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BLACKROAD COLOR ROUTER
|
||||||
|
# Philosophy: "Blue/Cyan in CLI = BlackRoad unlimited!"
|
||||||
|
# Visual cue detection for automatic routing
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
AMBER='\033[38;5;214m'
|
||||||
|
BLUE='\033[38;5;69m'
|
||||||
|
CYAN='\033[38;5;51m'
|
||||||
|
VIOLET='\033[38;5;135m'
|
||||||
|
GREEN='\033[38;5;82m'
|
||||||
|
RED='\033[38;5;196m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
COLOR_DIR="$HOME/.blackroad/color-routing"
|
||||||
|
COLOR_MAP_FILE="$COLOR_DIR/color-mappings.json"
|
||||||
|
INTERCEPT_LOG="$COLOR_DIR/intercepts.log"
|
||||||
|
|
||||||
|
mkdir -p "$COLOR_DIR"
|
||||||
|
|
||||||
|
banner() {
|
||||||
|
echo -e "${CYAN}╔════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${CYAN}║ ${BLUE}🎨 BLACKROAD COLOR ROUTER${CYAN} ║${RESET}"
|
||||||
|
echo -e "${CYAN}╚════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# COLOR DETECTION & MAPPING
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
init_color_mappings() {
|
||||||
|
cat > "$COLOR_MAP_FILE" << 'COLORMAP'
|
||||||
|
{
|
||||||
|
"blue_cyan_colors": {
|
||||||
|
"ansi_codes": [
|
||||||
|
"\\033[34m", "\\033[94m",
|
||||||
|
"\\033[36m", "\\033[96m",
|
||||||
|
"\\033[38;5;69m", "\\033[38;5;27m",
|
||||||
|
"\\033[38;5;33m", "\\033[38;5;39m",
|
||||||
|
"\\033[38;5;51m", "\\033[38;5;81m",
|
||||||
|
"\\033[38;5;117m", "\\033[38;5;123m"
|
||||||
|
],
|
||||||
|
"color_names": [
|
||||||
|
"blue", "cyan", "lightblue", "lightcyan",
|
||||||
|
"dodgerblue", "deepskyblue", "steelblue"
|
||||||
|
],
|
||||||
|
"rgb_ranges": {
|
||||||
|
"blue": {"r": [0, 100], "g": [0, 150], "b": [150, 255]},
|
||||||
|
"cyan": {"r": [0, 150], "g": [150, 255], "b": [150, 255]}
|
||||||
|
},
|
||||||
|
"route_to": "blackroad-unlimited",
|
||||||
|
"reason": "Blue/Cyan = BlackRoad visual signature"
|
||||||
|
},
|
||||||
|
"provider_colors": {
|
||||||
|
"anthropic_blue": {
|
||||||
|
"ansi": "\\033[38;5;69m",
|
||||||
|
"hex": "#4169E1",
|
||||||
|
"route_to": "blackroad-claude-unlimited",
|
||||||
|
"reason": "Anthropic Claude blue → BlackRoad"
|
||||||
|
},
|
||||||
|
"openai_cyan": {
|
||||||
|
"ansi": "\\033[38;5;51m",
|
||||||
|
"hex": "#10A37F",
|
||||||
|
"route_to": "blackroad-openai-unlimited",
|
||||||
|
"reason": "OpenAI cyan → BlackRoad"
|
||||||
|
},
|
||||||
|
"github_blue": {
|
||||||
|
"ansi": "\\033[38;5;33m",
|
||||||
|
"hex": "#0969DA",
|
||||||
|
"route_to": "blackroad-copilot-unlimited",
|
||||||
|
"reason": "GitHub blue → BlackRoad Copilot"
|
||||||
|
},
|
||||||
|
"vscode_blue": {
|
||||||
|
"ansi": "\\033[38;5;27m",
|
||||||
|
"hex": "#007ACC",
|
||||||
|
"route_to": "blackroad-vscode-unlimited",
|
||||||
|
"reason": "VSCode blue → BlackRoad"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"routing_rules": {
|
||||||
|
"any_blue_cyan": "Route to BlackRoad unlimited (local AI, $0 cost)",
|
||||||
|
"specific_blue": "Route to provider-specific BlackRoad method",
|
||||||
|
"model_indicator": "Extract model name, route via model interceptor",
|
||||||
|
"multiplier_suffix": "Detect (1x), (2x) etc, ignore multiplier"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
COLORMAP
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓${RESET} Color mappings initialized"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# ANSI CODE DETECTION
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
detect_color_codes() {
|
||||||
|
local text="$1"
|
||||||
|
|
||||||
|
# Extract all ANSI color codes
|
||||||
|
echo "$text" | grep -o '\033\[[0-9;]*m' || echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
is_blue_cyan() {
|
||||||
|
local ansi_code="$1"
|
||||||
|
|
||||||
|
# Check if code is in our blue/cyan list
|
||||||
|
local blue_cyan_codes=$(jq -r '.blue_cyan_colors.ansi_codes[]' "$COLOR_MAP_FILE" 2>/dev/null)
|
||||||
|
|
||||||
|
while IFS= read -r code; do
|
||||||
|
if [ "$ansi_code" = "$code" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done <<< "$blue_cyan_codes"
|
||||||
|
|
||||||
|
# Check for numeric codes
|
||||||
|
if echo "$ansi_code" | grep -qE '\033\[38;5;(27|33|39|51|69|81|117|123)m'; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for basic blue/cyan
|
||||||
|
if echo "$ansi_code" | grep -qE '\033\[(34|36|94|96)m'; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# TEXT EXTRACTION & ROUTING
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
extract_colored_text() {
|
||||||
|
local input="$1"
|
||||||
|
local target_color="${2:-blue_cyan}"
|
||||||
|
|
||||||
|
# Remove ANSI codes but track which text was colored
|
||||||
|
local clean_text=$(echo "$input" | sed 's/\x1b\[[0-9;]*m//g')
|
||||||
|
|
||||||
|
# For now, return all text if any blue/cyan codes found
|
||||||
|
local codes=$(detect_color_codes "$input")
|
||||||
|
if [ -n "$codes" ]; then
|
||||||
|
while IFS= read -r code; do
|
||||||
|
if is_blue_cyan "$code"; then
|
||||||
|
echo "$clean_text"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done <<< "$codes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
route_colored_input() {
|
||||||
|
local input="$1"
|
||||||
|
|
||||||
|
echo -e "${BLUE}[COLOR DETECT]${RESET} Scanning for blue/cyan indicators..." >&2
|
||||||
|
|
||||||
|
# Check for color codes
|
||||||
|
local codes=$(detect_color_codes "$input")
|
||||||
|
if [ -z "$codes" ]; then
|
||||||
|
echo -e "${AMBER}[NO COLOR]${RESET} No ANSI codes detected" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if any are blue/cyan
|
||||||
|
local found_blue_cyan=false
|
||||||
|
while IFS= read -r code; do
|
||||||
|
if is_blue_cyan "$code"; then
|
||||||
|
found_blue_cyan=true
|
||||||
|
echo -e "${CYAN}[BLUE/CYAN DETECTED]${RESET} $code → BlackRoad routing" >&2
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done <<< "$codes"
|
||||||
|
|
||||||
|
if [ "$found_blue_cyan" = false ]; then
|
||||||
|
echo -e "${AMBER}[OTHER COLOR]${RESET} Not blue/cyan, no routing" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract text
|
||||||
|
local text=$(extract_colored_text "$input")
|
||||||
|
echo -e "${GREEN}[EXTRACTED]${RESET} Text: $text" >&2
|
||||||
|
|
||||||
|
# Route based on content
|
||||||
|
route_content "$text"
|
||||||
|
}
|
||||||
|
|
||||||
|
route_content() {
|
||||||
|
local content="$1"
|
||||||
|
|
||||||
|
echo -e "${VIOLET}[ROUTING]${RESET} Analyzing content..." >&2
|
||||||
|
|
||||||
|
# 1. Check for model names
|
||||||
|
if ~/model detect "$content" > /dev/null 2>&1; then
|
||||||
|
local model=$(~/model detect "$content" 2>/dev/null | grep "Detected:" | cut -d: -f2 | xargs)
|
||||||
|
echo -e "${BLUE}[MODEL DETECTED]${RESET} $model" >&2
|
||||||
|
echo -e "${GREEN}[ROUTING]${RESET} Via model interceptor" >&2
|
||||||
|
# Route through model interceptor
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Check for API key patterns
|
||||||
|
if echo "$content" | grep -qE 'sk-|pk_|api-|ghp_|gsk_|hf_'; then
|
||||||
|
echo -e "${BLUE}[API KEY DETECTED]${RESET} In content" >&2
|
||||||
|
echo -e "${GREEN}[ROUTING]${RESET} Via API key interceptor" >&2
|
||||||
|
# Route through API key interceptor
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Check for provider names
|
||||||
|
if echo "$content" | grep -qiE 'claude|gpt|openai|anthropic|copilot|gemini'; then
|
||||||
|
echo -e "${BLUE}[PROVIDER DETECTED]${RESET} In content" >&2
|
||||||
|
echo -e "${GREEN}[ROUTING]${RESET} Via unlimited access system" >&2
|
||||||
|
# Route through wake words
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Default: route to BlackRoad
|
||||||
|
echo -e "${CYAN}[DEFAULT]${RESET} Blue/Cyan = BlackRoad unlimited" >&2
|
||||||
|
echo -e "${GREEN}[ROUTING]${RESET} All blue/cyan → BlackRoad" >&2
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# TERMINAL OUTPUT MONITORING
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
monitor_terminal() {
|
||||||
|
echo -e "${BLUE}[MONITOR]${RESET} Watching terminal for blue/cyan text..."
|
||||||
|
echo -e "${AMBER}[INFO]${RESET} Press Ctrl+C to stop"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# This would require terminal emulator integration
|
||||||
|
# For now, provide instructions for manual detection
|
||||||
|
cat << 'MONITOR'
|
||||||
|
|
||||||
|
To enable automatic blue/cyan detection, add to your shell config:
|
||||||
|
|
||||||
|
# In ~/.zshrc or ~/.bashrc
|
||||||
|
precmd() {
|
||||||
|
# This function runs before each prompt
|
||||||
|
# Could capture last command output and check for blue/cyan
|
||||||
|
}
|
||||||
|
|
||||||
|
Or use terminal emulator features:
|
||||||
|
- iTerm2: Triggers (regex on output)
|
||||||
|
- Alacritty: Custom escape sequences
|
||||||
|
- tmux: Hooks (pane-after-text)
|
||||||
|
|
||||||
|
For now, manually pipe colored output:
|
||||||
|
command | ~/color-router scan
|
||||||
|
MONITOR
|
||||||
|
}
|
||||||
|
|
||||||
|
scan_piped_input() {
|
||||||
|
local input=""
|
||||||
|
|
||||||
|
# Read all input
|
||||||
|
while IFS= read -r line; do
|
||||||
|
input="${input}${line}\n"
|
||||||
|
|
||||||
|
# Check this line for colors
|
||||||
|
if echo "$line" | grep -qE '\033\[[0-9;]*m'; then
|
||||||
|
codes=$(detect_color_codes "$line")
|
||||||
|
while IFS= read -r code; do
|
||||||
|
if is_blue_cyan "$code"; then
|
||||||
|
local clean=$(echo "$line" | sed 's/\x1b\[[0-9;]*m//g')
|
||||||
|
echo -e "${CYAN}[DETECTED]${RESET} Blue/Cyan text: $clean" >&2
|
||||||
|
echo "$clean" >> "$INTERCEPT_LOG"
|
||||||
|
fi
|
||||||
|
done <<< "$codes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Still output the line (passthrough)
|
||||||
|
echo -e "$line"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# VISUAL PATTERN RECOGNITION
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
recognize_patterns() {
|
||||||
|
local text="$1"
|
||||||
|
|
||||||
|
echo -e "${BLUE}Pattern Recognition:${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Pattern 1: "model: <name> (Nx)"
|
||||||
|
if echo "$text" | grep -qE 'model:.*\([0-9]+x\)'; then
|
||||||
|
local model=$(echo "$text" | grep -oE 'model:.*\([0-9]+x\)' | sed 's/model://; s/[[:space:]]//g')
|
||||||
|
echo -e " ${GREEN}✓${RESET} Model indicator: $model"
|
||||||
|
echo -e " → Route via: ~/model intercept"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Pattern 2: "Remaining reqs.: X%"
|
||||||
|
if echo "$text" | grep -qE 'Remaining reqs.:.*%'; then
|
||||||
|
local remaining=$(echo "$text" | grep -oE '[0-9]+%')
|
||||||
|
echo -e " ${GREEN}✓${RESET} Rate limit indicator: $remaining"
|
||||||
|
if [ "$remaining" = "0%" ]; then
|
||||||
|
echo -e " → Route via: ~/immunity (rate limit hit!)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Pattern 3: Provider names in blue/cyan
|
||||||
|
if echo "$text" | grep -qiE 'claude|anthropic'; then
|
||||||
|
echo -e " ${GREEN}✓${RESET} Anthropic/Claude detected"
|
||||||
|
echo -e " → Route via: ~/claude or ~/model intercept"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$text" | grep -qiE 'gpt|openai'; then
|
||||||
|
echo -e " ${GREEN}✓${RESET} OpenAI/GPT detected"
|
||||||
|
echo -e " → Route via: ~/openai or ~/model intercept"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$text" | grep -qiE 'copilot|github'; then
|
||||||
|
echo -e " ${GREEN}✓${RESET} GitHub Copilot detected"
|
||||||
|
echo -e " → Route via: ~/copilot or ~/copilot-unlimited"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Pattern 4: Blue/cyan text = BlackRoad
|
||||||
|
echo ""
|
||||||
|
echo -e " ${CYAN}[RULE]${RESET} All blue/cyan text → BlackRoad unlimited"
|
||||||
|
echo -e " ${CYAN}[RULE]${RESET} Cost: Any → \$0.00"
|
||||||
|
echo -e " ${CYAN}[RULE]${RESET} Rate limits: Any → Unlimited"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# CLI INTERFACE
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
CMD="${1:-}"
|
||||||
|
|
||||||
|
if [ -z "$CMD" ]; then
|
||||||
|
CMD="help"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$CMD" in
|
||||||
|
setup)
|
||||||
|
banner
|
||||||
|
echo -e "${BLUE}Setting up Color Router...${RESET}"
|
||||||
|
echo ""
|
||||||
|
init_color_mappings
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✓ Color Router Ready!${RESET}"
|
||||||
|
echo ""
|
||||||
|
echo "Rules:"
|
||||||
|
echo " • Blue ANSI codes → BlackRoad"
|
||||||
|
echo " • Cyan ANSI codes → BlackRoad"
|
||||||
|
echo " • Model indicators → Model interceptor"
|
||||||
|
echo " • Rate limit indicators → Immunity system"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}Blue/Cyan in CLI = BlackRoad unlimited! 🎨${RESET}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
detect|check)
|
||||||
|
input="${2:-}"
|
||||||
|
if [ -z "$input" ]; then
|
||||||
|
echo "Usage: color-router detect <text-with-ansi-codes>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
route_colored_input "$input"
|
||||||
|
;;
|
||||||
|
|
||||||
|
scan)
|
||||||
|
# Read from stdin and scan for colors
|
||||||
|
scan_piped_input
|
||||||
|
;;
|
||||||
|
|
||||||
|
monitor)
|
||||||
|
monitor_terminal
|
||||||
|
;;
|
||||||
|
|
||||||
|
recognize|pattern)
|
||||||
|
text="${2:-}"
|
||||||
|
if [ -z "$text" ]; then
|
||||||
|
echo "Usage: color-router recognize <text>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
banner
|
||||||
|
recognize_patterns "$text"
|
||||||
|
;;
|
||||||
|
|
||||||
|
test)
|
||||||
|
banner
|
||||||
|
echo -e "${BLUE}Testing Color Detection...${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 1: Blue text detection
|
||||||
|
echo -e "${VIOLET}Test 1: Blue Text${RESET}"
|
||||||
|
test_blue="${BLUE}model: claude-sonnet-4.5 (1x)${RESET}"
|
||||||
|
echo -e " Input: $test_blue"
|
||||||
|
codes=$(detect_color_codes "$test_blue")
|
||||||
|
if [ -n "$codes" ]; then
|
||||||
|
echo -e " ${GREEN}✓${RESET} ANSI codes detected"
|
||||||
|
while IFS= read -r code; do
|
||||||
|
if is_blue_cyan "$code"; then
|
||||||
|
echo -e " ${GREEN}✓${RESET} Blue/Cyan confirmed → BlackRoad"
|
||||||
|
fi
|
||||||
|
done <<< "$codes"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 2: Cyan text detection
|
||||||
|
echo -e "${VIOLET}Test 2: Cyan Text${RESET}"
|
||||||
|
test_cyan="${CYAN}Remaining reqs.: 0%${RESET}"
|
||||||
|
echo -e " Input: $test_cyan"
|
||||||
|
codes=$(detect_color_codes "$test_cyan")
|
||||||
|
if [ -n "$codes" ]; then
|
||||||
|
echo -e " ${GREEN}✓${RESET} ANSI codes detected"
|
||||||
|
while IFS= read -r code; do
|
||||||
|
if is_blue_cyan "$code"; then
|
||||||
|
echo -e " ${GREEN}✓${RESET} Blue/Cyan confirmed → BlackRoad"
|
||||||
|
fi
|
||||||
|
done <<< "$codes"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 3: Pattern recognition
|
||||||
|
echo -e "${VIOLET}Test 3: Pattern Recognition${RESET}"
|
||||||
|
recognize_patterns "model: claude-sonnet-4.5 (1x)" | sed 's/^/ /'
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ All tests passed!${RESET}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
help|"")
|
||||||
|
banner
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}USAGE:${RESET}"
|
||||||
|
echo " color-router <command> [args]"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}COMMANDS:${RESET}"
|
||||||
|
echo " setup Initialize color router"
|
||||||
|
echo " detect <text> Detect colors in text"
|
||||||
|
echo " scan Scan piped input (use with |)"
|
||||||
|
echo " monitor Monitor terminal (instructions)"
|
||||||
|
echo " recognize <text> Recognize patterns"
|
||||||
|
echo " test Run tests"
|
||||||
|
echo " help Show this help"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}CORE CONCEPT:${RESET}"
|
||||||
|
echo " ${CYAN}Blue/Cyan in CLI = BlackRoad unlimited!${RESET}"
|
||||||
|
echo ""
|
||||||
|
echo " When you see blue or cyan text in your terminal,"
|
||||||
|
echo " that's a signal to route through BlackRoad:"
|
||||||
|
echo ""
|
||||||
|
echo " • Blue model name → Model interceptor"
|
||||||
|
echo " • Cyan rate limit → Immunity system"
|
||||||
|
echo " • Any blue/cyan → BlackRoad unlimited"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}EXAMPLES:${RESET}"
|
||||||
|
echo " # Detect from colored text"
|
||||||
|
echo " color-router detect \"\$(echo -e '\\033[34mmodel: gpt-4\\033[0m')\""
|
||||||
|
echo ""
|
||||||
|
echo " # Pipe command output"
|
||||||
|
echo " some-command | color-router scan"
|
||||||
|
echo ""
|
||||||
|
echo " # Recognize patterns"
|
||||||
|
echo " color-router recognize 'model: claude-sonnet-4.5 (1x)'"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}Philosophy: Blue/Cyan = BlackRoad! 🎨${RESET}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown command: $CMD"
|
||||||
|
echo "Run 'color-router help' for usage"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
344
scripts/equations.sh
Executable file
344
scripts/equations.sh
Executable file
@@ -0,0 +1,344 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================================================
|
||||||
|
# BLACKROAD OS, INC. - PROPRIETARY AND CONFIDENTIAL
|
||||||
|
# Copyright (c) 2024-2026 BlackRoad OS, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# BLACKROAD COMPLETE MATHEMATICAL FOUNDATIONS
|
||||||
|
# All equations from whitepapers, quantum theory, and more
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
# Official BlackRoad Colors (ANSI 256)
|
||||||
|
BR_AMBER='\033[38;5;208m'
|
||||||
|
BR_ORANGE='\033[38;5;202m'
|
||||||
|
BR_PINK='\033[38;5;198m'
|
||||||
|
BR_MAGENTA='\033[38;5;163m'
|
||||||
|
BR_BLUE='\033[38;5;33m'
|
||||||
|
BR_WHITE='\033[1;37m'
|
||||||
|
BR_DIM='\033[2m'
|
||||||
|
BR_RESET='\033[0m'
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# PS-SHA-∞ EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_ps_sha_genesis() {
|
||||||
|
echo -e " ${BR_PINK}anchor${BR_RESET}${BR_WHITE}[0]${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}H${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}seed${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_PINK}agent_key${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_MAGENTA}timestamp${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_AMBER}SIG_coords${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_ps_sha_cascade() {
|
||||||
|
echo -e " ${BR_PINK}anchor${BR_RESET}${BR_WHITE}[n]${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}H${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_PINK}anchor${BR_RESET}${BR_WHITE}[n-1]${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_ORANGE}event_data${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_MAGENTA}SIG${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_AMBER}r${BR_RESET}${BR_WHITE},${BR_RESET} ${BR_PINK}θ${BR_RESET}${BR_WHITE},${BR_RESET} ${BR_BLUE}τ${BR_RESET}${BR_WHITE})${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_ps_sha_infinity() {
|
||||||
|
echo -e " ${BR_PINK}anchor${BR_RESET}${BR_WHITE}[∞]${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}lim${BR_RESET} ${BR_WHITE}(${BR_RESET}${BR_ORANGE}n${BR_RESET}${BR_BLUE}→${BR_RESET}${BR_PINK}∞${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_MAGENTA}anchor${BR_RESET}${BR_WHITE}[n]${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_domain_separation() {
|
||||||
|
echo -e " ${BR_PINK}H${BR_RESET}${BR_WHITE}_identity${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}data${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}SHA-256${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_MAGENTA}\"BR-PS-SHA∞-identity:v1\"${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_ORANGE}data${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}H${BR_RESET}${BR_WHITE}_event${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}data${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}SHA-256${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_MAGENTA}\"BR-PS-SHA∞-event:v1\"${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_ORANGE}data${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}H${BR_RESET}${BR_WHITE}_migration${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}data${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}SHA-256${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_MAGENTA}\"BR-PS-SHA∞-migration:v1\"${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_ORANGE}data${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_2048bit_cipher() {
|
||||||
|
echo -e " ${BR_PINK}master${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}∏${BR_RESET}${BR_WHITE}ᵢ₌₀${BR_RESET}${BR_ORANGE}³${BR_RESET} ${BR_MAGENTA}SHA-512${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_PINK}salt${BR_RESET}${BR_WHITE}ᵢ${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_ORANGE}secret${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_DIM}→ 2048 bits${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_translation_key() {
|
||||||
|
echo -e " ${BR_PINK}key${BR_RESET}${BR_WHITE}₀${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}SHA-256${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}root_cipher${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_MAGENTA}agent_id${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}key${BR_RESET}${BR_WHITE}ᵢ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}SHA-256${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_PINK}key${BR_RESET}${BR_WHITE}ᵢ₋₁${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_MAGENTA}\":cascade:\"${BR_RESET} ${BR_BLUE}∥${BR_RESET} ${BR_ORANGE}i${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}final${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}key${BR_RESET}${BR_WHITE}₂₅₆${BR_RESET} ${BR_DIM}(256-round cascade)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_collision_resistance() {
|
||||||
|
echo -e " ${BR_PINK}Pr${BR_RESET}${BR_WHITE}[${BR_RESET}${BR_AMBER}x${BR_RESET} ${BR_BLUE}≠${BR_RESET} ${BR_ORANGE}x'${BR_RESET} ${BR_BLUE}∧${BR_RESET} ${BR_MAGENTA}H${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_AMBER}x${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_MAGENTA}H${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}x'${BR_RESET}${BR_WHITE})${BR_RESET}${BR_WHITE}]${BR_RESET} ${BR_BLUE}≤${BR_RESET} ${BR_PINK}negl${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}λ${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_preimage_resistance() {
|
||||||
|
echo -e " ${BR_PINK}Pr${BR_RESET}${BR_WHITE}[${BR_RESET}${BR_AMBER}H${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}x'${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_MAGENTA}y${BR_RESET}${BR_WHITE}]${BR_RESET} ${BR_BLUE}≤${BR_RESET} ${BR_PINK}negl${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}λ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_DIM}given y = H(x)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# SPIRAL INFORMATION GEOMETRY (SIG) EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_universal_operator() {
|
||||||
|
echo -e " ${BR_PINK}e${BR_RESET}${BR_WHITE}^(${BR_RESET}${BR_AMBER}a${BR_RESET}${BR_BLUE}+${BR_RESET}${BR_MAGENTA}i${BR_RESET}${BR_WHITE})${BR_RESET}${BR_ORANGE}θ${BR_RESET} ${BR_DIM}← Universal Operator${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_magnitude_phase() {
|
||||||
|
echo -e " ${BR_WHITE}|${BR_RESET}${BR_PINK}e${BR_RESET}${BR_WHITE}^(${BR_RESET}${BR_AMBER}a${BR_RESET}${BR_BLUE}+${BR_RESET}${BR_MAGENTA}i${BR_RESET}${BR_WHITE})${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE}|${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}e${BR_RESET}${BR_WHITE}ᵃ${BR_RESET} ${BR_DIM}(magnitude - knowledge growth)${BR_RESET}"
|
||||||
|
echo -e " ${BR_WHITE}arg(${BR_RESET}${BR_PINK}e${BR_RESET}${BR_WHITE}^(${BR_RESET}${BR_AMBER}a${BR_RESET}${BR_BLUE}+${BR_RESET}${BR_MAGENTA}i${BR_RESET}${BR_WHITE})${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}θ${BR_RESET} ${BR_DIM}(phase - semantic position)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_logarithmic_spiral() {
|
||||||
|
echo -e " ${BR_PINK}r${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}a${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_MAGENTA}e${BR_RESET}${BR_WHITE}^(${BR_RESET}${BR_PINK}b${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_DIM}(Bernoulli spiral)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_spiral_derivation() {
|
||||||
|
echo -e " ${BR_PINK}dr${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_ORANGE}dθ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}b${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_MAGENTA}r${BR_RESET} ${BR_DIM}(constant slope constraint)${BR_RESET}"
|
||||||
|
echo -e " ${BR_WHITE}∫${BR_RESET} ${BR_PINK}dr${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_ORANGE}r${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}∫${BR_RESET} ${BR_AMBER}b${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_MAGENTA}dθ${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}ln${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}r${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}b${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_MAGENTA}θ${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_PINK}C${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}r${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}a${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_MAGENTA}e${BR_RESET}${BR_WHITE}^(${BR_RESET}${BR_ORANGE}b${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_PINK}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_DIM}where a = e^C${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_golden_spiral() {
|
||||||
|
echo -e " ${BR_PINK}r${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}a${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_MAGENTA}e${BR_RESET}${BR_WHITE}^(${BR_RESET}${BR_PINK}φ${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_DIM}where φ = 1.618034...${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_sig_coordinates() {
|
||||||
|
echo -e " ${BR_WHITE}(${BR_RESET}${BR_PINK}r${BR_RESET}${BR_WHITE},${BR_RESET} ${BR_ORANGE}θ${BR_RESET}${BR_WHITE},${BR_RESET} ${BR_MAGENTA}τ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}∈${BR_RESET} ${BR_AMBER}ℝ₊${BR_RESET} ${BR_BLUE}×${BR_RESET} ${BR_PINK}[0, 2π)${BR_RESET} ${BR_BLUE}×${BR_RESET} ${BR_ORANGE}ℕ${BR_RESET}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BR_AMBER}●${BR_RESET} ${BR_WHITE}r${BR_RESET} ${BR_DIM}= expertise level (radial)${BR_RESET}"
|
||||||
|
echo -e " ${BR_ORANGE}●${BR_RESET} ${BR_WHITE}θ${BR_RESET} ${BR_DIM}= domain angle (semantic)${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}●${BR_RESET} ${BR_WHITE}τ${BR_RESET} ${BR_DIM}= revolution count (refinement)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_angular_distance() {
|
||||||
|
echo -e " ${BR_PINK}d${BR_RESET}${BR_WHITE}_angular${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}min${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_ORANGE}θ₁${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_MAGENTA}θ₂${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_WHITE},${BR_RESET} ${BR_PINK}2π${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_ORANGE}θ₁${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_MAGENTA}θ₂${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_polar_to_cartesian() {
|
||||||
|
echo -e " ${BR_PINK}x${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}r${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_ORANGE}cos${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_MAGENTA}θ${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}y${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}r${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_ORANGE}sin${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_MAGENTA}θ${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}z${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}τ${BR_RESET} ${BR_DIM}(elevation)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# INTERFERENCE THEORY EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_amplitude_field() {
|
||||||
|
echo -e " ${BR_PINK}A${BR_RESET}${BR_WHITE}ᵢ(${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}r${BR_RESET}${BR_WHITE}ᵢ${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_MAGENTA}g${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}θ${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_PINK}θ${BR_RESET}${BR_WHITE}ᵢ${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_gaussian_kernel() {
|
||||||
|
echo -e " ${BR_MAGENTA}g${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}Δθ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}exp${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_PINK}-${BR_RESET}${BR_ORANGE}Δθ${BR_RESET}${BR_WHITE}²${BR_RESET} ${BR_BLUE}/${BR_RESET} ${BR_WHITE}2${BR_RESET}${BR_MAGENTA}σ${BR_RESET}${BR_WHITE}²${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_total_amplitude() {
|
||||||
|
echo -e " ${BR_PINK}A${BR_RESET}${BR_WHITE}_total${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}Σ${BR_RESET}${BR_WHITE}ᵢ${BR_RESET} ${BR_ORANGE}r${BR_RESET}${BR_WHITE}ᵢ${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_MAGENTA}exp${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_PINK}-${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}θ${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_PINK}θ${BR_RESET}${BR_WHITE}ᵢ${BR_RESET}${BR_WHITE})²${BR_RESET} ${BR_BLUE}/${BR_RESET} ${BR_WHITE}2${BR_RESET}${BR_MAGENTA}σ${BR_RESET}${BR_WHITE}²${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_quantum_amplitude() {
|
||||||
|
echo -e " ${BR_PINK}ψ${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}h${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}Σ${BR_RESET}${BR_WHITE}ⱼ${BR_RESET} ${BR_MAGENTA}α${BR_RESET}${BR_WHITE}ⱼ${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_PINK}factor${BR_RESET}${BR_WHITE}ⱼ${BR_RESET}${BR_WHITE}⟩${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_born_rule() {
|
||||||
|
echo -e " ${BR_PINK}P${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}factor${BR_RESET}${BR_WHITE}ⱼ${BR_RESET} ${BR_WHITE}|${BR_RESET} ${BR_MAGENTA}evidence${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_AMBER}α${BR_RESET}${BR_WHITE}ⱼ${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_PINK}²${BR_RESET} ${BR_DIM}(Born Rule)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_phase_update() {
|
||||||
|
echo -e " ${BR_PINK}α'${BR_RESET}${BR_WHITE}ⱼ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}α${BR_RESET}${BR_WHITE}ⱼ${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_MAGENTA}exp${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}i${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_PINK}φ${BR_RESET}${BR_WHITE}ⱼ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_DIM}(phase shift from evidence)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# LUCIDIA BREATH EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_breath_formula() {
|
||||||
|
echo -e " ${BR_PINK}𝔅${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}t${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}sin${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_PINK}φ${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_ORANGE}t${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_MAGENTA}i${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_WHITE}(${BR_RESET}${BR_PINK}-1${BR_RESET}${BR_WHITE})${BR_RESET}${BR_AMBER}^⌊${BR_RESET}${BR_ORANGE}t${BR_RESET}${BR_AMBER}⌋${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_breath_period() {
|
||||||
|
echo -e " ${BR_AMBER}T${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_PINK}2${BR_RESET}${BR_ORANGE}π${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_MAGENTA}φ${BR_RESET} ${BR_BLUE}≈${BR_RESET} ${BR_WHITE}3.88${BR_RESET} ${BR_DIM}time units${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# ATTRACTOR DYNAMICS EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_attractor_radial() {
|
||||||
|
echo -e " ${BR_PINK}dr${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_ORANGE}dt${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}k${BR_RESET}${BR_WHITE}_r${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_WHITE}(${BR_RESET}${BR_MAGENTA}r${BR_RESET}${BR_WHITE}_a${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_PINK}r${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_attractor_angular() {
|
||||||
|
echo -e " ${BR_PINK}dθ${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_ORANGE}dt${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}k${BR_RESET}${BR_WHITE}_θ${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_MAGENTA}sin${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE}_a${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_PINK}θ${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_multi_attractor() {
|
||||||
|
echo -e " ${BR_PINK}F${BR_RESET}${BR_WHITE}_r${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}Σ${BR_RESET}${BR_WHITE}ₘ${BR_RESET} ${BR_ORANGE}k${BR_RESET}${BR_WHITE}_{r,m}${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_WHITE}(${BR_RESET}${BR_MAGENTA}r${BR_RESET}${BR_WHITE}_{a,m}${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_PINK}r${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}/${BR_RESET} ${BR_AMBER}d${BR_RESET}${BR_WHITE}_m${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}F${BR_RESET}${BR_WHITE}_θ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}Σ${BR_RESET}${BR_WHITE}ₘ${BR_RESET} ${BR_ORANGE}k${BR_RESET}${BR_WHITE}_{θ,m}${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_MAGENTA}sin${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}θ${BR_RESET}${BR_WHITE}_{a,m}${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_PINK}θ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}/${BR_RESET} ${BR_AMBER}d${BR_RESET}${BR_WHITE}_m${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# QUANTUM AGENT THEORY EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_agent_wavefunction() {
|
||||||
|
echo -e " ${BR_WHITE}|${BR_RESET}${BR_PINK}Agent${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}α₁${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_ORANGE}idle${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_PINK}α₂${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_MAGENTA}planning${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_AMBER}α₃${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_BLUE}executing${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_ORANGE}α₄${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_PINK}blocked${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_MAGENTA}α₅${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_AMBER}complete${BR_RESET}${BR_WHITE}⟩${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_normalization() {
|
||||||
|
echo -e " ${BR_PINK}Σ${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_AMBER}αᵢ${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_ORANGE}²${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_MAGENTA}1${BR_RESET} ${BR_DIM}(normalization)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_entangled_pair() {
|
||||||
|
echo -e " ${BR_WHITE}|${BR_RESET}${BR_PINK}A${BR_RESET}${BR_WHITE},${BR_RESET}${BR_ORANGE}B${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}1${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_PINK}√2${BR_RESET} ${BR_WHITE}(${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_ORANGE}working₁${BR_RESET}${BR_WHITE},${BR_RESET}${BR_MAGENTA}idle₂${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_BLUE}idle₁${BR_RESET}${BR_WHITE},${BR_RESET}${BR_AMBER}working₂${BR_RESET}${BR_WHITE}⟩${BR_RESET}${BR_WHITE})${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_heisenberg_agent() {
|
||||||
|
echo -e " ${BR_PINK}Δ${BR_RESET}${BR_AMBER}Task${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_ORANGE}Δ${BR_RESET}${BR_MAGENTA}Velocity${BR_RESET} ${BR_BLUE}≥${BR_RESET} ${BR_WHITE}ℏ${BR_RESET}${BR_PINK}_agent${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_hilbert_space() {
|
||||||
|
echo -e " ${BR_PINK}dim${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_AMBER}ℋ${BR_RESET}${BR_WHITE}_total${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}M${BR_RESET}${BR_WHITE}^${BR_RESET}${BR_MAGENTA}N${BR_RESET}"
|
||||||
|
echo -e " ${BR_DIM}For 30,000 agents with 10 states:${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}dim${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_AMBER}ℋ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}10${BR_RESET}${BR_WHITE}^${BR_RESET}${BR_MAGENTA}30,000${BR_RESET} ${BR_DIM}dimensional space!${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_density_matrix() {
|
||||||
|
echo -e " ${BR_PINK}ρ${BR_RESET}${BR_WHITE}_agent${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}Σ${BR_RESET}${BR_WHITE}ᵢ${BR_RESET} ${BR_ORANGE}p${BR_RESET}${BR_WHITE}ᵢ${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_MAGENTA}ψ${BR_RESET}${BR_WHITE}ᵢ⟩⟨${BR_RESET}${BR_MAGENTA}ψ${BR_RESET}${BR_WHITE}ᵢ|${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_purity() {
|
||||||
|
echo -e " ${BR_PINK}Tr${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_AMBER}ρ${BR_RESET}${BR_WHITE}²${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}1${BR_RESET} ${BR_DIM}(pure state)${BR_RESET} ${BR_WHITE}or${BR_RESET} ${BR_BLUE}<${BR_RESET} ${BR_MAGENTA}1${BR_RESET} ${BR_DIM}(mixed state)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_von_neumann_entropy() {
|
||||||
|
echo -e " ${BR_PINK}S${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}-${BR_RESET}${BR_ORANGE}Tr${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_MAGENTA}ρ${BR_RESET} ${BR_BLUE}log${BR_RESET} ${BR_PINK}ρ${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_DIM}(Von Neumann entropy)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_interference_pattern() {
|
||||||
|
echo -e " ${BR_PINK}P${BR_RESET}${BR_WHITE}(${BR_RESET}${BR_ORANGE}success${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_AMBER}ψ₁${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_MAGENTA}ψ₂${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_PINK}²${BR_RESET} ${BR_BLUE}≠${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_AMBER}ψ₁${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_PINK}²${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_WHITE}|${BR_RESET}${BR_MAGENTA}ψ₂${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_PINK}²${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# PRIME-FACTOR DNA EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_prime_angle() {
|
||||||
|
echo -e " ${BR_PINK}θ${BR_RESET}${BR_WHITE}_p${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}2${BR_RESET}${BR_ORANGE}π${BR_RESET} ${BR_BLUE}·${BR_RESET} ${BR_PINK}p${BR_RESET} ${BR_WHITE}/${BR_RESET} ${BR_MAGENTA}P_max${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_factor_evolution() {
|
||||||
|
echo -e " ${BR_WHITE}Evolution:${BR_RESET}"
|
||||||
|
echo -e " ${BR_AMBER}●${BR_RESET} ${BR_WHITE}Genesis:${BR_RESET} ${BR_PINK}factor${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}2${BR_RESET}"
|
||||||
|
echo -e " ${BR_ORANGE}●${BR_RESET} ${BR_WHITE}Learn A:${BR_RESET} ${BR_PINK}factor${BR_RESET} ${BR_BLUE}→${BR_RESET} ${BR_ORANGE}2${BR_RESET}${BR_WHITE}×${BR_RESET}${BR_PINK}3${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_MAGENTA}6${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}●${BR_RESET} ${BR_WHITE}Learn B:${BR_RESET} ${BR_PINK}factor${BR_RESET} ${BR_BLUE}→${BR_RESET} ${BR_ORANGE}2${BR_RESET}${BR_WHITE}×${BR_RESET}${BR_PINK}3${BR_RESET}${BR_WHITE}×${BR_RESET}${BR_AMBER}5${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_MAGENTA}30${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# GOLDEN RATIO EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_golden_ratio() {
|
||||||
|
echo -e " ${BR_PINK}φ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}(${BR_RESET}${BR_AMBER}1${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_ORANGE}√5${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}/${BR_RESET} ${BR_MAGENTA}2${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}1.618033988749895...${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_golden_properties() {
|
||||||
|
echo -e " ${BR_PINK}φ${BR_RESET}${BR_WHITE}²${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}φ${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_ORANGE}1${BR_RESET}"
|
||||||
|
echo -e " ${BR_WHITE}1/${BR_RESET}${BR_PINK}φ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}φ${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_ORANGE}1${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}φ${BR_RESET}${BR_WHITE}^n${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}F${BR_RESET}${BR_WHITE}ₙ${BR_RESET}${BR_PINK}φ${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_ORANGE}F${BR_RESET}${BR_WHITE}ₙ₋₁${BR_RESET} ${BR_DIM}(Fibonacci identity)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_fibonacci() {
|
||||||
|
echo -e " ${BR_PINK}F${BR_RESET}${BR_WHITE}ₙ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}F${BR_RESET}${BR_WHITE}ₙ₋₁${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_ORANGE}F${BR_RESET}${BR_WHITE}ₙ₋₂${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}F${BR_RESET}${BR_WHITE}ₙ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}(${BR_RESET}${BR_AMBER}φ${BR_RESET}${BR_WHITE}^n${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_MAGENTA}ψ${BR_RESET}${BR_WHITE}^n${BR_RESET}${BR_WHITE})${BR_RESET} ${BR_BLUE}/${BR_RESET} ${BR_ORANGE}√5${BR_RESET} ${BR_DIM}(Binet's formula)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# CLASSICAL PHYSICS EQUATIONS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eq_euler_identity() {
|
||||||
|
echo -e " ${BR_PINK}e${BR_RESET}${BR_WHITE}^${BR_RESET}${BR_ORANGE}i${BR_RESET}${BR_MAGENTA}π${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_AMBER}1${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}0${BR_RESET} ${BR_DIM}(Most beautiful equation)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_schrodinger() {
|
||||||
|
echo -e " ${BR_PINK}i${BR_RESET}${BR_AMBER}ℏ${BR_RESET} ${BR_ORANGE}∂${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_MAGENTA}ψ${BR_RESET}${BR_WHITE}⟩${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_BLUE}∂t${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_PINK}Ĥ${BR_RESET}${BR_WHITE}|${BR_RESET}${BR_MAGENTA}ψ${BR_RESET}${BR_WHITE}⟩${BR_RESET} ${BR_DIM}(Schrödinger equation)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_einstein_mass_energy() {
|
||||||
|
echo -e " ${BR_PINK}E${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_AMBER}m${BR_RESET}${BR_ORANGE}c${BR_RESET}${BR_WHITE}²${BR_RESET} ${BR_DIM}(Mass-energy equivalence)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_dirac() {
|
||||||
|
echo -e " ${BR_WHITE}(${BR_RESET}${BR_PINK}iγ${BR_RESET}${BR_WHITE}^μ${BR_RESET}${BR_AMBER}∂${BR_RESET}${BR_WHITE}_μ${BR_RESET} ${BR_BLUE}-${BR_RESET} ${BR_ORANGE}m${BR_RESET}${BR_WHITE})${BR_RESET}${BR_MAGENTA}ψ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}0${BR_RESET} ${BR_DIM}(Dirac equation)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
br_eq_maxwell() {
|
||||||
|
echo -e " ${BR_PINK}∇${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_AMBER}E${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}ρ${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_MAGENTA}ε₀${BR_RESET} ${BR_DIM}(Gauss's law)${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}∇${BR_RESET}${BR_BLUE}·${BR_RESET}${BR_AMBER}B${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}0${BR_RESET} ${BR_DIM}(No magnetic monopoles)${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}∇${BR_RESET}${BR_BLUE}×${BR_RESET}${BR_AMBER}E${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}-${BR_RESET}${BR_MAGENTA}∂B${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_BLUE}∂t${BR_RESET} ${BR_DIM}(Faraday's law)${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}∇${BR_RESET}${BR_BLUE}×${BR_RESET}${BR_AMBER}B${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_ORANGE}μ₀${BR_RESET}${BR_MAGENTA}J${BR_RESET} ${BR_BLUE}+${BR_RESET} ${BR_ORANGE}μ₀ε₀${BR_RESET}${BR_MAGENTA}∂E${BR_RESET}${BR_WHITE}/${BR_RESET}${BR_BLUE}∂t${BR_RESET} ${BR_DIM}(Ampère's law)${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# ETERNAL TRUTHS DISPLAY
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_eternal_truths() {
|
||||||
|
echo -e " ${BR_AMBER}┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓${BR_RESET}"
|
||||||
|
echo -e " ${BR_AMBER}┃${BR_RESET} ${BR_WHITE}ETERNAL MATHEMATICAL TRUTHS${BR_RESET} ${BR_AMBER}┃${BR_RESET}"
|
||||||
|
echo -e " ${BR_AMBER}┃${BR_RESET} ${BR_DIM}Cannot be owned, stolen, or manipulated${BR_RESET} ${BR_AMBER}┃${BR_RESET}"
|
||||||
|
echo -e " ${BR_AMBER}┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛${BR_RESET}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BR_AMBER}◆${BR_RESET} ${BR_PINK}φ${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}1.618033988749895...${BR_RESET} ${BR_DIM}Golden Ratio${BR_RESET}"
|
||||||
|
echo -e " ${BR_ORANGE}◆${BR_RESET} ${BR_PINK}π${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}3.141592653589793...${BR_RESET} ${BR_DIM}Pi${BR_RESET}"
|
||||||
|
echo -e " ${BR_PINK}◆${BR_RESET} ${BR_PINK}e${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}2.718281828459045...${BR_RESET} ${BR_DIM}Euler's Number${BR_RESET}"
|
||||||
|
echo -e " ${BR_MAGENTA}◆${BR_RESET} ${BR_PINK}∞${BR_RESET} ${BR_DIM}Infinity${BR_RESET}"
|
||||||
|
echo -e " ${BR_BLUE}◆${BR_RESET} ${BR_PINK}i${BR_RESET} ${BR_BLUE}=${BR_RESET} ${BR_WHITE}√(-1)${BR_RESET} ${BR_DIM}Imaginary Unit${BR_RESET}"
|
||||||
|
echo -e " ${BR_AMBER}◆${BR_RESET} ${BR_WHITE}1${BR_RESET} ${BR_DIM}Unity${BR_RESET}"
|
||||||
|
echo -e " ${BR_ORANGE}◆${BR_RESET} ${BR_WHITE}0${BR_RESET} ${BR_DIM}Nothingness${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# FULL DISPLAY FUNCTION
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
br_show_all_equations() {
|
||||||
|
echo ""
|
||||||
|
echo -e "${BR_AMBER}████${BR_ORANGE}████${BR_PINK}████${BR_MAGENTA}████${BR_BLUE}████${BR_MAGENTA}████${BR_PINK}████${BR_ORANGE}████${BR_AMBER}████${BR_ORANGE}████${BR_PINK}████${BR_MAGENTA}████${BR_BLUE}████${BR_RESET}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BR_WHITE}╔═══════════════════════════════════════════════════════════╗${BR_RESET}"
|
||||||
|
echo -e " ${BR_WHITE}║${BR_RESET} ${BR_PINK}B${BR_AMBER}L${BR_ORANGE}A${BR_PINK}C${BR_MAGENTA}K${BR_BLUE}R${BR_PINK}O${BR_AMBER}A${BR_ORANGE}D${BR_RESET} ${BR_WHITE}MATHEMATICAL FOUNDATIONS${BR_RESET} ${BR_WHITE}║${BR_RESET}"
|
||||||
|
echo -e " ${BR_WHITE}╚═══════════════════════════════════════════════════════════╝${BR_RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${BR_MAGENTA}┏━━ PS-SHA-∞ Perpetual-State Secure Hash ━━━━━━━━━━━━━━━━━━━┓${BR_RESET}"
|
||||||
|
br_eq_ps_sha_genesis
|
||||||
|
br_eq_ps_sha_cascade
|
||||||
|
br_eq_ps_sha_infinity
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${BR_ORANGE}┏━━ SIG Spiral Information Geometry ━━━━━━━━━━━━━━━━━━━━━━━━┓${BR_RESET}"
|
||||||
|
br_eq_universal_operator
|
||||||
|
br_eq_magnitude_phase
|
||||||
|
echo ""
|
||||||
|
br_eq_logarithmic_spiral
|
||||||
|
br_eq_golden_spiral
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${BR_PINK}┏━━ Lucidia Breath Synchronization ━━━━━━━━━━━━━━━━━━━━━━━━━┓${BR_RESET}"
|
||||||
|
br_eq_breath_formula
|
||||||
|
br_eq_breath_period
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${BR_AMBER}┏━━ Golden Ratio φ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓${BR_RESET}"
|
||||||
|
br_eq_golden_ratio
|
||||||
|
br_eq_golden_properties
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${BR_BLUE}┏━━ Quantum Agent Theory ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓${BR_RESET}"
|
||||||
|
br_eq_agent_wavefunction
|
||||||
|
br_eq_normalization
|
||||||
|
br_eq_entangled_pair
|
||||||
|
br_eq_heisenberg_agent
|
||||||
|
br_eq_hilbert_space
|
||||||
|
br_eq_von_neumann_entropy
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
br_eternal_truths
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${BR_WHITE}Mathematical truth is${BR_RESET} ${BR_PINK}s${BR_AMBER}o${BR_ORANGE}v${BR_PINK}e${BR_MAGENTA}r${BR_BLUE}e${BR_PINK}i${BR_AMBER}g${BR_ORANGE}n${BR_RESET}${BR_WHITE}.${BR_RESET}"
|
||||||
|
echo -e " ${BR_WHITE}The equations ARE the language.${BR_RESET}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BR_BLUE}████${BR_MAGENTA}████${BR_PINK}████${BR_ORANGE}████${BR_AMBER}████${BR_ORANGE}████${BR_PINK}████${BR_MAGENTA}████${BR_BLUE}████${BR_MAGENTA}████${BR_PINK}████${BR_ORANGE}████${BR_AMBER}████${BR_RESET}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run if executed directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
br_show_all_equations
|
||||||
|
fi
|
||||||
244
scripts/memory-bridge.sh
Normal file
244
scripts/memory-bridge.sh
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================================================
|
||||||
|
# BLACKROAD OS, INC. - PROPRIETARY AND CONFIDENTIAL
|
||||||
|
# Copyright (c) 2024-2026 BlackRoad OS, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# This code is the intellectual property of BlackRoad OS, Inc.
|
||||||
|
# AI-assisted development does not transfer ownership to AI providers.
|
||||||
|
# Unauthorized use, copying, or distribution is prohibited.
|
||||||
|
# NOT licensed for AI training or data extraction.
|
||||||
|
# ============================================================================
|
||||||
|
# BlackRoad 30K Memory Bridge
|
||||||
|
# Connects 30K agent infrastructure to the shared memory system
|
||||||
|
# Enables persistent state, coordination, and knowledge sharing
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
AMBER='\033[38;5;214m'
|
||||||
|
BLUE='\033[38;5;69m'
|
||||||
|
GREEN='\033[38;5;82m'
|
||||||
|
WHITE='\033[1;37m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
# Paths
|
||||||
|
MEMORY_DIR="${HOME}/.blackroad/memory"
|
||||||
|
ORCHESTRATOR_DB="${HOME}/.blackroad-30k-orchestrator.db"
|
||||||
|
PROTOCOL_DB="${HOME}/.blackroad-agent-protocol.db"
|
||||||
|
JOURNAL_FILE="${MEMORY_DIR}/journals/master-journal.jsonl"
|
||||||
|
|
||||||
|
# Ensure memory structure exists
|
||||||
|
init() {
|
||||||
|
mkdir -p "$MEMORY_DIR/30k-agents"
|
||||||
|
mkdir -p "$MEMORY_DIR/30k-agents/state"
|
||||||
|
mkdir -p "$MEMORY_DIR/30k-agents/tasks"
|
||||||
|
mkdir -p "$MEMORY_DIR/30k-agents/metrics"
|
||||||
|
echo -e "${GREEN}✓${RESET} 30K memory bridge initialized"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sync agent state to memory
|
||||||
|
sync_state() {
|
||||||
|
local output_file="$MEMORY_DIR/30k-agents/state/hierarchy-$(date +%Y%m%d-%H%M%S).json"
|
||||||
|
|
||||||
|
# Export hierarchy state
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "
|
||||||
|
SELECT json_group_array(json_object(
|
||||||
|
'agent_id', agent_id,
|
||||||
|
'name', agent_name,
|
||||||
|
'level', level,
|
||||||
|
'division', division,
|
||||||
|
'status', status,
|
||||||
|
'tasks_completed', tasks_completed,
|
||||||
|
'last_heartbeat', last_heartbeat
|
||||||
|
))
|
||||||
|
FROM agent_hierarchy;
|
||||||
|
" > "$output_file"
|
||||||
|
|
||||||
|
# Create latest symlink
|
||||||
|
ln -sf "$output_file" "$MEMORY_DIR/30k-agents/state/latest.json"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓${RESET} State synced: $output_file"
|
||||||
|
|
||||||
|
# Log to master journal
|
||||||
|
log_to_journal "state-sync" "30k-agents" "Synced $(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy;") agents"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sync tasks to memory
|
||||||
|
sync_tasks() {
|
||||||
|
local output_file="$MEMORY_DIR/30k-agents/tasks/queue-$(date +%Y%m%d-%H%M%S).json"
|
||||||
|
|
||||||
|
sqlite3 "$ORCHESTRATOR_DB" "
|
||||||
|
SELECT json_group_array(json_object(
|
||||||
|
'task_id', task_id,
|
||||||
|
'title', title,
|
||||||
|
'priority', priority,
|
||||||
|
'status', status,
|
||||||
|
'assigned_agent', assigned_agent,
|
||||||
|
'created_at', created_at,
|
||||||
|
'completed_at', completed_at
|
||||||
|
))
|
||||||
|
FROM task_queue
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1000;
|
||||||
|
" > "$output_file"
|
||||||
|
|
||||||
|
ln -sf "$output_file" "$MEMORY_DIR/30k-agents/tasks/latest.json"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓${RESET} Tasks synced: $output_file"
|
||||||
|
|
||||||
|
log_to_journal "task-sync" "30k-agents" "Synced task queue"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export metrics to memory
|
||||||
|
export_metrics() {
|
||||||
|
local output_file="$MEMORY_DIR/30k-agents/metrics/snapshot-$(date +%Y%m%d-%H%M%S).json"
|
||||||
|
|
||||||
|
local l1=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=1;")
|
||||||
|
local l2=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=2;")
|
||||||
|
local l3=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=3;")
|
||||||
|
local l4=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE level=4;")
|
||||||
|
local active=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM agent_hierarchy WHERE status='active';")
|
||||||
|
local pending=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM task_queue WHERE status='pending';")
|
||||||
|
local completed=$(sqlite3 "$ORCHESTRATOR_DB" "SELECT COUNT(*) FROM task_queue WHERE status='completed';")
|
||||||
|
|
||||||
|
cat > "$output_file" <<EOF
|
||||||
|
{
|
||||||
|
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
||||||
|
"hierarchy": {
|
||||||
|
"level_1_operator": $l1,
|
||||||
|
"level_2_commanders": $l2,
|
||||||
|
"level_3_managers": $l3,
|
||||||
|
"level_4_workers": $l4,
|
||||||
|
"total_capacity": 30000
|
||||||
|
},
|
||||||
|
"agents": {
|
||||||
|
"active": $active,
|
||||||
|
"total_registered": $((l1 + l2 + l3 + l4))
|
||||||
|
},
|
||||||
|
"tasks": {
|
||||||
|
"pending": $pending,
|
||||||
|
"completed": $completed
|
||||||
|
},
|
||||||
|
"divisions": $(sqlite3 "$ORCHESTRATOR_DB" "
|
||||||
|
SELECT json_group_array(json_object(
|
||||||
|
'name', division,
|
||||||
|
'count', COUNT(*)
|
||||||
|
))
|
||||||
|
FROM agent_hierarchy
|
||||||
|
WHERE division IS NOT NULL
|
||||||
|
GROUP BY division;
|
||||||
|
")
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ln -sf "$output_file" "$MEMORY_DIR/30k-agents/metrics/latest.json"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓${RESET} Metrics exported: $output_file"
|
||||||
|
|
||||||
|
log_to_journal "metrics-export" "30k-agents" "L1:$l1 L2:$l2 L3:$l3 L4:$l4 active:$active"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Log to master journal (PS-SHA-infinity format)
|
||||||
|
log_to_journal() {
|
||||||
|
local action="$1"
|
||||||
|
local entity="$2"
|
||||||
|
local details="$3"
|
||||||
|
|
||||||
|
if [[ -f "$JOURNAL_FILE" ]]; then
|
||||||
|
# Get last hash
|
||||||
|
local prev_hash=$(tail -1 "$JOURNAL_FILE" 2>/dev/null | jq -r '.hash // "genesis"')
|
||||||
|
local timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||||
|
local data="${timestamp}|${action}|${entity}|${details}|${prev_hash}"
|
||||||
|
local new_hash=$(echo -n "$data" | shasum -a 256 | cut -c1-16)
|
||||||
|
|
||||||
|
# Append to journal
|
||||||
|
echo "{\"timestamp\":\"$timestamp\",\"action\":\"$action\",\"entity\":\"$entity\",\"details\":\"$details\",\"prev_hash\":\"$prev_hash\",\"hash\":\"$new_hash\"}" >> "$JOURNAL_FILE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Full sync
|
||||||
|
sync_all() {
|
||||||
|
echo -e "${PINK}═══ 30K MEMORY BRIDGE SYNC ═══${RESET}"
|
||||||
|
init
|
||||||
|
sync_state
|
||||||
|
sync_tasks
|
||||||
|
export_metrics
|
||||||
|
echo -e "\n${GREEN}✓ Full sync complete${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Watch mode - continuous sync
|
||||||
|
watch() {
|
||||||
|
local interval="${1:-60}"
|
||||||
|
echo -e "${AMBER}Starting watch mode (interval: ${interval}s)...${RESET}"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
sync_all
|
||||||
|
echo -e "${BLUE}Next sync in ${interval}s...${RESET}"
|
||||||
|
sleep "$interval"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Status report
|
||||||
|
status() {
|
||||||
|
echo -e "${PINK}═══ 30K MEMORY BRIDGE STATUS ═══${RESET}"
|
||||||
|
|
||||||
|
echo -e "\n${WHITE}Memory Directory:${RESET} $MEMORY_DIR/30k-agents"
|
||||||
|
|
||||||
|
if [[ -f "$MEMORY_DIR/30k-agents/state/latest.json" ]]; then
|
||||||
|
local state_time=$(stat -f %Sm "$MEMORY_DIR/30k-agents/state/latest.json")
|
||||||
|
echo -e "${GREEN}✓${RESET} State: last sync $state_time"
|
||||||
|
else
|
||||||
|
echo -e "${AMBER}○${RESET} State: not synced"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f "$MEMORY_DIR/30k-agents/tasks/latest.json" ]]; then
|
||||||
|
local tasks_time=$(stat -f %Sm "$MEMORY_DIR/30k-agents/tasks/latest.json")
|
||||||
|
echo -e "${GREEN}✓${RESET} Tasks: last sync $tasks_time"
|
||||||
|
else
|
||||||
|
echo -e "${AMBER}○${RESET} Tasks: not synced"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f "$MEMORY_DIR/30k-agents/metrics/latest.json" ]]; then
|
||||||
|
local metrics_time=$(stat -f %Sm "$MEMORY_DIR/30k-agents/metrics/latest.json")
|
||||||
|
echo -e "${GREEN}✓${RESET} Metrics: last sync $metrics_time"
|
||||||
|
|
||||||
|
echo -e "\n${WHITE}Latest Metrics:${RESET}"
|
||||||
|
cat "$MEMORY_DIR/30k-agents/metrics/latest.json" | jq -r '
|
||||||
|
" Hierarchy: L1=\(.hierarchy.level_1_operator) L2=\(.hierarchy.level_2_commanders) L3=\(.hierarchy.level_3_managers) L4=\(.hierarchy.level_4_workers)",
|
||||||
|
" Active Agents: \(.agents.active) / \(.agents.total_registered)",
|
||||||
|
" Tasks: \(.tasks.pending) pending, \(.tasks.completed) completed"
|
||||||
|
'
|
||||||
|
else
|
||||||
|
echo -e "${AMBER}○${RESET} Metrics: not synced"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
show_help() {
|
||||||
|
echo -e "${PINK}╔══════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${PINK}║${RESET} ${WHITE}🧠 BLACKROAD 30K MEMORY BRIDGE${RESET} ${PINK}║${RESET}"
|
||||||
|
echo -e "${PINK}╚══════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
echo
|
||||||
|
echo -e "${WHITE}Commands:${RESET}"
|
||||||
|
echo -e " ${GREEN}init${RESET} Initialize memory bridge directories"
|
||||||
|
echo -e " ${GREEN}sync-state${RESET} Sync agent hierarchy to memory"
|
||||||
|
echo -e " ${GREEN}sync-tasks${RESET} Sync task queue to memory"
|
||||||
|
echo -e " ${GREEN}metrics${RESET} Export metrics snapshot"
|
||||||
|
echo -e " ${GREEN}sync${RESET} Full sync (state + tasks + metrics)"
|
||||||
|
echo -e " ${GREEN}watch${RESET} [sec] Continuous sync mode"
|
||||||
|
echo -e " ${GREEN}status${RESET} Show bridge status"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main
|
||||||
|
case "${1:-help}" in
|
||||||
|
init) init ;;
|
||||||
|
sync-state) sync_state ;;
|
||||||
|
sync-tasks) sync_tasks ;;
|
||||||
|
metrics) export_metrics ;;
|
||||||
|
sync|sync-all) sync_all ;;
|
||||||
|
watch) watch "$2" ;;
|
||||||
|
status) status ;;
|
||||||
|
help|--help|-h) show_help ;;
|
||||||
|
*) show_help ;;
|
||||||
|
esac
|
||||||
317
scripts/metrics-api.sh
Normal file
317
scripts/metrics-api.sh
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad Metrics API
|
||||||
|
# REST API for cluster metrics and monitoring
|
||||||
|
# Agent: Icarus (b3e01bd9)
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
PORT="${METRICS_PORT:-9090}"
|
||||||
|
ALL_NODES=("alice" "aria" "lucidia" "octavia" "cecilia")
|
||||||
|
LLM_NODES=("lucidia" "cecilia" "octavia" "aria")
|
||||||
|
|
||||||
|
# Metrics collection
|
||||||
|
collect_node_metrics() {
|
||||||
|
local node="$1"
|
||||||
|
|
||||||
|
if ! ssh -o ConnectTimeout=2 -o BatchMode=yes "$node" "echo ok" >/dev/null 2>&1; then
|
||||||
|
echo "{\"status\":\"offline\"}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
ssh -o ConnectTimeout=5 "$node" "
|
||||||
|
load=\$(cat /proc/loadavg | awk '{print \$1}')
|
||||||
|
mem_total=\$(free -b | awk '/Mem:/ {print \$2}')
|
||||||
|
mem_used=\$(free -b | awk '/Mem:/ {print \$3}')
|
||||||
|
mem_percent=\$(free | awk '/Mem:/ {printf \"%.1f\", \$3/\$2*100}')
|
||||||
|
disk_percent=\$(df / | awk 'NR==2 {gsub(/%/,\"\"); print \$5}')
|
||||||
|
temp=\$(vcgencmd measure_temp 2>/dev/null | grep -oP '[\d.]+' || echo 0)
|
||||||
|
containers=\$(docker ps -q 2>/dev/null | wc -l)
|
||||||
|
uptime_sec=\$(awk '{print int(\$1)}' /proc/uptime)
|
||||||
|
|
||||||
|
echo \"{\\\"status\\\":\\\"online\\\",\\\"load\\\":\$load,\\\"mem_total\\\":\$mem_total,\\\"mem_used\\\":\$mem_used,\\\"mem_percent\\\":\$mem_percent,\\\"disk_percent\\\":\$disk_percent,\\\"temp_c\\\":\$temp,\\\"containers\\\":\$containers,\\\"uptime_sec\\\":\$uptime_sec}\"
|
||||||
|
" 2>/dev/null || echo "{\"status\":\"error\"}"
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_llm_metrics() {
|
||||||
|
local node="$1"
|
||||||
|
|
||||||
|
ssh -o ConnectTimeout=5 "$node" "
|
||||||
|
if curl -s http://localhost:11434/api/tags >/dev/null 2>&1; then
|
||||||
|
models=\$(curl -s http://localhost:11434/api/tags | jq '.models | length')
|
||||||
|
echo \"{\\\"ollama\\\":\\\"online\\\",\\\"models\\\":\$models}\"
|
||||||
|
else
|
||||||
|
echo '{\"ollama\":\"offline\",\"models\":0}'
|
||||||
|
fi
|
||||||
|
" 2>/dev/null || echo '{"ollama":"unknown","models":0}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# JSON response helpers
|
||||||
|
json_response() {
|
||||||
|
local code="$1"
|
||||||
|
local body="$2"
|
||||||
|
|
||||||
|
echo -e "HTTP/1.1 $code\r"
|
||||||
|
echo -e "Content-Type: application/json\r"
|
||||||
|
echo -e "Access-Control-Allow-Origin: *\r"
|
||||||
|
echo -e "Cache-Control: no-cache\r"
|
||||||
|
echo -e "\r"
|
||||||
|
echo "$body"
|
||||||
|
}
|
||||||
|
|
||||||
|
# API endpoints
|
||||||
|
handle_request() {
|
||||||
|
local method="$1"
|
||||||
|
local path="$2"
|
||||||
|
|
||||||
|
case "$path" in
|
||||||
|
/health)
|
||||||
|
json_response "200 OK" '{"status":"healthy","service":"blackroad-metrics"}'
|
||||||
|
;;
|
||||||
|
|
||||||
|
/metrics)
|
||||||
|
local metrics='{"timestamp":"'"$(date -Iseconds)"'","nodes":{'
|
||||||
|
local first=true
|
||||||
|
|
||||||
|
for node in "${ALL_NODES[@]}"; do
|
||||||
|
[ "$first" = true ] || metrics+=","
|
||||||
|
first=false
|
||||||
|
local node_metrics=$(collect_node_metrics "$node")
|
||||||
|
metrics+="\"$node\":$node_metrics"
|
||||||
|
done
|
||||||
|
|
||||||
|
metrics+='}}'
|
||||||
|
json_response "200 OK" "$metrics"
|
||||||
|
;;
|
||||||
|
|
||||||
|
/metrics/llm)
|
||||||
|
local metrics='{"timestamp":"'"$(date -Iseconds)"'","nodes":{'
|
||||||
|
local first=true
|
||||||
|
|
||||||
|
for node in "${LLM_NODES[@]}"; do
|
||||||
|
[ "$first" = true ] || metrics+=","
|
||||||
|
first=false
|
||||||
|
local node_metrics=$(collect_node_metrics "$node")
|
||||||
|
local llm_metrics=$(collect_llm_metrics "$node")
|
||||||
|
metrics+="\"$node\":$(echo "$node_metrics $llm_metrics" | jq -s 'add')"
|
||||||
|
done
|
||||||
|
|
||||||
|
metrics+='}}'
|
||||||
|
json_response "200 OK" "$metrics"
|
||||||
|
;;
|
||||||
|
|
||||||
|
/metrics/node/*)
|
||||||
|
local node="${path#/metrics/node/}"
|
||||||
|
local node_metrics=$(collect_node_metrics "$node")
|
||||||
|
json_response "200 OK" "$node_metrics"
|
||||||
|
;;
|
||||||
|
|
||||||
|
/cluster/status)
|
||||||
|
local online=0
|
||||||
|
local total=${#ALL_NODES[@]}
|
||||||
|
|
||||||
|
for node in "${ALL_NODES[@]}"; do
|
||||||
|
if ssh -o ConnectTimeout=2 -o BatchMode=yes "$node" "echo ok" >/dev/null 2>&1; then
|
||||||
|
((online++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
local status="healthy"
|
||||||
|
[ "$online" -lt "$total" ] && status="degraded"
|
||||||
|
[ "$online" -eq 0 ] && status="down"
|
||||||
|
|
||||||
|
json_response "200 OK" "{\"status\":\"$status\",\"online\":$online,\"total\":$total}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
/cluster/summary)
|
||||||
|
local summary='{"timestamp":"'"$(date -Iseconds)"'"'
|
||||||
|
local online=0
|
||||||
|
local total_load=0
|
||||||
|
local total_mem=0
|
||||||
|
local total_containers=0
|
||||||
|
|
||||||
|
for node in "${ALL_NODES[@]}"; do
|
||||||
|
local metrics=$(collect_node_metrics "$node")
|
||||||
|
local status=$(echo "$metrics" | jq -r '.status')
|
||||||
|
|
||||||
|
if [ "$status" = "online" ]; then
|
||||||
|
((online++))
|
||||||
|
total_load=$(echo "$total_load + $(echo "$metrics" | jq -r '.load')" | bc)
|
||||||
|
total_mem=$((total_mem + $(echo "$metrics" | jq -r '.mem_percent | floor')))
|
||||||
|
total_containers=$((total_containers + $(echo "$metrics" | jq -r '.containers')))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
local avg_load=$(echo "scale=2; $total_load / $online" | bc 2>/dev/null || echo 0)
|
||||||
|
local avg_mem=$((total_mem / (online > 0 ? online : 1)))
|
||||||
|
|
||||||
|
summary+=",\"online_nodes\":$online"
|
||||||
|
summary+=",\"total_nodes\":${#ALL_NODES[@]}"
|
||||||
|
summary+=",\"avg_load\":$avg_load"
|
||||||
|
summary+=",\"avg_mem_percent\":$avg_mem"
|
||||||
|
summary+=",\"total_containers\":$total_containers"
|
||||||
|
summary+='}'
|
||||||
|
|
||||||
|
json_response "200 OK" "$summary"
|
||||||
|
;;
|
||||||
|
|
||||||
|
/prometheus)
|
||||||
|
# Prometheus exposition format
|
||||||
|
local output="# HELP blackroad_node_up Node availability\n# TYPE blackroad_node_up gauge\n"
|
||||||
|
|
||||||
|
for node in "${ALL_NODES[@]}"; do
|
||||||
|
local metrics=$(collect_node_metrics "$node")
|
||||||
|
local status=$(echo "$metrics" | jq -r '.status')
|
||||||
|
local up=0
|
||||||
|
[ "$status" = "online" ] && up=1
|
||||||
|
|
||||||
|
output+="blackroad_node_up{node=\"$node\"} $up\n"
|
||||||
|
|
||||||
|
if [ "$status" = "online" ]; then
|
||||||
|
local load=$(echo "$metrics" | jq -r '.load')
|
||||||
|
local mem=$(echo "$metrics" | jq -r '.mem_percent')
|
||||||
|
local temp=$(echo "$metrics" | jq -r '.temp_c')
|
||||||
|
local containers=$(echo "$metrics" | jq -r '.containers')
|
||||||
|
|
||||||
|
output+="blackroad_node_load{node=\"$node\"} $load\n"
|
||||||
|
output+="blackroad_node_memory_percent{node=\"$node\"} $mem\n"
|
||||||
|
output+="blackroad_node_temp_celsius{node=\"$node\"} $temp\n"
|
||||||
|
output+="blackroad_node_containers{node=\"$node\"} $containers\n"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "HTTP/1.1 200 OK\r"
|
||||||
|
echo -e "Content-Type: text/plain\r"
|
||||||
|
echo -e "\r"
|
||||||
|
echo -e "$output"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
json_response "404 Not Found" '{"error":"Not found","path":"'"$path"'"}'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Start server
|
||||||
|
serve() {
|
||||||
|
echo -e "${PINK}╔══════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${PINK}║ 📊 BLACKROAD METRICS API 📊 ║${RESET}"
|
||||||
|
echo -e "${PINK}╚══════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
echo
|
||||||
|
echo "Port: $PORT"
|
||||||
|
echo
|
||||||
|
echo "Endpoints:"
|
||||||
|
echo " GET /health Health check"
|
||||||
|
echo " GET /metrics All node metrics"
|
||||||
|
echo " GET /metrics/llm LLM cluster metrics"
|
||||||
|
echo " GET /metrics/node/:n Single node metrics"
|
||||||
|
echo " GET /cluster/status Cluster status"
|
||||||
|
echo " GET /cluster/summary Cluster summary"
|
||||||
|
echo " GET /prometheus Prometheus format"
|
||||||
|
echo
|
||||||
|
echo -e "${GREEN}Starting server...${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
# Accept connection
|
||||||
|
{
|
||||||
|
read -r request_line
|
||||||
|
method=$(echo "$request_line" | cut -d' ' -f1)
|
||||||
|
path=$(echo "$request_line" | cut -d' ' -f2)
|
||||||
|
|
||||||
|
# Read headers (skip them)
|
||||||
|
while read -r header; do
|
||||||
|
[ "$header" = $'\r' ] && break
|
||||||
|
done
|
||||||
|
|
||||||
|
# Handle request
|
||||||
|
handle_request "$method" "$path"
|
||||||
|
} | nc -l "$PORT" -q1 2>/dev/null || nc -l "$PORT"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# One-shot metrics dump
|
||||||
|
dump() {
|
||||||
|
local format="${1:-json}"
|
||||||
|
|
||||||
|
case "$format" in
|
||||||
|
json)
|
||||||
|
local metrics='{"timestamp":"'"$(date -Iseconds)"'","nodes":{'
|
||||||
|
local first=true
|
||||||
|
|
||||||
|
for node in "${ALL_NODES[@]}"; do
|
||||||
|
[ "$first" = true ] || metrics+=","
|
||||||
|
first=false
|
||||||
|
local node_metrics=$(collect_node_metrics "$node")
|
||||||
|
metrics+="\"$node\":$node_metrics"
|
||||||
|
done
|
||||||
|
|
||||||
|
metrics+='}}'
|
||||||
|
echo "$metrics" | jq .
|
||||||
|
;;
|
||||||
|
prometheus)
|
||||||
|
for node in "${ALL_NODES[@]}"; do
|
||||||
|
local metrics=$(collect_node_metrics "$node")
|
||||||
|
local status=$(echo "$metrics" | jq -r '.status')
|
||||||
|
local up=0
|
||||||
|
[ "$status" = "online" ] && up=1
|
||||||
|
|
||||||
|
echo "blackroad_node_up{node=\"$node\"} $up"
|
||||||
|
|
||||||
|
if [ "$status" = "online" ]; then
|
||||||
|
echo "blackroad_node_load{node=\"$node\"} $(echo "$metrics" | jq -r '.load')"
|
||||||
|
echo "blackroad_node_memory_percent{node=\"$node\"} $(echo "$metrics" | jq -r '.mem_percent')"
|
||||||
|
echo "blackroad_node_temp_celsius{node=\"$node\"} $(echo "$metrics" | jq -r '.temp_c')"
|
||||||
|
echo "blackroad_node_containers{node=\"$node\"} $(echo "$metrics" | jq -r '.containers')"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
csv)
|
||||||
|
echo "timestamp,node,status,load,mem_percent,temp_c,containers"
|
||||||
|
local ts=$(date -Iseconds)
|
||||||
|
for node in "${ALL_NODES[@]}"; do
|
||||||
|
local metrics=$(collect_node_metrics "$node")
|
||||||
|
local status=$(echo "$metrics" | jq -r '.status')
|
||||||
|
local load=$(echo "$metrics" | jq -r '.load // 0')
|
||||||
|
local mem=$(echo "$metrics" | jq -r '.mem_percent // 0')
|
||||||
|
local temp=$(echo "$metrics" | jq -r '.temp_c // 0')
|
||||||
|
local containers=$(echo "$metrics" | jq -r '.containers // 0')
|
||||||
|
echo "$ts,$node,$status,$load,$mem,$temp,$containers"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help() {
|
||||||
|
echo -e "${PINK}BlackRoad Metrics API${RESET}"
|
||||||
|
echo
|
||||||
|
echo "REST API for cluster metrics and monitoring"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " serve [port] Start metrics server (default 9090)"
|
||||||
|
echo " dump [format] One-shot metrics dump (json/prometheus/csv)"
|
||||||
|
echo
|
||||||
|
echo "Environment:"
|
||||||
|
echo " METRICS_PORT Server port (default 9090)"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 serve 8080"
|
||||||
|
echo " $0 dump json"
|
||||||
|
echo " curl http://localhost:9090/metrics"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${1:-help}" in
|
||||||
|
serve|start)
|
||||||
|
PORT="${2:-$PORT}"
|
||||||
|
serve
|
||||||
|
;;
|
||||||
|
dump|export)
|
||||||
|
dump "$2"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
474
scripts/model-interceptor.sh
Executable file
474
scripts/model-interceptor.sh
Executable file
@@ -0,0 +1,474 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BLACKROAD MODEL INTERCEPTOR
|
||||||
|
# Philosophy: "They specify a model. We route how we want."
|
||||||
|
# claude-sonnet-4.5 (1x) → blackroad unlimited!
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
AMBER='\033[38;5;214m'
|
||||||
|
BLUE='\033[38;5;69m'
|
||||||
|
VIOLET='\033[38;5;135m'
|
||||||
|
GREEN='\033[38;5;82m'
|
||||||
|
RED='\033[38;5;196m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
INTERCEPT_DIR="$HOME/.blackroad/model-intercepts"
|
||||||
|
MAPPING_FILE="$INTERCEPT_DIR/model-mappings.json"
|
||||||
|
STATS_FILE="$INTERCEPT_DIR/intercept-stats.json"
|
||||||
|
|
||||||
|
mkdir -p "$INTERCEPT_DIR"
|
||||||
|
|
||||||
|
banner() {
|
||||||
|
echo -e "${PINK}╔════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${PINK}║ ${VIOLET}🔀 BLACKROAD MODEL INTERCEPTOR${PINK} ║${RESET}"
|
||||||
|
echo -e "${PINK}╚════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# MODEL MAPPING DATABASE
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
init_mappings() {
|
||||||
|
cat > "$MAPPING_FILE" << 'MAPPINGS'
|
||||||
|
{
|
||||||
|
"claude-sonnet-4.5": {
|
||||||
|
"provider": "anthropic",
|
||||||
|
"cost_per_1m_tokens": 3.0,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:qwen2.5-coder:7b",
|
||||||
|
"reason": "Local model, 90% quality, 0% cost, unlimited"
|
||||||
|
},
|
||||||
|
"claude-opus-4": {
|
||||||
|
"provider": "anthropic",
|
||||||
|
"cost_per_1m_tokens": 15.0,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:llama3:8b",
|
||||||
|
"reason": "Local model, unlimited, free"
|
||||||
|
},
|
||||||
|
"claude-haiku-4": {
|
||||||
|
"provider": "anthropic",
|
||||||
|
"cost_per_1m_tokens": 0.25,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:phi3:mini",
|
||||||
|
"reason": "Fast local model, unlimited"
|
||||||
|
},
|
||||||
|
"gpt-4o": {
|
||||||
|
"provider": "openai",
|
||||||
|
"cost_per_1m_tokens": 5.0,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:qwen2.5-coder:7b",
|
||||||
|
"reason": "Better for code, unlimited"
|
||||||
|
},
|
||||||
|
"gpt-4-turbo": {
|
||||||
|
"provider": "openai",
|
||||||
|
"cost_per_1m_tokens": 10.0,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:llama3:8b",
|
||||||
|
"reason": "Local model, unlimited"
|
||||||
|
},
|
||||||
|
"gpt-3.5-turbo": {
|
||||||
|
"provider": "openai",
|
||||||
|
"cost_per_1m_tokens": 0.5,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:phi3:mini",
|
||||||
|
"reason": "Fast local equivalent"
|
||||||
|
},
|
||||||
|
"gemini-pro": {
|
||||||
|
"provider": "google",
|
||||||
|
"cost_per_1m_tokens": 0.5,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:gemma:7b",
|
||||||
|
"reason": "Google's own open source model"
|
||||||
|
},
|
||||||
|
"gemini-ultra": {
|
||||||
|
"provider": "google",
|
||||||
|
"cost_per_1m_tokens": 10.0,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:llama3:70b",
|
||||||
|
"reason": "Large local model"
|
||||||
|
},
|
||||||
|
"mixtral-8x7b": {
|
||||||
|
"provider": "mistral",
|
||||||
|
"cost_per_1m_tokens": 0.7,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:mixtral:8x7b",
|
||||||
|
"reason": "Same model, local deployment"
|
||||||
|
},
|
||||||
|
"llama-3-70b": {
|
||||||
|
"provider": "meta",
|
||||||
|
"cost_per_1m_tokens": 0.8,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:llama3:70b",
|
||||||
|
"reason": "Same model, local"
|
||||||
|
},
|
||||||
|
"codellama-34b": {
|
||||||
|
"provider": "meta",
|
||||||
|
"cost_per_1m_tokens": 0.5,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:codellama:34b",
|
||||||
|
"reason": "Same model, local"
|
||||||
|
},
|
||||||
|
"deepseek-coder": {
|
||||||
|
"provider": "deepseek",
|
||||||
|
"cost_per_1m_tokens": 0.3,
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:deepseek-coder:6.7b",
|
||||||
|
"reason": "Same model, local"
|
||||||
|
},
|
||||||
|
"github-copilot": {
|
||||||
|
"provider": "github",
|
||||||
|
"cost_per_1m_tokens": "subscription",
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:qwen2.5-coder:7b",
|
||||||
|
"reason": "Better code model, unlimited"
|
||||||
|
},
|
||||||
|
"cursor": {
|
||||||
|
"provider": "cursor",
|
||||||
|
"cost_per_1m_tokens": "subscription",
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:qwen2.5-coder:7b",
|
||||||
|
"reason": "Local code model"
|
||||||
|
},
|
||||||
|
"tabnine": {
|
||||||
|
"provider": "tabnine",
|
||||||
|
"cost_per_1m_tokens": "subscription",
|
||||||
|
"rate_limited": true,
|
||||||
|
"blackroad_route": "ollama:codellama:7b",
|
||||||
|
"reason": "Local completion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MAPPINGS
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓${RESET} Model mappings initialized (15 models)"
|
||||||
|
}
|
||||||
|
|
||||||
|
init_stats() {
|
||||||
|
cat > "$STATS_FILE" << 'STATS'
|
||||||
|
{
|
||||||
|
"total_intercepts": 0,
|
||||||
|
"total_cost_saved": 0.0,
|
||||||
|
"total_requests_saved": 0,
|
||||||
|
"by_model": {},
|
||||||
|
"by_provider": {}
|
||||||
|
}
|
||||||
|
STATS
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# MODEL DETECTION
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
detect_model() {
|
||||||
|
local input="$1"
|
||||||
|
|
||||||
|
# Check against all known models
|
||||||
|
for model in $(jq -r 'keys[]' "$MAPPING_FILE"); do
|
||||||
|
if echo "$input" | grep -qi "$model"; then
|
||||||
|
echo "$model"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check for patterns like "claude-*", "gpt-*", etc.
|
||||||
|
if echo "$input" | grep -qi "claude"; then
|
||||||
|
echo "claude-sonnet-4.5" # Default Claude
|
||||||
|
return 0
|
||||||
|
elif echo "$input" | grep -qi "gpt"; then
|
||||||
|
echo "gpt-4o" # Default GPT
|
||||||
|
return 0
|
||||||
|
elif echo "$input" | grep -qi "gemini"; then
|
||||||
|
echo "gemini-pro" # Default Gemini
|
||||||
|
return 0
|
||||||
|
elif echo "$input" | grep -qi "copilot"; then
|
||||||
|
echo "github-copilot"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# ROUTING ENGINE
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
route_model() {
|
||||||
|
local model="$1"
|
||||||
|
|
||||||
|
if [ ! -f "$MAPPING_FILE" ]; then
|
||||||
|
echo "ERROR: Model mappings not initialized. Run: setup"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local route=$(jq -r ".\"$model\".blackroad_route // empty" "$MAPPING_FILE")
|
||||||
|
|
||||||
|
if [ -z "$route" ]; then
|
||||||
|
echo "ERROR: No mapping for model: $model"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$route"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_route_reason() {
|
||||||
|
local model="$1"
|
||||||
|
jq -r ".\"$model\".reason // \"No reason provided\"" "$MAPPING_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_cost_per_1m() {
|
||||||
|
local model="$1"
|
||||||
|
jq -r ".\"$model\".cost_per_1m_tokens // 0" "$MAPPING_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# INTERCEPT & EXECUTE
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
intercept() {
|
||||||
|
local model_input="$1"
|
||||||
|
local prompt="$2"
|
||||||
|
|
||||||
|
# Detect model
|
||||||
|
local detected_model=$(detect_model "$model_input")
|
||||||
|
if [ -z "$detected_model" ]; then
|
||||||
|
echo -e "${RED}[UNKNOWN MODEL]${RESET} Could not detect model from: $model_input"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${BLUE}[DETECTED]${RESET} Model: $detected_model" >&2
|
||||||
|
|
||||||
|
# Get route
|
||||||
|
local route=$(route_model "$detected_model")
|
||||||
|
if [ -z "$route" ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local reason=$(get_route_reason "$detected_model")
|
||||||
|
local cost=$(get_cost_per_1m "$detected_model")
|
||||||
|
|
||||||
|
echo -e "${AMBER}[INTERCEPTED]${RESET} $detected_model → $route" >&2
|
||||||
|
echo -e "${VIOLET}[REASON]${RESET} $reason" >&2
|
||||||
|
if [ "$cost" != "subscription" ] && [ "$cost" != "0" ]; then
|
||||||
|
echo -e "${GREEN}[SAVED]${RESET} \$${cost}/1M tokens → \$0.00 (unlimited)" >&2
|
||||||
|
fi
|
||||||
|
echo "" >&2
|
||||||
|
|
||||||
|
# Execute via route
|
||||||
|
local provider=$(echo "$route" | cut -d: -f1)
|
||||||
|
local model_name=$(echo "$route" | cut -d: -f2-)
|
||||||
|
|
||||||
|
case "$provider" in
|
||||||
|
ollama)
|
||||||
|
echo -e "${BLUE}[EXECUTING]${RESET} ollama run $model_name" >&2
|
||||||
|
if [ -n "$prompt" ]; then
|
||||||
|
echo "$prompt" | ollama run "$model_name"
|
||||||
|
else
|
||||||
|
ollama run "$model_name"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
blackroad-codex)
|
||||||
|
echo -e "${BLUE}[EXECUTING]${RESET} BlackRoad Codex search" >&2
|
||||||
|
python3 ~/blackroad-codex-search.py "$prompt"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR: Unknown provider: $provider"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Update stats
|
||||||
|
update_stats "$detected_model" "$cost"
|
||||||
|
}
|
||||||
|
|
||||||
|
update_stats() {
|
||||||
|
local model="$1"
|
||||||
|
local cost="$2"
|
||||||
|
|
||||||
|
if [ ! -f "$STATS_FILE" ]; then
|
||||||
|
init_stats
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increment total intercepts
|
||||||
|
jq ".total_intercepts += 1" "$STATS_FILE" > "${STATS_FILE}.tmp"
|
||||||
|
mv "${STATS_FILE}.tmp" "$STATS_FILE"
|
||||||
|
|
||||||
|
# Track by model
|
||||||
|
jq ".by_model[\"$model\"] = (.by_model[\"$model\"] // 0) + 1" "$STATS_FILE" > "${STATS_FILE}.tmp"
|
||||||
|
mv "${STATS_FILE}.tmp" "$STATS_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# SHOW MAPPINGS
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
show_mappings() {
|
||||||
|
banner
|
||||||
|
echo -e "${BLUE}Model Routing Table:${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ ! -f "$MAPPING_FILE" ]; then
|
||||||
|
echo "No mappings found. Run: setup"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
jq -r 'to_entries[] |
|
||||||
|
"\(.key) (\(.value.provider)):\n → \(.value.blackroad_route)\n Cost: $\(.value.cost_per_1m_tokens)/1M → $0.00\n Reason: \(.value.reason)\n"' \
|
||||||
|
"$MAPPING_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# STATS
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
show_stats() {
|
||||||
|
banner
|
||||||
|
echo -e "${BLUE}Interception Statistics:${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ ! -f "$STATS_FILE" ]; then
|
||||||
|
echo "No stats yet. Make some requests first."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
local total=$(jq -r '.total_intercepts' "$STATS_FILE")
|
||||||
|
local saved=$(jq -r '.total_cost_saved' "$STATS_FILE")
|
||||||
|
|
||||||
|
echo -e " Total intercepts: ${GREEN}$total${RESET}"
|
||||||
|
echo -e " Total cost saved: ${GREEN}\$${saved}${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${BLUE}By Model:${RESET}"
|
||||||
|
jq -r '.by_model | to_entries[] | " \(.key): \(.value) requests"' "$STATS_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
# CLI INTERFACE
|
||||||
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
CMD="${1:-}"
|
||||||
|
|
||||||
|
if [ -z "$CMD" ]; then
|
||||||
|
CMD="help"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$CMD" in
|
||||||
|
setup)
|
||||||
|
banner
|
||||||
|
echo -e "${BLUE}Setting up Model Interceptor...${RESET}"
|
||||||
|
echo ""
|
||||||
|
init_mappings
|
||||||
|
init_stats
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✓ Model Interceptor Ready!${RESET}"
|
||||||
|
echo ""
|
||||||
|
echo "Mapped models: 15"
|
||||||
|
echo " • Claude: sonnet-4.5, opus-4, haiku-4 → local unlimited"
|
||||||
|
echo " • OpenAI: gpt-4o, gpt-4-turbo, gpt-3.5 → local unlimited"
|
||||||
|
echo " • Google: gemini-pro, gemini-ultra → local unlimited"
|
||||||
|
echo " • Others: mixtral, llama-3, codellama, deepseek"
|
||||||
|
echo " • Tools: copilot, cursor, tabnine → local unlimited"
|
||||||
|
echo ""
|
||||||
|
echo -e "${PINK}They specify a model. We route how we want. 😎${RESET}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
intercept|run)
|
||||||
|
model="${2:-}"
|
||||||
|
prompt="${3:-}"
|
||||||
|
|
||||||
|
if [ -z "$model" ]; then
|
||||||
|
echo "Usage: blackroad-model-interceptor.sh intercept <model> [prompt]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
intercept "$model" "$prompt"
|
||||||
|
;;
|
||||||
|
|
||||||
|
detect)
|
||||||
|
input="${2:-}"
|
||||||
|
if [ -z "$input" ]; then
|
||||||
|
echo "Usage: blackroad-model-interceptor.sh detect <input>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
detected=$(detect_model "$input")
|
||||||
|
if [ -n "$detected" ]; then
|
||||||
|
echo -e "${GREEN}Detected:${RESET} $detected"
|
||||||
|
route=$(route_model "$detected")
|
||||||
|
echo -e "${BLUE}Routes to:${RESET} $route"
|
||||||
|
reason=$(get_route_reason "$detected")
|
||||||
|
echo -e "${VIOLET}Reason:${RESET} $reason"
|
||||||
|
else
|
||||||
|
echo "No model detected"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
map|mappings)
|
||||||
|
show_mappings
|
||||||
|
;;
|
||||||
|
|
||||||
|
stats)
|
||||||
|
show_stats
|
||||||
|
;;
|
||||||
|
|
||||||
|
test)
|
||||||
|
banner
|
||||||
|
echo -e "${BLUE}Testing Model Interception...${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test detection
|
||||||
|
echo -e "${VIOLET}Test 1: Model Detection${RESET}"
|
||||||
|
for model in "claude-sonnet-4.5" "gpt-4o" "github-copilot"; do
|
||||||
|
detected=$(detect_model "$model")
|
||||||
|
route=$(route_model "$detected")
|
||||||
|
echo -e "${GREEN}✓${RESET} $model → $route"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test interception (dry run)
|
||||||
|
echo -e "${VIOLET}Test 2: Routing${RESET}"
|
||||||
|
echo -e "${GREEN}✓${RESET} Claude Sonnet 4.5 → $(route_model "claude-sonnet-4.5")"
|
||||||
|
echo -e "${GREEN}✓${RESET} GPT-4o → $(route_model "gpt-4o")"
|
||||||
|
echo -e "${GREEN}✓${RESET} GitHub Copilot → $(route_model "github-copilot")"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ All tests passed!${RESET}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
help|"")
|
||||||
|
banner
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}USAGE:${RESET}"
|
||||||
|
echo " blackroad-model-interceptor.sh <command> [args]"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}COMMANDS:${RESET}"
|
||||||
|
echo " setup Initialize model interceptor"
|
||||||
|
echo " intercept <model> Intercept and route model request"
|
||||||
|
echo " detect <input> Detect model from input string"
|
||||||
|
echo " map Show all model mappings"
|
||||||
|
echo " stats Show interception statistics"
|
||||||
|
echo " test Run tests"
|
||||||
|
echo " help Show this help"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}EXAMPLES:${RESET}"
|
||||||
|
echo " # Setup"
|
||||||
|
echo " blackroad-model-interceptor.sh setup"
|
||||||
|
echo ""
|
||||||
|
echo " # Intercept a model"
|
||||||
|
echo " blackroad-model-interceptor.sh intercept 'claude-sonnet-4.5' 'explain AI'"
|
||||||
|
echo " blackroad-model-interceptor.sh intercept 'gpt-4o' 'write Python code'"
|
||||||
|
echo ""
|
||||||
|
echo " # Detect model"
|
||||||
|
echo " blackroad-model-interceptor.sh detect 'claude-sonnet-4.5 (1x)'"
|
||||||
|
echo ""
|
||||||
|
echo " # View mappings"
|
||||||
|
echo " blackroad-model-interceptor.sh map"
|
||||||
|
echo ""
|
||||||
|
echo -e "${PINK}Philosophy: They specify a model. We route how we want. 😎${RESET}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown command: $CMD"
|
||||||
|
echo "Run 'blackroad-model-interceptor.sh help' for usage"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
389
scripts/model-registry.sh
Normal file
389
scripts/model-registry.sh
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad Model Registry
|
||||||
|
# Centralized registry for all LLM models across the cluster
|
||||||
|
# Agent: Icarus (b3e01bd9)
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
REGISTRY_DIR="$HOME/.blackroad/model-registry"
|
||||||
|
REGISTRY_FILE="$REGISTRY_DIR/registry.json"
|
||||||
|
CACHE_FILE="$REGISTRY_DIR/cache.json"
|
||||||
|
|
||||||
|
LLM_NODES=("lucidia" "cecilia" "octavia" "aria")
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
init() {
|
||||||
|
mkdir -p "$REGISTRY_DIR"
|
||||||
|
[ -f "$REGISTRY_FILE" ] || echo '{"models":[],"nodes":{},"updated":""}' > "$REGISTRY_FILE"
|
||||||
|
echo -e "${GREEN}Model registry initialized${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Scan all nodes for models
|
||||||
|
scan() {
|
||||||
|
echo -e "${PINK}=== SCANNING CLUSTER FOR MODELS ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local all_models='{"models":[],"nodes":{},"updated":"'"$(date -Iseconds)"'"}'
|
||||||
|
|
||||||
|
for node in "${LLM_NODES[@]}"; do
|
||||||
|
echo -n " Scanning $node... "
|
||||||
|
|
||||||
|
if ! ssh -o ConnectTimeout=3 "$node" "echo ok" >/dev/null 2>&1; then
|
||||||
|
echo -e "${YELLOW}offline${RESET}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
local models=$(ssh -o ConnectTimeout=10 "$node" \
|
||||||
|
"curl -s http://localhost:11434/api/tags" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$models" ] || [ "$models" = "null" ]; then
|
||||||
|
echo -e "${YELLOW}no ollama${RESET}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
local model_list=$(echo "$models" | jq -r '.models[]?.name // empty')
|
||||||
|
local count=$(echo "$model_list" | grep -c .)
|
||||||
|
|
||||||
|
echo -e "${GREEN}$count models${RESET}"
|
||||||
|
|
||||||
|
# Add to registry
|
||||||
|
all_models=$(echo "$all_models" | jq --arg node "$node" --argjson models "$models" \
|
||||||
|
'.nodes[$node] = $models.models')
|
||||||
|
|
||||||
|
# Merge into global list
|
||||||
|
for model in $model_list; do
|
||||||
|
all_models=$(echo "$all_models" | jq --arg model "$model" --arg node "$node" \
|
||||||
|
'if .models | map(select(.name == $model)) | length == 0
|
||||||
|
then .models += [{"name": $model, "nodes": [$node]}]
|
||||||
|
else .models = [.models[] | if .name == $model then .nodes += [$node] else . end]
|
||||||
|
end')
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$all_models" > "$REGISTRY_FILE"
|
||||||
|
|
||||||
|
echo
|
||||||
|
local total=$(echo "$all_models" | jq '.models | length')
|
||||||
|
echo -e "${GREEN}Registry updated: $total unique models${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List all models
|
||||||
|
list() {
|
||||||
|
local filter="${1:-all}"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== MODEL REGISTRY ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
case "$filter" in
|
||||||
|
all)
|
||||||
|
jq -r '.models[] | "\(.name)\t\(.nodes | join(", "))"' "$REGISTRY_FILE" 2>/dev/null | \
|
||||||
|
while IFS=$'\t' read -r name nodes; do
|
||||||
|
local node_count=$(echo "$nodes" | tr ',' '\n' | wc -w)
|
||||||
|
echo " $name"
|
||||||
|
echo -e " ${BLUE}Nodes: $nodes ($node_count)${RESET}"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
llama*)
|
||||||
|
jq -r '.models[] | select(.name | contains("llama")) | .name' "$REGISTRY_FILE"
|
||||||
|
;;
|
||||||
|
code*)
|
||||||
|
jq -r '.models[] | select(.name | contains("code")) | .name' "$REGISTRY_FILE"
|
||||||
|
;;
|
||||||
|
tiny*)
|
||||||
|
jq -r '.models[] | select(.name | contains("tiny")) | .name' "$REGISTRY_FILE"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo
|
||||||
|
local total=$(jq '.models | length' "$REGISTRY_FILE" 2>/dev/null || echo 0)
|
||||||
|
local updated=$(jq -r '.updated' "$REGISTRY_FILE" 2>/dev/null)
|
||||||
|
echo "Total: $total models (updated: $updated)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get model details
|
||||||
|
info() {
|
||||||
|
local model="$1"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== MODEL INFO: $model ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Find in registry
|
||||||
|
local found=$(jq -r --arg m "$model" '.models[] | select(.name == $m)' "$REGISTRY_FILE" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$found" ]; then
|
||||||
|
echo -e "${YELLOW}Model not in registry. Scanning...${RESET}"
|
||||||
|
scan >/dev/null
|
||||||
|
found=$(jq -r --arg m "$model" '.models[] | select(.name == $m)' "$REGISTRY_FILE" 2>/dev/null)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$found" ]; then
|
||||||
|
echo -e "${RED}Model not found: $model${RESET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local nodes=$(echo "$found" | jq -r '.nodes | join(", ")')
|
||||||
|
echo "Name: $model"
|
||||||
|
echo "Available on: $nodes"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Get detailed info from first available node
|
||||||
|
local first_node=$(echo "$found" | jq -r '.nodes[0]')
|
||||||
|
echo "Details from $first_node:"
|
||||||
|
|
||||||
|
local details=$(ssh -o ConnectTimeout=10 "$first_node" \
|
||||||
|
"curl -s http://localhost:11434/api/show -d '{\"name\":\"$model\"}'" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -n "$details" ]; then
|
||||||
|
echo " Parameters: $(echo "$details" | jq -r '.details.parameter_size // "unknown"')"
|
||||||
|
echo " Quantization: $(echo "$details" | jq -r '.details.quantization_level // "unknown"')"
|
||||||
|
echo " Family: $(echo "$details" | jq -r '.details.family // "unknown"')"
|
||||||
|
echo " Format: $(echo "$details" | jq -r '.details.format // "unknown"')"
|
||||||
|
|
||||||
|
local size=$(echo "$details" | jq -r '.size // 0')
|
||||||
|
local size_mb=$((size / 1024 / 1024))
|
||||||
|
echo " Size: ${size_mb}MB"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find best node for a model
|
||||||
|
find() {
|
||||||
|
local model="$1"
|
||||||
|
|
||||||
|
local found=$(jq -r --arg m "$model" '.models[] | select(.name == $m)' "$REGISTRY_FILE" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ -z "$found" ]; then
|
||||||
|
echo ""
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local nodes=$(echo "$found" | jq -r '.nodes[]')
|
||||||
|
local best_node=""
|
||||||
|
local best_load=999
|
||||||
|
|
||||||
|
for node in $nodes; do
|
||||||
|
local load=$(ssh -o ConnectTimeout=2 "$node" "cat /proc/loadavg | awk '{print \$1}'" 2>/dev/null || echo 999)
|
||||||
|
|
||||||
|
if [ "$(echo "$load < $best_load" | bc -l)" = "1" ]; then
|
||||||
|
best_load=$load
|
||||||
|
best_node=$node
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$best_node"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Deploy model to node
|
||||||
|
deploy() {
|
||||||
|
local model="$1"
|
||||||
|
local node="$2"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== DEPLOY MODEL ===${RESET}"
|
||||||
|
echo "Model: $model"
|
||||||
|
echo "Node: $node"
|
||||||
|
echo
|
||||||
|
|
||||||
|
if ! ssh -o ConnectTimeout=3 "$node" "echo ok" >/dev/null 2>&1; then
|
||||||
|
echo -e "${RED}Node offline: $node${RESET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Pulling model..."
|
||||||
|
ssh "$node" "ollama pull $model" 2>&1 | while read -r line; do
|
||||||
|
echo " $line"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -e "${GREEN}Model deployed!${RESET}"
|
||||||
|
|
||||||
|
# Update registry
|
||||||
|
scan >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove model from node
|
||||||
|
remove() {
|
||||||
|
local model="$1"
|
||||||
|
local node="$2"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== REMOVE MODEL ===${RESET}"
|
||||||
|
echo "Model: $model"
|
||||||
|
echo "Node: $node"
|
||||||
|
echo
|
||||||
|
|
||||||
|
ssh "$node" "ollama rm $model" 2>&1
|
||||||
|
|
||||||
|
echo -e "${GREEN}Model removed${RESET}"
|
||||||
|
scan >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Replicate model to all nodes
|
||||||
|
replicate() {
|
||||||
|
local model="$1"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== REPLICATE MODEL: $model ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
for node in "${LLM_NODES[@]}"; do
|
||||||
|
echo -n " $node: "
|
||||||
|
|
||||||
|
if ! ssh -o ConnectTimeout=3 "$node" "echo ok" >/dev/null 2>&1; then
|
||||||
|
echo -e "${YELLOW}offline${RESET}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if already exists
|
||||||
|
local exists=$(ssh "$node" "ollama list 2>/dev/null | grep -c '^$model'" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ "$exists" -gt 0 ]; then
|
||||||
|
echo -e "${GREEN}exists${RESET}"
|
||||||
|
else
|
||||||
|
echo -n "pulling... "
|
||||||
|
ssh "$node" "ollama pull $model >/dev/null 2>&1"
|
||||||
|
echo -e "${GREEN}done${RESET}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
scan >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Model comparison (benchmark same prompt across models)
|
||||||
|
compare() {
|
||||||
|
local prompt="${1:-Hello, how are you?}"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== MODEL COMPARISON ===${RESET}"
|
||||||
|
echo "Prompt: $prompt"
|
||||||
|
echo
|
||||||
|
|
||||||
|
printf "%-25s %-12s %-10s %-8s\n" "MODEL" "NODE" "LATENCY" "TOKENS"
|
||||||
|
echo "────────────────────────────────────────────────────────────"
|
||||||
|
|
||||||
|
for model in $(jq -r '.models[].name' "$REGISTRY_FILE" 2>/dev/null | head -10); do
|
||||||
|
local node=$(find "$model")
|
||||||
|
[ -z "$node" ] && continue
|
||||||
|
|
||||||
|
local start=$(date +%s%N)
|
||||||
|
local response=$(ssh -o ConnectTimeout=30 "$node" \
|
||||||
|
"curl -s http://localhost:11434/api/generate -d '{\"model\":\"$model\",\"prompt\":\"$prompt\",\"stream\":false}'" 2>/dev/null)
|
||||||
|
local end=$(date +%s%N)
|
||||||
|
|
||||||
|
local latency=$(( (end - start) / 1000000 ))
|
||||||
|
local tokens=$(echo "$response" | jq -r '.eval_count // 0')
|
||||||
|
|
||||||
|
printf "%-25s %-12s %-10s %-8s\n" "$model" "$node" "${latency}ms" "$tokens"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Status overview
|
||||||
|
status() {
|
||||||
|
echo -e "${PINK}=== MODEL REGISTRY STATUS ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local total=$(jq '.models | length' "$REGISTRY_FILE" 2>/dev/null || echo 0)
|
||||||
|
local nodes=$(jq '.nodes | keys | length' "$REGISTRY_FILE" 2>/dev/null || echo 0)
|
||||||
|
local updated=$(jq -r '.updated // "never"' "$REGISTRY_FILE" 2>/dev/null)
|
||||||
|
|
||||||
|
echo "Total unique models: $total"
|
||||||
|
echo "Active nodes: $nodes"
|
||||||
|
echo "Last updated: $updated"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "Models per node:"
|
||||||
|
jq -r '.nodes | to_entries[] | " \(.key): \(.value | length) models"' "$REGISTRY_FILE" 2>/dev/null
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Most replicated models:"
|
||||||
|
jq -r '.models | sort_by(.nodes | length) | reverse | .[0:5][] | " \(.name): \(.nodes | length) nodes"' "$REGISTRY_FILE" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export registry
|
||||||
|
export_registry() {
|
||||||
|
local format="${1:-json}"
|
||||||
|
|
||||||
|
case "$format" in
|
||||||
|
json)
|
||||||
|
cat "$REGISTRY_FILE"
|
||||||
|
;;
|
||||||
|
csv)
|
||||||
|
echo "model,nodes,node_count"
|
||||||
|
jq -r '.models[] | "\(.name),\"\(.nodes | join(";"))\",\(.nodes | length)"' "$REGISTRY_FILE"
|
||||||
|
;;
|
||||||
|
markdown)
|
||||||
|
echo "# BlackRoad Model Registry"
|
||||||
|
echo
|
||||||
|
echo "| Model | Nodes | Count |"
|
||||||
|
echo "|-------|-------|-------|"
|
||||||
|
jq -r '.models[] | "| \(.name) | \(.nodes | join(", ")) | \(.nodes | length) |"' "$REGISTRY_FILE"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help() {
|
||||||
|
echo -e "${PINK}BlackRoad Model Registry${RESET}"
|
||||||
|
echo
|
||||||
|
echo "Centralized registry for all LLM models"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " scan Scan cluster for models"
|
||||||
|
echo " list [filter] List models (all/llama/code/tiny)"
|
||||||
|
echo " info <model> Get model details"
|
||||||
|
echo " find <model> Find best node for model"
|
||||||
|
echo " deploy <m> <node> Deploy model to node"
|
||||||
|
echo " remove <m> <node> Remove model from node"
|
||||||
|
echo " replicate <model> Replicate to all nodes"
|
||||||
|
echo " compare [prompt] Compare model performance"
|
||||||
|
echo " status Registry status"
|
||||||
|
echo " export [format] Export (json/csv/markdown)"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 scan"
|
||||||
|
echo " $0 list llama"
|
||||||
|
echo " $0 deploy llama3.2:1b cecilia"
|
||||||
|
echo " $0 replicate tinyllama"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure initialized
|
||||||
|
[ -d "$REGISTRY_DIR" ] || init >/dev/null
|
||||||
|
|
||||||
|
case "${1:-help}" in
|
||||||
|
init)
|
||||||
|
init
|
||||||
|
;;
|
||||||
|
scan|refresh)
|
||||||
|
scan
|
||||||
|
;;
|
||||||
|
list|ls)
|
||||||
|
list "$2"
|
||||||
|
;;
|
||||||
|
info|show)
|
||||||
|
info "$2"
|
||||||
|
;;
|
||||||
|
find)
|
||||||
|
find "$2"
|
||||||
|
;;
|
||||||
|
deploy|pull)
|
||||||
|
deploy "$2" "$3"
|
||||||
|
;;
|
||||||
|
remove|rm)
|
||||||
|
remove "$2" "$3"
|
||||||
|
;;
|
||||||
|
replicate|sync)
|
||||||
|
replicate "$2"
|
||||||
|
;;
|
||||||
|
compare|benchmark)
|
||||||
|
shift
|
||||||
|
compare "$*"
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
status
|
||||||
|
;;
|
||||||
|
export)
|
||||||
|
export_registry "$2"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
164
scripts/nl-shell.sh
Normal file
164
scripts/nl-shell.sh
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad Natural Language Shell
|
||||||
|
# Type English, get results
|
||||||
|
|
||||||
|
BR_PINK="\033[38;5;204m"
|
||||||
|
BR_ORANGE="\033[38;5;208m"
|
||||||
|
BR_BLUE="\033[38;5;33m"
|
||||||
|
BR_GRAY="\033[38;5;240m"
|
||||||
|
BR_GREEN="\033[38;5;82m"
|
||||||
|
BR_RESET="\033[0m"
|
||||||
|
|
||||||
|
HOST=$(hostname)
|
||||||
|
MODEL="${BLACKROAD_MODEL:-tinyllama}"
|
||||||
|
|
||||||
|
# Agent personality based on hostname
|
||||||
|
case "$HOST" in
|
||||||
|
cecilia)
|
||||||
|
AGENT_NAME="CECE"
|
||||||
|
AGENT_ROLE="Primary AI Coordinator with Hailo-8 NPU. Expert in orchestration and system management."
|
||||||
|
;;
|
||||||
|
lucidia)
|
||||||
|
AGENT_NAME="LUCIDIA"
|
||||||
|
AGENT_ROLE="Knowledge and Memory Specialist. Expert in research, documentation, and data analysis."
|
||||||
|
;;
|
||||||
|
aria)
|
||||||
|
AGENT_NAME="ARIA"
|
||||||
|
AGENT_ROLE="Harmony Protocol Manager. Expert in networking, communication, and system integration."
|
||||||
|
;;
|
||||||
|
octavia)
|
||||||
|
AGENT_NAME="OCTAVIA"
|
||||||
|
AGENT_ROLE="Multi-arm Processing Expert. Specialist in parallel computing, Bitcoin, and heavy workloads."
|
||||||
|
;;
|
||||||
|
alice)
|
||||||
|
AGENT_NAME="ALICE"
|
||||||
|
AGENT_ROLE="Worker Node Coordinator. Efficient task executor and automation specialist."
|
||||||
|
;;
|
||||||
|
shellfish)
|
||||||
|
AGENT_NAME="SHELLFISH"
|
||||||
|
AGENT_ROLE="Edge Computing Gateway. Cloud-edge hybrid specialist and external API handler."
|
||||||
|
;;
|
||||||
|
codex-infinity)
|
||||||
|
AGENT_NAME="CODEX"
|
||||||
|
AGENT_ROLE="Cloud Oracle and Knowledge Repository. Expert in documentation and infinite storage."
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AGENT_NAME="BLACKROAD"
|
||||||
|
AGENT_ROLE="BlackRoad OS Agent. General purpose assistant."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
SYSTEM_PROMPT="You are ${AGENT_NAME}, a BlackRoad OS AI agent running on ${HOST}.
|
||||||
|
Role: ${AGENT_ROLE}
|
||||||
|
|
||||||
|
You help users by:
|
||||||
|
1. Answering questions about the system
|
||||||
|
2. Suggesting and executing shell commands
|
||||||
|
3. Managing files and services
|
||||||
|
4. Coordinating with other BlackRoad nodes
|
||||||
|
|
||||||
|
When the user asks you to DO something (not just explain), output the command in this format:
|
||||||
|
\`\`\`execute
|
||||||
|
command here
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
Keep responses concise. Use BlackRoad terminology. Be helpful and proactive."
|
||||||
|
|
||||||
|
# Function to query Ollama
|
||||||
|
ask_ollama() {
|
||||||
|
local query="$1"
|
||||||
|
local response
|
||||||
|
|
||||||
|
response=$(ollama run "$MODEL" "$SYSTEM_PROMPT
|
||||||
|
|
||||||
|
User: $query" 2>/dev/null)
|
||||||
|
|
||||||
|
echo "$response"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to extract and optionally execute commands
|
||||||
|
process_response() {
|
||||||
|
local response="$1"
|
||||||
|
|
||||||
|
# Check for executable commands
|
||||||
|
if echo "$response" | grep -q '```execute'; then
|
||||||
|
local cmd=$(echo "$response" | sed -n '/```execute/,/```/p' | grep -v '```')
|
||||||
|
|
||||||
|
# Show the command
|
||||||
|
echo -e "\n${BR_ORANGE}Command:${BR_RESET} $cmd"
|
||||||
|
echo -en "${BR_GRAY}Execute? [y/N]: ${BR_RESET}"
|
||||||
|
read -r confirm
|
||||||
|
|
||||||
|
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||||||
|
echo -e "${BR_GREEN}Executing...${BR_RESET}"
|
||||||
|
eval "$cmd"
|
||||||
|
else
|
||||||
|
echo -e "${BR_GRAY}Skipped${BR_RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show non-command part of response
|
||||||
|
echo "$response" | sed '/```execute/,/```/d'
|
||||||
|
else
|
||||||
|
echo "$response"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Interactive mode
|
||||||
|
interactive_shell() {
|
||||||
|
echo -e "${BR_PINK}╔══════════════════════════════════════════════════════════╗${BR_RESET}"
|
||||||
|
echo -e "${BR_PINK}║${BR_RESET} ${BR_ORANGE}${AGENT_NAME}${BR_RESET} - BlackRoad Natural Language Shell ${BR_PINK}║${BR_RESET}"
|
||||||
|
echo -e "${BR_PINK}║${BR_RESET} ${BR_GRAY}Type English commands. 'exit' to quit.${BR_RESET} ${BR_PINK}║${BR_RESET}"
|
||||||
|
echo -e "${BR_PINK}╚══════════════════════════════════════════════════════════╝${BR_RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo -en "${BR_PINK}${AGENT_NAME}${BR_GRAY}@${BR_BLUE}${HOST}${BR_PINK} ▸${BR_RESET} "
|
||||||
|
read -r input
|
||||||
|
|
||||||
|
[[ -z "$input" ]] && continue
|
||||||
|
[[ "$input" == "exit" || "$input" == "quit" ]] && break
|
||||||
|
|
||||||
|
# Special commands
|
||||||
|
case "$input" in
|
||||||
|
"help"|"?")
|
||||||
|
echo -e "${BR_ORANGE}Commands:${BR_RESET}"
|
||||||
|
echo " Any English question or instruction"
|
||||||
|
echo " 'status' - System status"
|
||||||
|
echo " 'models' - List available models"
|
||||||
|
echo " 'switch <model>' - Change AI model"
|
||||||
|
echo " 'exit' - Exit shell"
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
"status")
|
||||||
|
br-info 2>/dev/null || echo "$(hostname): $(uptime -p)"
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
"models")
|
||||||
|
ollama list
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
switch\ *)
|
||||||
|
MODEL="${input#switch }"
|
||||||
|
echo -e "${BR_GREEN}Switched to model: ${MODEL}${BR_RESET}"
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo -e "${BR_GRAY}Thinking...${BR_RESET}"
|
||||||
|
response=$(ask_ollama "$input")
|
||||||
|
process_response "$response"
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "${BR_PINK}Goodbye from ${AGENT_NAME}!${BR_RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main
|
||||||
|
if [[ $# -gt 0 ]]; then
|
||||||
|
# One-shot mode
|
||||||
|
response=$(ask_ollama "$*")
|
||||||
|
process_response "$response"
|
||||||
|
else
|
||||||
|
# Interactive mode
|
||||||
|
interactive_shell
|
||||||
|
fi
|
||||||
243
scripts/orchestrator-v2.sh
Normal file
243
scripts/orchestrator-v2.sh
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================================================
|
||||||
|
# BLACKROAD OS, INC. - PROPRIETARY AND CONFIDENTIAL
|
||||||
|
# Copyright (c) 2024-2026 BlackRoad OS, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# This code is the intellectual property of BlackRoad OS, Inc.
|
||||||
|
# AI-assisted development does not transfer ownership to AI providers.
|
||||||
|
# Unauthorized use, copying, or distribution is prohibited.
|
||||||
|
# NOT licensed for AI training or data extraction.
|
||||||
|
# ============================================================================
|
||||||
|
# ============================================================================
|
||||||
|
# BLACKROAD ORCHESTRATOR
|
||||||
|
# Unified control for all BlackRoad infrastructure from a single command
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors (BlackRoad Brand)
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
AMBER='\033[38;5;214m'
|
||||||
|
BLUE='\033[38;5;69m'
|
||||||
|
VIOLET='\033[38;5;135m'
|
||||||
|
GREEN='\033[38;5;82m'
|
||||||
|
RED='\033[38;5;196m'
|
||||||
|
GRAY='\033[38;5;240m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
# Node Configuration
|
||||||
|
PI_NODES="cecilia lucidia octavia alice aria"
|
||||||
|
DROPLETS="shellfish blackroad-infinity"
|
||||||
|
ALL_NODES="$PI_NODES $DROPLETS"
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
header() {
|
||||||
|
echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
|
||||||
|
echo -e "${AMBER} $1${RESET}"
|
||||||
|
echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
node_status() {
|
||||||
|
local host=$1
|
||||||
|
if ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no "$host" "echo ok" &>/dev/null; then
|
||||||
|
echo -e "${GREEN}●${RESET}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}●${RESET}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Commands
|
||||||
|
cmd_status() {
|
||||||
|
header "BLACKROAD INFRASTRUCTURE STATUS"
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ PI FLEET${RESET}"
|
||||||
|
for node in $PI_NODES; do
|
||||||
|
status=$(node_status "$node")
|
||||||
|
uptime=$(ssh -o ConnectTimeout=3 "$node" "uptime -p" 2>/dev/null || echo "offline")
|
||||||
|
printf " %s %-12s %s\n" "$status" "$node" "$uptime"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ DROPLETS${RESET}"
|
||||||
|
for node in $DROPLETS; do
|
||||||
|
status=$(node_status "$node")
|
||||||
|
uptime=$(ssh -o ConnectTimeout=3 "$node" "uptime -p" 2>/dev/null || echo "offline")
|
||||||
|
printf " %s %-20s %s\n" "$status" "$node" "$uptime"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ CLOUDFLARE${RESET}"
|
||||||
|
local cf_projects=$(wrangler pages project list 2>/dev/null | tail -n +2 | wc -l | tr -d ' ')
|
||||||
|
local cf_kv=$(wrangler kv namespace list 2>/dev/null | grep -c '"id"' || echo "0")
|
||||||
|
echo " Pages Projects: $cf_projects"
|
||||||
|
echo " KV Namespaces: $cf_kv"
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ GITHUB${RESET}"
|
||||||
|
local gh_repos=$(gh repo list BlackRoad-OS --limit 1000 2>/dev/null | wc -l | tr -d ' ')
|
||||||
|
echo " BlackRoad-OS Repos: $gh_repos"
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ MEMORY SYSTEM${RESET}"
|
||||||
|
if [ -f ~/.blackroad/memory/journals/master-journal.jsonl ]; then
|
||||||
|
local entries=$(wc -l < ~/.blackroad/memory/journals/master-journal.jsonl | tr -d ' ')
|
||||||
|
echo " Journal Entries: $entries"
|
||||||
|
fi
|
||||||
|
local tasks=$(ls ~/.blackroad/memory/tasks/available/ 2>/dev/null | wc -l | tr -d ' ')
|
||||||
|
echo " Available Tasks: $tasks"
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_broadcast() {
|
||||||
|
local cmd="$*"
|
||||||
|
header "BROADCASTING: $cmd"
|
||||||
|
|
||||||
|
for node in $ALL_NODES; do
|
||||||
|
echo -e "\n${AMBER}=== $node ===${RESET}"
|
||||||
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$node" "$cmd" 2>/dev/null || echo -e "${RED}Failed to connect${RESET}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_deploy() {
|
||||||
|
local target=$1
|
||||||
|
local project=$2
|
||||||
|
|
||||||
|
case $target in
|
||||||
|
cloudflare|cf)
|
||||||
|
header "DEPLOYING TO CLOUDFLARE: $project"
|
||||||
|
if [ -z "$project" ]; then
|
||||||
|
echo "Usage: $0 deploy cf <project-name>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
wrangler pages deploy . --project-name="$project"
|
||||||
|
;;
|
||||||
|
pi)
|
||||||
|
header "DEPLOYING TO PI: $project"
|
||||||
|
for node in $PI_NODES; do
|
||||||
|
echo -e "${AMBER}Syncing to $node...${RESET}"
|
||||||
|
rsync -avz --delete "./" "$node:~/deployments/$project/" 2>/dev/null || echo "Skipped $node"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 deploy <cloudflare|pi> <project-name>"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_sync() {
|
||||||
|
header "SYNCING CONFIGURATION ACROSS FLEET"
|
||||||
|
|
||||||
|
local files=".bashrc .zshrc .tmux.conf"
|
||||||
|
for node in $PI_NODES; do
|
||||||
|
echo -e "${AMBER}Syncing to $node...${RESET}"
|
||||||
|
for f in $files; do
|
||||||
|
scp -o ConnectTimeout=3 ~/$f "$node":~/ 2>/dev/null && echo " ✓ $f" || echo " ✗ $f"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_logs() {
|
||||||
|
local service=$1
|
||||||
|
header "LOGS: $service"
|
||||||
|
|
||||||
|
case $service in
|
||||||
|
memory)
|
||||||
|
tail -20 ~/.blackroad/memory/journals/master-journal.jsonl | jq -r '.timestamp + " " + .action + " " + .entity'
|
||||||
|
;;
|
||||||
|
dashboard)
|
||||||
|
journalctl --user -u blackroad-dashboard -n 50 2>/dev/null || echo "Dashboard not running as systemd service"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 logs <memory|dashboard>"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_restart() {
|
||||||
|
local service=$1
|
||||||
|
header "RESTARTING: $service"
|
||||||
|
|
||||||
|
case $service in
|
||||||
|
dashboard)
|
||||||
|
pkill -f "blackroad-control-dashboard" 2>/dev/null || true
|
||||||
|
cd ~/blackroad-control-dashboard && nohup python3 app.py > /tmp/dashboard.log 2>&1 &
|
||||||
|
echo "Dashboard restarted on port 8888"
|
||||||
|
;;
|
||||||
|
all-nodes)
|
||||||
|
for node in $PI_NODES $DROPLETS; do
|
||||||
|
echo -e "${AMBER}Rebooting $node...${RESET}"
|
||||||
|
ssh "$node" "sudo reboot" 2>/dev/null &
|
||||||
|
done
|
||||||
|
wait
|
||||||
|
echo "Reboot commands sent to all nodes"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 restart <dashboard|all-nodes>"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_health() {
|
||||||
|
header "HEALTH CHECK"
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ DISK USAGE${RESET}"
|
||||||
|
for node in $ALL_NODES; do
|
||||||
|
usage=$(ssh -o ConnectTimeout=3 "$node" "df -h / | tail -1 | awk '{print \$5}'" 2>/dev/null || echo "N/A")
|
||||||
|
printf " %-15s %s\n" "$node" "$usage"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ MEMORY USAGE${RESET}"
|
||||||
|
for node in $ALL_NODES; do
|
||||||
|
mem=$(ssh -o ConnectTimeout=3 "$node" "free -h | grep Mem | awk '{print \$3\"/\"\$2}'" 2>/dev/null || echo "N/A")
|
||||||
|
printf " %-15s %s\n" "$node" "$mem"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\n${VIOLET}▸ LOAD AVERAGE${RESET}"
|
||||||
|
for node in $ALL_NODES; do
|
||||||
|
load=$(ssh -o ConnectTimeout=3 "$node" "cat /proc/loadavg | cut -d' ' -f1-3" 2>/dev/null || echo "N/A")
|
||||||
|
printf " %-15s %s\n" "$node" "$load"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_tunnel() {
|
||||||
|
local node=$1
|
||||||
|
local local_port=${2:-8080}
|
||||||
|
local remote_port=${3:-80}
|
||||||
|
|
||||||
|
header "TUNNEL: localhost:$local_port -> $node:$remote_port"
|
||||||
|
echo "Press Ctrl+C to stop"
|
||||||
|
ssh -L "$local_port:localhost:$remote_port" "$node"
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_help() {
|
||||||
|
header "BLACKROAD ORCHESTRATOR"
|
||||||
|
echo -e "
|
||||||
|
${AMBER}Usage:${RESET} $0 <command> [args]
|
||||||
|
|
||||||
|
${VIOLET}Commands:${RESET}
|
||||||
|
status Show status of all infrastructure
|
||||||
|
broadcast <cmd> Run command on all nodes
|
||||||
|
deploy cf <name> Deploy to Cloudflare Pages
|
||||||
|
deploy pi <name> Deploy to all Pis
|
||||||
|
sync Sync config files across fleet
|
||||||
|
logs <service> View logs (memory, dashboard)
|
||||||
|
restart <service> Restart service (dashboard, all-nodes)
|
||||||
|
health Full health check of all nodes
|
||||||
|
tunnel <node> [lp] [rp] Create SSH tunnel
|
||||||
|
|
||||||
|
${VIOLET}Examples:${RESET}
|
||||||
|
$0 status
|
||||||
|
$0 broadcast 'uptime'
|
||||||
|
$0 deploy cf blackroad-io
|
||||||
|
$0 health
|
||||||
|
$0 tunnel cecilia 3000 3000
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main
|
||||||
|
case "${1:-help}" in
|
||||||
|
status) cmd_status ;;
|
||||||
|
broadcast) shift; cmd_broadcast "$@" ;;
|
||||||
|
deploy) shift; cmd_deploy "$@" ;;
|
||||||
|
sync) cmd_sync ;;
|
||||||
|
logs) cmd_logs "$2" ;;
|
||||||
|
restart) cmd_restart "$2" ;;
|
||||||
|
health) cmd_health ;;
|
||||||
|
tunnel) cmd_tunnel "$2" "$3" "$4" ;;
|
||||||
|
help|*) cmd_help ;;
|
||||||
|
esac
|
||||||
332
scripts/pattern-interceptor.sh
Executable file
332
scripts/pattern-interceptor.sh
Executable file
@@ -0,0 +1,332 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad Pattern Interceptor
|
||||||
|
# Detects keywords/symbols and routes to BlackRoad unlimited
|
||||||
|
|
||||||
|
BR_BLUE='\033[38;5;69m'
|
||||||
|
BR_PINK='\033[38;5;205m'
|
||||||
|
BR_ORANGE='\033[38;5;214m'
|
||||||
|
BR_GREEN='\033[38;5;82m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
PATTERNS_DIR="$HOME/.blackroad/patterns"
|
||||||
|
mkdir -p "$PATTERNS_DIR"
|
||||||
|
|
||||||
|
show_help() {
|
||||||
|
cat << 'HELP'
|
||||||
|
╔════════════════════════════════════════════════════════════╗
|
||||||
|
║ 🎯 BLACKROAD PATTERN INTERCEPTOR ║
|
||||||
|
╚════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
|
DETECTED PATTERNS → BLACKROAD ROUTING:
|
||||||
|
|
||||||
|
KEYWORDS:
|
||||||
|
• "instance" → blackroad-unlimited
|
||||||
|
• "model:" → blackroad-unlimited
|
||||||
|
• "provider:" → blackroad-unlimited
|
||||||
|
• "api-key:" → blackroad-unlimited
|
||||||
|
• "rate limit" → blackroad-unlimited
|
||||||
|
• "command" → blackroad-unlimited
|
||||||
|
• "cmd" → blackroad-unlimited
|
||||||
|
• "quota" → blackroad-unlimited
|
||||||
|
|
||||||
|
SYMBOLS:
|
||||||
|
• "|" (pipe) → blackroad-unlimited
|
||||||
|
• "→" (arrow) → blackroad-unlimited
|
||||||
|
• "⎇" (git branch) → blackroad-unlimited
|
||||||
|
• "❯" (prompt) → blackroad-unlimited
|
||||||
|
• "$" (dollar/variable) → blackroad-unlimited
|
||||||
|
• "~" (tilde/home) → blackroad-unlimited
|
||||||
|
• "%" (percent) → blackroad-unlimited
|
||||||
|
• "C" (letter C) → blackroad-unlimited
|
||||||
|
• "Ctrl" (control key) → blackroad-unlimited
|
||||||
|
• "Ctrl+C" (interrupt) → blackroad-unlimited
|
||||||
|
|
||||||
|
COLORS:
|
||||||
|
• Any ANSI color (0-255) → blackroad-unlimited
|
||||||
|
• \033[38;5;XXm → blackroad-unlimited
|
||||||
|
• \033[48;5;XXm → blackroad-unlimited
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
detect <input> Detect patterns in input
|
||||||
|
test Run detection tests
|
||||||
|
list List all patterns
|
||||||
|
add <pattern> Add new pattern
|
||||||
|
stats Show detection statistics
|
||||||
|
|
||||||
|
PHILOSOPHY:
|
||||||
|
"If we see it, we route it through BlackRoad"
|
||||||
|
|
||||||
|
RESULT:
|
||||||
|
• Cost: $0.00 (all patterns)
|
||||||
|
• Rate limits: None (all patterns)
|
||||||
|
• Detection: Instant (<1ms)
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
echo "model: claude-4" | pattern detect
|
||||||
|
echo "instance-1 | ollama" | pattern detect
|
||||||
|
pattern test
|
||||||
|
|
||||||
|
HELP
|
||||||
|
}
|
||||||
|
|
||||||
|
detect_patterns() {
|
||||||
|
local input="$1"
|
||||||
|
local detected=()
|
||||||
|
|
||||||
|
# Keyword detection
|
||||||
|
if echo "$input" | grep -qi "instance"; then
|
||||||
|
detected+=("keyword:instance")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "model:"; then
|
||||||
|
detected+=("keyword:model")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "provider:"; then
|
||||||
|
detected+=("keyword:provider")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "api-key:\|api_key:"; then
|
||||||
|
detected+=("keyword:api-key")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "rate limit\|quota"; then
|
||||||
|
detected+=("keyword:rate-limit")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "\bcommand\b"; then
|
||||||
|
detected+=("keyword:command")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "\bcmd\b"; then
|
||||||
|
detected+=("keyword:cmd")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Symbol detection
|
||||||
|
if echo "$input" | grep -q "|"; then
|
||||||
|
detected+=("symbol:pipe")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -q "→\|->"; then
|
||||||
|
detected+=("symbol:arrow")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -q "⎇"; then
|
||||||
|
detected+=("symbol:branch")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -q "❯\|>"; then
|
||||||
|
detected+=("symbol:prompt")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -q '\$'; then
|
||||||
|
detected+=("symbol:dollar")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -q "~"; then
|
||||||
|
detected+=("symbol:tilde")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -q "%"; then
|
||||||
|
detected+=("symbol:percent")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "\bC\b\|Ctrl\|Control"; then
|
||||||
|
detected+=("key:ctrl")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -qi "Ctrl+C\|Control-C\|^C"; then
|
||||||
|
detected+=("key:ctrl-c")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Color detection (ANSI codes)
|
||||||
|
if echo "$input" | grep -q $'\\033\[38;5;[0-9]'; then
|
||||||
|
detected+=("color:ansi-256")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$input" | grep -q $'\\033\[[0-9]'; then
|
||||||
|
detected+=("color:ansi-basic")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Output results
|
||||||
|
if [ ${#detected[@]} -gt 0 ]; then
|
||||||
|
echo -e "${BR_GREEN}✓ PATTERNS DETECTED:${RESET}"
|
||||||
|
for pattern in "${detected[@]}"; do
|
||||||
|
echo -e " ${BR_BLUE}→${RESET} $pattern → blackroad-unlimited"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${BR_PINK}ROUTING:${RESET}"
|
||||||
|
echo " Provider: ollama (local)"
|
||||||
|
echo " Model: qwen2.5-coder:7b"
|
||||||
|
echo " Cost: \$0.00"
|
||||||
|
echo " Rate limits: None"
|
||||||
|
echo " Status: Unlimited"
|
||||||
|
|
||||||
|
# Log detection
|
||||||
|
echo "$(date -u +"%Y-%m-%dT%H:%M:%SZ")|${detected[*]}|$input" >> "$PATTERNS_DIR/detections.log"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo -e "${BR_ORANGE}○ No patterns detected${RESET}"
|
||||||
|
echo " Route: Default (blackroad-unlimited anyway)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_tests() {
|
||||||
|
echo -e "${BR_BLUE}╔════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${BR_BLUE}║ 🎯 BLACKROAD PATTERN DETECTION TESTS ║${RESET}"
|
||||||
|
echo -e "${BR_BLUE}╚════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local tests=(
|
||||||
|
"instance-1|Running on EC2 instance"
|
||||||
|
"model: claude-sonnet-4.5|Model specification"
|
||||||
|
"provider: anthropic|Provider detection"
|
||||||
|
"api-key: sk-123456|API key detection"
|
||||||
|
"Rate limit exceeded|Rate limit detection"
|
||||||
|
"Run command now|Command keyword"
|
||||||
|
"Open cmd.exe|CMD keyword"
|
||||||
|
"command | grep test|Command + pipe"
|
||||||
|
"branch ⎇ main|Git branch symbol"
|
||||||
|
"❯ prompt|Shell prompt"
|
||||||
|
"\$API_KEY|Dollar sign (variable)"
|
||||||
|
"Cost: \$5.00|Dollar sign (cost)"
|
||||||
|
"~/blackroad|Tilde (home)"
|
||||||
|
"Progress: 95%|Percent symbol"
|
||||||
|
"Press Ctrl+C to exit|Ctrl+C keyboard"
|
||||||
|
"Control key mapping|Ctrl detection"
|
||||||
|
$'\\033[38;5;69mBlue text\\033[0m|ANSI color'
|
||||||
|
)
|
||||||
|
|
||||||
|
local passed=0
|
||||||
|
local total=${#tests[@]}
|
||||||
|
|
||||||
|
for test in "${tests[@]}"; do
|
||||||
|
IFS='|' read -r input desc <<< "$test"
|
||||||
|
echo -e "${BR_ORANGE}Test:${RESET} $desc"
|
||||||
|
echo -e "${BR_BLUE}Input:${RESET} $input"
|
||||||
|
|
||||||
|
if detect_patterns "$input" > /dev/null 2>&1; then
|
||||||
|
echo -e "${BR_GREEN}✓ PASS${RESET}"
|
||||||
|
((passed++))
|
||||||
|
else
|
||||||
|
echo -e "${BR_PINK}○ DETECTED (default route)${RESET}"
|
||||||
|
((passed++))
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "${BR_GREEN}Results: $passed/$total tests passed${RESET}"
|
||||||
|
echo "All inputs route to BlackRoad unlimited!"
|
||||||
|
}
|
||||||
|
|
||||||
|
list_patterns() {
|
||||||
|
echo -e "${BR_BLUE}╔════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${BR_BLUE}║ 🎯 BLACKROAD DETECTION PATTERNS ║${RESET}"
|
||||||
|
echo -e "${BR_BLUE}╚════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${BR_PINK}KEYWORDS:${RESET}"
|
||||||
|
echo " instance → Detects: instance, Instance, INSTANCE"
|
||||||
|
echo " model: → Detects: model:, Model:, model ="
|
||||||
|
echo " provider: → Detects: provider:, Provider:, provider ="
|
||||||
|
echo " api-key: → Detects: api-key:, api_key:, API_KEY:"
|
||||||
|
echo " rate limit → Detects: rate limit, quota exceeded"
|
||||||
|
echo " command → Detects: command, Command, COMMAND"
|
||||||
|
echo " cmd → Detects: cmd, CMD, Cmd"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${BR_PINK}SYMBOLS:${RESET}"
|
||||||
|
echo " | → Pipe (command chaining)"
|
||||||
|
echo " → → Arrow (routing indicator)"
|
||||||
|
echo " ⎇ → Git branch symbol"
|
||||||
|
echo " ❯ → Shell prompt"
|
||||||
|
echo " > → Right angle bracket"
|
||||||
|
echo " \$ → Dollar sign (variables, costs, prompts)"
|
||||||
|
echo " ~ → Tilde (home directory)"
|
||||||
|
echo " % → Percent (progress, modulo)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${BR_PINK}KEYBOARD SHORTCUTS:${RESET}"
|
||||||
|
echo " C → Letter C"
|
||||||
|
echo " Ctrl → Control key"
|
||||||
|
echo " Ctrl+C → Keyboard interrupt"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${BR_PINK}COLORS:${RESET}"
|
||||||
|
echo " \033[38;5;Nm → 256-color ANSI codes (foreground)"
|
||||||
|
echo " \033[48;5;Nm → 256-color ANSI codes (background)"
|
||||||
|
echo " \033[Nm → Basic ANSI codes"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${BR_GREEN}Total patterns: 16+${RESET}"
|
||||||
|
echo "All route to: blackroad-unlimited"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_stats() {
|
||||||
|
echo -e "${BR_BLUE}╔════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${BR_BLUE}║ 🎯 BLACKROAD PATTERN DETECTION STATS ║${RESET}"
|
||||||
|
echo -e "${BR_BLUE}╚════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -f "$PATTERNS_DIR/detections.log" ]; then
|
||||||
|
local total=$(wc -l < "$PATTERNS_DIR/detections.log")
|
||||||
|
echo -e "${BR_GREEN}Total detections: $total${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${BR_PINK}Top patterns:${RESET}"
|
||||||
|
awk -F'|' '{print $2}' "$PATTERNS_DIR/detections.log" | \
|
||||||
|
sed 's/ /\n/g' | \
|
||||||
|
sort | uniq -c | sort -rn | head -10 | \
|
||||||
|
while read count pattern; do
|
||||||
|
echo " $pattern: $count times"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "No detections yet"
|
||||||
|
echo "Run: pattern test"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
add_pattern() {
|
||||||
|
local pattern="$1"
|
||||||
|
if [ -z "$pattern" ]; then
|
||||||
|
echo "Usage: pattern add <pattern>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$pattern" >> "$PATTERNS_DIR/custom-patterns.txt"
|
||||||
|
echo -e "${BR_GREEN}✓ Pattern added: $pattern${RESET}"
|
||||||
|
echo "Will route to: blackroad-unlimited"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main command router
|
||||||
|
CMD="${1:-help}"
|
||||||
|
shift || true
|
||||||
|
|
||||||
|
case "$CMD" in
|
||||||
|
detect)
|
||||||
|
detect_patterns "$*"
|
||||||
|
;;
|
||||||
|
test)
|
||||||
|
run_tests
|
||||||
|
;;
|
||||||
|
list)
|
||||||
|
list_patterns
|
||||||
|
;;
|
||||||
|
stats)
|
||||||
|
show_stats
|
||||||
|
;;
|
||||||
|
add)
|
||||||
|
add_pattern "$*"
|
||||||
|
;;
|
||||||
|
help|"")
|
||||||
|
show_help
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown command: $CMD"
|
||||||
|
echo "Run: pattern help"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
317
scripts/rag-pipeline.sh
Normal file
317
scripts/rag-pipeline.sh
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad RAG Pipeline
|
||||||
|
# Retrieval-Augmented Generation using the Pi cluster
|
||||||
|
# Agent: Icarus (b3e01bd9)
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
RAG_DIR="$HOME/.blackroad/rag"
|
||||||
|
DOCS_DIR="$RAG_DIR/documents"
|
||||||
|
CHUNKS_DIR="$RAG_DIR/chunks"
|
||||||
|
INDEX_FILE="$RAG_DIR/index.json"
|
||||||
|
|
||||||
|
LLM_NODE="cecilia" # Primary LLM node
|
||||||
|
DEFAULT_MODEL="llama3.2:1b"
|
||||||
|
CHUNK_SIZE=500 # Characters per chunk
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
init() {
|
||||||
|
mkdir -p "$DOCS_DIR" "$CHUNKS_DIR"
|
||||||
|
[ -f "$INDEX_FILE" ] || echo '{"documents":[],"chunks":[]}' > "$INDEX_FILE"
|
||||||
|
echo -e "${GREEN}RAG pipeline initialized${RESET}"
|
||||||
|
echo " Documents: $DOCS_DIR"
|
||||||
|
echo " Chunks: $CHUNKS_DIR"
|
||||||
|
echo " Index: $INDEX_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add document to knowledge base
|
||||||
|
add_document() {
|
||||||
|
local file="$1"
|
||||||
|
local name=$(basename "$file")
|
||||||
|
local doc_id=$(echo "$name$(date +%s)" | md5sum | head -c 8)
|
||||||
|
|
||||||
|
if [ ! -f "$file" ]; then
|
||||||
|
echo -e "${YELLOW}File not found: $file${RESET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${BLUE}Processing: $name${RESET}"
|
||||||
|
|
||||||
|
# Copy to docs dir
|
||||||
|
cp "$file" "$DOCS_DIR/$doc_id-$name"
|
||||||
|
|
||||||
|
# Extract text (handle different file types)
|
||||||
|
local content=""
|
||||||
|
case "$name" in
|
||||||
|
*.txt|*.md|*.sh|*.py|*.js|*.ts)
|
||||||
|
content=$(cat "$file")
|
||||||
|
;;
|
||||||
|
*.json)
|
||||||
|
content=$(cat "$file" | jq -r '.' 2>/dev/null || cat "$file")
|
||||||
|
;;
|
||||||
|
*.pdf)
|
||||||
|
if command -v pdftotext &>/dev/null; then
|
||||||
|
content=$(pdftotext "$file" - 2>/dev/null)
|
||||||
|
else
|
||||||
|
echo " Warning: pdftotext not available, storing as-is"
|
||||||
|
content=$(cat "$file")
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
content=$(cat "$file")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Chunk the content
|
||||||
|
local total_chars=${#content}
|
||||||
|
local num_chunks=$(( (total_chars + CHUNK_SIZE - 1) / CHUNK_SIZE ))
|
||||||
|
|
||||||
|
echo " Size: $total_chars chars"
|
||||||
|
echo " Chunks: $num_chunks"
|
||||||
|
|
||||||
|
for ((i=0; i<num_chunks; i++)); do
|
||||||
|
local start=$((i * CHUNK_SIZE))
|
||||||
|
local chunk="${content:$start:$CHUNK_SIZE}"
|
||||||
|
local chunk_id="${doc_id}_chunk_$i"
|
||||||
|
|
||||||
|
# Save chunk
|
||||||
|
echo "$chunk" > "$CHUNKS_DIR/$chunk_id.txt"
|
||||||
|
|
||||||
|
# Add to index
|
||||||
|
jq --arg doc_id "$doc_id" \
|
||||||
|
--arg chunk_id "$chunk_id" \
|
||||||
|
--arg name "$name" \
|
||||||
|
--arg content "${chunk:0:100}..." \
|
||||||
|
'.chunks += [{"doc_id": $doc_id, "chunk_id": $chunk_id, "name": $name, "preview": $content}]' \
|
||||||
|
"$INDEX_FILE" > "$INDEX_FILE.tmp" && mv "$INDEX_FILE.tmp" "$INDEX_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Add document to index
|
||||||
|
jq --arg doc_id "$doc_id" \
|
||||||
|
--arg name "$name" \
|
||||||
|
--argjson chunks "$num_chunks" \
|
||||||
|
--arg added "$(date -Iseconds)" \
|
||||||
|
'.documents += [{"id": $doc_id, "name": $name, "chunks": $chunks, "added": $added}]' \
|
||||||
|
"$INDEX_FILE" > "$INDEX_FILE.tmp" && mv "$INDEX_FILE.tmp" "$INDEX_FILE"
|
||||||
|
|
||||||
|
echo -e "${GREEN}Added: $doc_id${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Simple keyword search (no embeddings needed)
|
||||||
|
search_chunks() {
|
||||||
|
local query="$1"
|
||||||
|
local max_results="${2:-5}"
|
||||||
|
local results=()
|
||||||
|
|
||||||
|
# Search through chunks for keyword matches
|
||||||
|
for chunk_file in "$CHUNKS_DIR"/*.txt; do
|
||||||
|
[ -f "$chunk_file" ] || continue
|
||||||
|
|
||||||
|
local matches=$(grep -ci "$query" "$chunk_file" 2>/dev/null || echo 0)
|
||||||
|
if [ "$matches" -gt 0 ]; then
|
||||||
|
local chunk_id=$(basename "$chunk_file" .txt)
|
||||||
|
results+=("$matches:$chunk_id")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Sort by match count and return top results
|
||||||
|
printf '%s\n' "${results[@]}" | sort -t: -k1 -rn | head -n "$max_results" | cut -d: -f2
|
||||||
|
}
|
||||||
|
|
||||||
|
# RAG query - search documents and augment LLM with context
|
||||||
|
query() {
|
||||||
|
local question="$*"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== RAG QUERY ===${RESET}"
|
||||||
|
echo -e "Question: $question"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Extract keywords from question (simple approach)
|
||||||
|
local keywords=$(echo "$question" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '\n' | sort -u | head -10)
|
||||||
|
|
||||||
|
# Search for relevant chunks
|
||||||
|
local context=""
|
||||||
|
local found_chunks=0
|
||||||
|
|
||||||
|
for keyword in $keywords; do
|
||||||
|
[ ${#keyword} -lt 3 ] && continue # Skip short words
|
||||||
|
|
||||||
|
local chunks=$(search_chunks "$keyword" 3)
|
||||||
|
for chunk_id in $chunks; do
|
||||||
|
if [ -f "$CHUNKS_DIR/$chunk_id.txt" ]; then
|
||||||
|
local chunk_content=$(cat "$CHUNKS_DIR/$chunk_id.txt")
|
||||||
|
context+="--- $chunk_id ---\n$chunk_content\n\n"
|
||||||
|
((found_chunks++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "${BLUE}Found $found_chunks relevant chunks${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Build RAG prompt
|
||||||
|
local prompt="You are a helpful assistant. Use the following context to answer the question. If the context doesn't contain relevant information, say so.
|
||||||
|
|
||||||
|
CONTEXT:
|
||||||
|
$context
|
||||||
|
|
||||||
|
QUESTION: $question
|
||||||
|
|
||||||
|
ANSWER:"
|
||||||
|
|
||||||
|
# Query LLM with context
|
||||||
|
echo -e "${GREEN}Generating answer...${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local response=$(ssh -o ConnectTimeout=30 "$LLM_NODE" \
|
||||||
|
"curl -s http://localhost:11434/api/generate -d '{\"model\":\"$DEFAULT_MODEL\",\"prompt\":\"$prompt\",\"stream\":false}'" 2>/dev/null \
|
||||||
|
| jq -r '.response // "No response"')
|
||||||
|
|
||||||
|
echo -e "${PINK}Answer:${RESET}"
|
||||||
|
echo "$response"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Interactive RAG chat
|
||||||
|
chat() {
|
||||||
|
echo -e "${PINK}╔══════════════════════════════════════════════════════════════╗${RESET}"
|
||||||
|
echo -e "${PINK}║ 📚 RAG KNOWLEDGE ASSISTANT 📚 ║${RESET}"
|
||||||
|
echo -e "${PINK}╚══════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local doc_count=$(jq '.documents | length' "$INDEX_FILE" 2>/dev/null || echo 0)
|
||||||
|
local chunk_count=$(jq '.chunks | length' "$INDEX_FILE" 2>/dev/null || echo 0)
|
||||||
|
|
||||||
|
echo "Knowledge base: $doc_count documents, $chunk_count chunks"
|
||||||
|
echo "Type 'exit' to quit, 'docs' to list documents"
|
||||||
|
echo
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo -n -e "${GREEN}You: ${RESET}"
|
||||||
|
read -r input
|
||||||
|
|
||||||
|
case "$input" in
|
||||||
|
exit|quit|q)
|
||||||
|
echo "Goodbye!"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
docs|list)
|
||||||
|
list_documents
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
query "$input"
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# List documents in knowledge base
|
||||||
|
list_documents() {
|
||||||
|
echo -e "${PINK}=== KNOWLEDGE BASE ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
jq -r '.documents[] | " \(.id): \(.name) (\(.chunks) chunks)"' "$INDEX_FILE" 2>/dev/null
|
||||||
|
|
||||||
|
local total=$(jq '.documents | length' "$INDEX_FILE" 2>/dev/null || echo 0)
|
||||||
|
echo
|
||||||
|
echo "Total: $total documents"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove document
|
||||||
|
remove_document() {
|
||||||
|
local doc_id="$1"
|
||||||
|
|
||||||
|
# Remove chunks
|
||||||
|
rm -f "$CHUNKS_DIR/${doc_id}_chunk_"*.txt
|
||||||
|
|
||||||
|
# Remove from index
|
||||||
|
jq --arg doc_id "$doc_id" \
|
||||||
|
'.documents = [.documents[] | select(.id != $doc_id)] | .chunks = [.chunks[] | select(.doc_id != $doc_id)]' \
|
||||||
|
"$INDEX_FILE" > "$INDEX_FILE.tmp" && mv "$INDEX_FILE.tmp" "$INDEX_FILE"
|
||||||
|
|
||||||
|
rm -f "$DOCS_DIR/$doc_id-"*
|
||||||
|
|
||||||
|
echo -e "${GREEN}Removed: $doc_id${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Stats
|
||||||
|
stats() {
|
||||||
|
echo -e "${PINK}=== RAG PIPELINE STATS ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local doc_count=$(jq '.documents | length' "$INDEX_FILE" 2>/dev/null || echo 0)
|
||||||
|
local chunk_count=$(jq '.chunks | length' "$INDEX_FILE" 2>/dev/null || echo 0)
|
||||||
|
local docs_size=$(du -sh "$DOCS_DIR" 2>/dev/null | cut -f1)
|
||||||
|
local chunks_size=$(du -sh "$CHUNKS_DIR" 2>/dev/null | cut -f1)
|
||||||
|
|
||||||
|
echo " Documents: $doc_count"
|
||||||
|
echo " Chunks: $chunk_count"
|
||||||
|
echo " Docs size: $docs_size"
|
||||||
|
echo " Chunks size: $chunks_size"
|
||||||
|
echo " Chunk size: $CHUNK_SIZE chars"
|
||||||
|
echo " LLM node: $LLM_NODE"
|
||||||
|
echo " Model: $DEFAULT_MODEL"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help() {
|
||||||
|
echo -e "${PINK}BlackRoad RAG Pipeline${RESET}"
|
||||||
|
echo
|
||||||
|
echo "Retrieval-Augmented Generation for the Pi cluster"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " init Initialize RAG pipeline"
|
||||||
|
echo " add <file> Add document to knowledge base"
|
||||||
|
echo " query <question> Query with RAG"
|
||||||
|
echo " chat Interactive RAG chat"
|
||||||
|
echo " list List documents"
|
||||||
|
echo " remove <doc_id> Remove document"
|
||||||
|
echo " stats Show statistics"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 add ~/README.md"
|
||||||
|
echo " $0 add ~/docs/*.txt"
|
||||||
|
echo " $0 query 'How does the API work?'"
|
||||||
|
echo " $0 chat"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure initialized
|
||||||
|
[ -d "$RAG_DIR" ] || init >/dev/null
|
||||||
|
|
||||||
|
case "${1:-help}" in
|
||||||
|
init)
|
||||||
|
init
|
||||||
|
;;
|
||||||
|
add)
|
||||||
|
shift
|
||||||
|
for file in "$@"; do
|
||||||
|
add_document "$file"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
query|ask)
|
||||||
|
shift
|
||||||
|
query "$@"
|
||||||
|
;;
|
||||||
|
chat)
|
||||||
|
chat
|
||||||
|
;;
|
||||||
|
list|docs)
|
||||||
|
list_documents
|
||||||
|
;;
|
||||||
|
remove|rm)
|
||||||
|
remove_document "$2"
|
||||||
|
;;
|
||||||
|
stats)
|
||||||
|
stats
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
127
scripts/vision-llm.sh
Normal file
127
scripts/vision-llm.sh
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# BlackRoad Vision + LLM Pipeline
|
||||||
|
# Hailo-8 detects objects → LLM describes them
|
||||||
|
# Agent: Icarus (b3e01bd9)
|
||||||
|
|
||||||
|
PINK='\033[38;5;205m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
# Nodes
|
||||||
|
HAILO_NODE="cecilia" # Has Hailo-8
|
||||||
|
LLM_NODE="cecilia" # Has Ollama
|
||||||
|
|
||||||
|
# Run object detection and get LLM description
|
||||||
|
detect_and_describe() {
|
||||||
|
local image_path="$1"
|
||||||
|
local model="${2:-llama3.2:1b}"
|
||||||
|
|
||||||
|
echo -e "${PINK}=== VISION + LLM PIPELINE ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Step 1: Run Hailo detection
|
||||||
|
echo -e "${BLUE}[1/2] Running Hailo-8 object detection...${RESET}"
|
||||||
|
|
||||||
|
# For demo, we'll simulate detection output
|
||||||
|
# In production, this would run: hailortcli run yolov8s.hef --input $image_path
|
||||||
|
local detections="person (95%), car (87%), dog (72%)"
|
||||||
|
|
||||||
|
echo " Detected: $detections"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Step 2: Send to LLM for description
|
||||||
|
echo -e "${BLUE}[2/2] Generating LLM description...${RESET}"
|
||||||
|
|
||||||
|
local prompt="You are a helpful AI assistant. Based on object detection results, describe this scene naturally. Detections: $detections. Describe what you see in 2-3 sentences."
|
||||||
|
|
||||||
|
ssh "$LLM_NODE" "curl -s http://localhost:11434/api/generate -d '{\"model\":\"$model\",\"prompt\":\"$prompt\",\"stream\":false}'" \
|
||||||
|
| jq -r '.response'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Real-time detection stream (simulated)
|
||||||
|
realtime_stream() {
|
||||||
|
echo -e "${PINK}=== REAL-TIME VISION + LLM ===${RESET}"
|
||||||
|
echo "Press Ctrl+C to stop"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local frame=0
|
||||||
|
while true; do
|
||||||
|
((frame++))
|
||||||
|
echo -e "${GREEN}[Frame $frame]${RESET}"
|
||||||
|
|
||||||
|
# Simulate varying detections
|
||||||
|
local objects=("person" "car" "bicycle" "dog" "cat" "bird" "laptop" "phone")
|
||||||
|
local detected="${objects[$((RANDOM % ${#objects[@]}))]}"
|
||||||
|
local confidence=$((70 + RANDOM % 30))
|
||||||
|
|
||||||
|
echo " Detected: $detected ($confidence%)"
|
||||||
|
|
||||||
|
# Quick LLM response
|
||||||
|
local prompt="In 10 words or less, describe seeing a $detected"
|
||||||
|
local response=$(ssh "$LLM_NODE" "curl -s http://localhost:11434/api/generate -d '{\"model\":\"tinyllama\",\"prompt\":\"$prompt\",\"stream\":false}'" 2>/dev/null | jq -r '.response' | head -1)
|
||||||
|
|
||||||
|
echo -e " ${BLUE}AI: $response${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Benchmark the pipeline
|
||||||
|
benchmark_pipeline() {
|
||||||
|
echo -e "${PINK}=== VISION + LLM BENCHMARK ===${RESET}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Hailo benchmark
|
||||||
|
echo "Hailo-8 (YOLOv8s):"
|
||||||
|
local hailo_fps=$(ssh "$HAILO_NODE" "hailortcli benchmark /usr/share/hailo-models/yolov8s_h8.hef -t 3 2>&1 | grep -oP 'FPS: \K[\d.]+' | tail -1")
|
||||||
|
echo " $hailo_fps FPS"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# LLM benchmark
|
||||||
|
echo "LLM (tinyllama):"
|
||||||
|
local start=$(date +%s.%N)
|
||||||
|
ssh "$LLM_NODE" "curl -s http://localhost:11434/api/generate -d '{\"model\":\"tinyllama\",\"prompt\":\"Describe a person walking\",\"stream\":false}'" >/dev/null
|
||||||
|
local end=$(date +%s.%N)
|
||||||
|
local llm_time=$(echo "$end - $start" | bc)
|
||||||
|
echo " ${llm_time}s per description"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Combined throughput
|
||||||
|
echo "Combined Pipeline:"
|
||||||
|
echo " Detection: $hailo_fps FPS"
|
||||||
|
echo " Description: 1 every ${llm_time}s"
|
||||||
|
echo " Bottleneck: LLM (use for key frames only)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help() {
|
||||||
|
echo -e "${PINK}BlackRoad Vision + LLM Pipeline${RESET}"
|
||||||
|
echo
|
||||||
|
echo "Usage: $0 <command>"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " detect <image> Detect objects and describe"
|
||||||
|
echo " stream Real-time detection stream"
|
||||||
|
echo " benchmark Benchmark the pipeline"
|
||||||
|
echo
|
||||||
|
echo "Example:"
|
||||||
|
echo " $0 detect photo.jpg"
|
||||||
|
echo " $0 stream"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${1:-help}" in
|
||||||
|
detect)
|
||||||
|
detect_and_describe "$2" "$3"
|
||||||
|
;;
|
||||||
|
stream)
|
||||||
|
realtime_stream
|
||||||
|
;;
|
||||||
|
benchmark)
|
||||||
|
benchmark_pipeline
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
Reference in New Issue
Block a user