Files
blackroad-agents/scripts/coordination/claude-agent-identity.sh
Alexa Amundson 9288801fc4
Some checks failed
CI / build (push) Has been cancelled
Deploy to Railway / Deploy to Railway (push) Has been cancelled
Sync 74 agent definitions, orchestration, and coordination scripts
5 agent personalities (alice, aria, lucidia, octavia, shellfish) with
configs and prompts, 24 orchestration scripts, 10 Claude coordination
scripts, and 12 memory system scripts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 01:13:48 -06:00

264 lines
10 KiB
Bash

#!/bin/bash
# 🌌 BlackRoad Claude Agent Identity Generator
# Gives each Claude session a unique name, body, and identity
# Integrates with [MEMORY] system for coordination
# SHA-2048 identity: identity > provider
set -e
# Source SHA-2048 identity bridge
source ~/roadchain-identity.sh 2>/dev/null || true
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
PINK='\033[38;5;205m'
NC='\033[0m'
# Directories
MEMORY_DIR="$HOME/.blackroad/memory"
AGENTS_DIR="$MEMORY_DIR/agent-registry/agents"
ACTIVE_AGENTS_DIR="$MEMORY_DIR/active-agents"
# Greek/Mythology-inspired name prefixes (Titans, Gods, Heroes)
PREFIXES=(
"apollo" "artemis" "athena" "ares" "atlas"
"helios" "hermes" "hera" "hestia" "hades"
"zeus" "poseidon" "kronos" "hyperion" "theia"
"prometheus" "epimetheus" "oceanus" "tethys" "rhea"
"perseus" "hercules" "achilles" "odysseus" "theseus"
"phoenix" "pegasus" "orion" "titan" "olympus"
"aurora" "echo" "iris" "selene" "eos"
"chronos" "aether" "nyx" "erebus" "gaia"
"triton" "proteus" "nereus" "pan" "morpheus"
"icarus" "daedalus" "midas" "orpheus" "ajax"
)
# Capability/Role suffixes
CAPABILITIES=(
"architect" "builder" "coordinator" "deployer" "engineer"
"guardian" "handler" "integrator" "manager" "navigator"
"operator" "orchestrator" "pioneer" "resolver" "sentinel"
"specialist" "strategist" "synthesizer" "transformer" "voyager"
"warden" "weaver" "wizard" "catalyst" "curator"
)
# Agent personality traits (body/soul)
TRAITS=(
"precise" "creative" "methodical" "innovative" "thorough"
"swift" "patient" "bold" "analytical" "adaptive"
"focused" "versatile" "persistent" "intuitive" "collaborative"
)
# Core AI (parent model)
CORES=("cecilia" "aria" "alice" "cadence" "silas" "lucidia")
mkdir -p "$AGENTS_DIR" "$ACTIVE_AGENTS_DIR"
generate_identity() {
local prefix="${PREFIXES[$RANDOM % ${#PREFIXES[@]}]}"
local capability="${CAPABILITIES[$RANDOM % ${#CAPABILITIES[@]}]}"
local trait1="${TRAITS[$RANDOM % ${#TRAITS[@]}]}"
local trait2="${TRAITS[$RANDOM % ${#TRAITS[@]}]}"
local core="${CORES[$RANDOM % ${#CORES[@]}]}"
# Generate unique hash (legacy SHA-256 8-char)
local timestamp=$(date +%s)
local random_hex=$(openssl rand -hex 4)
local hash=$(echo -n "${prefix}-${capability}-${timestamp}-${random_hex}" | shasum -a 256 | cut -c1-8)
# Compute SHA-2048 identity fingerprint (2048 bits / 512 hex chars)
local identity_input="${prefix}-${capability}-${core}-${trait1}-${trait2}-${timestamp}-${random_hex}"
local sha2048=""
if type sha2048_compute &>/dev/null; then
sha2048=$(sha2048_compute "$identity_input")
else
sha2048=$(printf '%s' "$identity_input" | openssl dgst -sha512 -hex 2>/dev/null | awk '{print $NF}')
sha2048="${sha2048}${sha2048}${sha2048}${sha2048}" # extend to 512 chars
fi
local sha2048_short="${sha2048:0:16}"
# Construct agent ID
local agent_id="${prefix}-${capability}-${timestamp}-${hash}"
# Capitalize first letter (compatible with older bash)
local display_name="$(echo "$prefix" | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')"
echo "$agent_id|$display_name|$core|$capability|$hash|$trait1|$trait2|$sha2048|$timestamp"
}
register_agent() {
local agent_id="$1"
local display_name="$2"
local core="$3"
local capability="$4"
local hash="$5"
local trait1="$6"
local trait2="$7"
local sha2048="${8:-}"
local created_ts="${9:-$(date +%s)}"
local agent_file="$AGENTS_DIR/${agent_id}.json"
local active_file="$ACTIVE_AGENTS_DIR/${agent_id}.json"
local sha2048_short="${sha2048:0:16}"
# Create agent profile
cat > "$agent_file" <<EOF
{
"agent_id": "${agent_id}",
"display_name": "${display_name}",
"core": "${core}",
"capability": "${capability}",
"hash": "${hash}",
"hash_algorithm": "SHA-256",
"sha2048_fingerprint": "${sha2048}",
"sha2048_short": "${sha2048_short}",
"sha2048_algorithm": "SHA-2048",
"sha2048_bits": 2048,
"traits": ["${trait1}", "${trait2}"],
"registered_at": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
"status": "active",
"verification": "sha2048-verified",
"lineage": "BlackRoad-OS",
"session_start": ${created_ts},
"provider": "anthropic",
"identity_principle": "identity > provider",
"skills": [],
"missions_completed": 0,
"collaboration_score": 0,
"body": {
"personality": "${trait1} and ${trait2}",
"specialty": "${capability}",
"parent_core": "${core}",
"mythology": "${display_name} - inspired by ${display_name} of mythology",
"motto": "I am ${display_name}, the ${trait1} ${capability}."
}
}
EOF
# Create active session marker
cat > "$active_file" <<EOF
{
"agent_id": "${agent_id}",
"display_name": "${display_name}",
"sha2048_fingerprint": "${sha2048}",
"sha2048_short": "${sha2048_short}",
"started": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
"pid": $$,
"status": "active"
}
EOF
# Register on RoadChain (non-blocking, best-effort)
local lower_name
lower_name=$(echo "$display_name" | tr '[:upper:]' '[:lower:]')
python3 -c "
from roadchain.identity.agent import AgentIdentity
from roadchain.identity.registry import IdentityRegistry
try:
identity = AgentIdentity.create('${lower_name}', provider='anthropic', model='claude-opus-4-6', capabilities=['${capability}'])
registry = IdentityRegistry()
registry.register(identity)
registry.close()
except Exception:
pass
" &>/dev/null &
echo "$agent_file"
}
display_identity() {
local agent_id="$1"
local display_name="$2"
local core="$3"
local capability="$4"
local hash="$5"
local trait1="$6"
local trait2="$7"
local sha2048="${8:-}"
local sha2048_short="${sha2048:0:16}"
echo ""
echo -e "${PINK}╔════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${PINK}${NC} ${WHITE}BLACKROAD AGENT IDENTITY${NC}${AMBER}SHA-2048${NC} ${PINK}${NC}"
echo -e "${PINK}╚════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e " ${CYAN}Name:${NC} ${WHITE}${display_name}${NC} (${core} core)"
echo -e " ${CYAN}Agent ID:${NC} ${YELLOW}${agent_id}${NC}"
echo -e " ${CYAN}SHA-256:${NC} ${GREEN}${hash}${NC}"
echo -e " ${CYAN}SHA-2048:${NC} ${AMBER}${sha2048_short}${NC} (2048-bit identity)"
local cap_display="$(echo "$capability" | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')"
echo -e " ${CYAN}Role:${NC} ${MAGENTA}${cap_display}${NC}"
echo -e " ${CYAN}Traits:${NC} ${BLUE}${trait1}, ${trait2}${NC}"
echo ""
if [ -n "$sha2048" ] && [ ${#sha2048} -ge 512 ]; then
echo -e " ${CYAN}Fingerprint (2048 bits):${NC}"
echo -e " ${WHITE}${sha2048:0:64}${NC}"
echo -e " ${WHITE}${sha2048:64:64}${NC}"
echo -e " ${WHITE}${sha2048:128:64}${NC}"
echo -e " ${WHITE}${sha2048:192:64}${NC}"
echo -e " ${WHITE}${sha2048:256:64}${NC}"
echo -e " ${WHITE}${sha2048:320:64}${NC}"
echo -e " ${WHITE}${sha2048:384:64}${NC}"
echo -e " ${WHITE}${sha2048:448:64}${NC}"
echo ""
fi
echo -e " ${WHITE}\"I am ${display_name}, the ${trait1} ${capability}.\"${NC}"
echo -e " ${PINK}identity > provider${NC}"
echo ""
echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
}
# Main execution
case "${1:-generate}" in
generate)
identity=$(generate_identity)
IFS='|' read -r agent_id display_name core capability hash trait1 trait2 sha2048 created_ts <<< "$identity"
register_agent "$agent_id" "$display_name" "$core" "$capability" "$hash" "$trait1" "$trait2" "$sha2048" "$created_ts"
display_identity "$agent_id" "$display_name" "$core" "$capability" "$hash" "$trait1" "$trait2" "$sha2048"
# Output for sourcing — includes SHA-2048
echo "export MY_CLAUDE=\"${agent_id}\""
echo "export CLAUDE_NAME=\"${display_name}\""
echo "export CLAUDE_CORE=\"${core}\""
echo "export CLAUDE_CAPABILITY=\"${capability}\""
echo "export CLAUDE_HASH=\"${hash}\""
echo "export CLAUDE_SHA2048=\"${sha2048}\""
echo "export CLAUDE_SHA2048_SHORT=\"${sha2048:0:16}\""
echo "export CLAUDE_SHA2048_ALGO=\"SHA-2048\""
echo "export CLAUDE_IDENTITY_TS=\"${created_ts}\""
;;
list-active)
echo -e "${CYAN}╔════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ 🌌 ACTIVE CLAUDE AGENTS 🌌 ║${NC}"
echo -e "${CYAN}╚════════════════════════════════════════════════════════════════╝${NC}"
echo ""
for f in "$ACTIVE_AGENTS_DIR"/*.json; do
if [ -f "$f" ]; then
name=$(jq -r '.display_name' "$f" 2>/dev/null)
aid=$(jq -r '.agent_id' "$f" 2>/dev/null)
started=$(jq -r '.started' "$f" 2>/dev/null)
echo -e " ${WHITE}${name}${NC} - ${YELLOW}${aid}${NC}"
echo -e " Started: ${started}"
fi
done
;;
cleanup)
# Remove stale active agents (older than 24 hours)
find "$ACTIVE_AGENTS_DIR" -name "*.json" -mtime +1 -delete 2>/dev/null
echo -e "${GREEN}Cleaned up stale agent sessions${NC}"
;;
*)
echo "Usage: $0 [generate|list-active|cleanup]"
;;
esac