refactor wip

This commit is contained in:
Timur Gordon
2025-08-05 12:19:38 +02:00
parent 8ed40ce99c
commit 7a652c9c3c
51 changed files with 6183 additions and 840 deletions

View File

@@ -0,0 +1,185 @@
# Hero Supervisor CLI Example
This example demonstrates how to use the `hive-supervisor` CLI tool for managing workers and jobs in the Hero ecosystem.
## Prerequisites
1. **Redis Server**: Make sure Redis is running on `localhost:6379`
```bash
# Install Redis (macOS)
brew install redis
# Start Redis
redis-server
```
2. **Zinit Process Manager**: Install and configure Zinit
```bash
# Install Zinit (example for Linux/macOS)
# Follow Zinit installation instructions for your platform
```
3. **Worker Binaries**: The configuration references worker binaries that need to be available:
- `/usr/local/bin/osis_worker`
- `/usr/local/bin/sal_worker`
- `/usr/local/bin/v_worker`
- `/usr/local/bin/python_worker`
For testing purposes, you can create mock worker binaries or update the paths in `config.toml` to point to existing binaries.
## Configuration
The `config.toml` file contains the supervisor configuration:
- **Global settings**: Redis URL and Zinit socket path
- **Worker configurations**: Binary paths and environment variables for each worker type
## Usage Examples
### 1. Build the CLI
```bash
# From the supervisor directory
cargo build --bin hive-supervisor --release
```
### 2. Worker Management
```bash
# Show help
./target/release/hive-supervisor --config examples/cli/config.toml --help
# List all configured workers
./target/release/hive-supervisor --config examples/cli/config.toml workers list
# Start all workers
./target/release/hive-supervisor --config examples/cli/config.toml workers start
# Start specific workers
./target/release/hive-supervisor --config examples/cli/config.toml workers start osis_worker sal_worker
# Check worker status
./target/release/hive-supervisor --config examples/cli/config.toml workers status
# Stop all workers
./target/release/hive-supervisor --config examples/cli/config.toml workers stop
# Restart specific worker
./target/release/hive-supervisor --config examples/cli/config.toml workers restart osis_worker
```
### 3. Job Management
```bash
# Create a job with inline script
./target/release/hive-supervisor --config examples/cli/config.toml jobs create \
--script 'print("Hello from OSIS worker!");' \
--script-type osis \
--caller-id "user123" \
--context-id "session456"
# Create a job from file
./target/release/hive-supervisor --config examples/cli/config.toml jobs create \
--file examples/cli/sample_script.rhai \
--script-type osis \
--caller-id "user123" \
--context-id "session456"
# List all jobs
./target/release/hive-supervisor --config examples/cli/config.toml jobs list
# Check job status
./target/release/hive-supervisor --config examples/cli/config.toml jobs status <JOB_ID>
# View job logs
./target/release/hive-supervisor --config examples/cli/config.toml jobs logs <JOB_ID>
# Stop a job
./target/release/hive-supervisor --config examples/cli/config.toml jobs stop <JOB_ID>
```
### 4. Interactive REPL Mode
```bash
# Enter REPL mode for OSIS scripts
./target/release/hive-supervisor --config examples/cli/config.toml repl \
--caller-id "user123" \
--context-id "session456" \
--script-type osis \
--timeout 60
# In REPL mode, you can:
# - Type scripts directly and press Enter to execute
# - Type 'help' for available commands
# - Type 'exit' or 'quit' to leave REPL mode
```
### 5. Verbose Logging
```bash
# Enable debug logging
./target/release/hive-supervisor --config examples/cli/config.toml -v workers status
# Enable trace logging
./target/release/hive-supervisor --config examples/cli/config.toml -vv workers status
# Disable timestamps
./target/release/hive-supervisor --config examples/cli/config.toml --no-timestamp workers status
```
## Sample Scripts
The `sample_scripts/` directory contains example scripts for different worker types:
- `hello_osis.rhai` - Simple OSIS/HeroScript example
- `system_sal.rhai` - SAL system operation example
- `math_v.v` - V language calculation example
- `data_python.py` - Python data processing example
## Troubleshooting
### Common Issues
1. **Redis Connection Error**
- Ensure Redis is running: `redis-cli ping`
- Check the Redis URL in `config.toml`
2. **Zinit Socket Error**
- Verify Zinit is running and the socket path is correct
- Check permissions on the socket file
3. **Worker Binary Not Found**
- Update binary paths in `config.toml` to match your system
- Ensure worker binaries are executable
4. **Permission Denied**
- Check file permissions on configuration and binary files
- Ensure the user has access to the Zinit socket
### Debug Mode
Run with verbose logging to see detailed operation information:
```bash
RUST_LOG=debug ./target/release/hive-supervisor --config examples/cli/config.toml -vv workers status
```
## Configuration Customization
You can customize the configuration for your environment:
1. **Update Redis URL**: Change `redis_url` in the `[global]` section
2. **Update Zinit Socket**: Change `zinit_socket_path` for your Zinit installation
3. **Worker Paths**: Update binary paths in worker sections to match your setup
4. **Environment Variables**: Add or modify environment variables for each worker type
## Integration with Hero Ecosystem
This CLI integrates with the broader Hero ecosystem:
- **Job Queue**: Uses Redis for job queuing and status tracking
- **Process Management**: Uses Zinit for worker lifecycle management
- **Script Execution**: Supports multiple script types (OSIS, SAL, V, Python)
- **Monitoring**: Provides real-time status and logging capabilities
For more information about the Hero ecosystem, see the main project documentation.

View File

@@ -0,0 +1,19 @@
# Hero Supervisor CLI Configuration Example
# This configuration demonstrates how to set up the hive-supervisor CLI
# with different worker types for script execution.
[global]
# Redis connection URL for job queuing
redis_url = "redis://localhost:6379"
# OSIS Worker Configuration
# Handles OSIS (HeroScript) execution
[osis_worker]
binary_path = "/Users/timurgordon/code/git.ourworld.tf/herocode/hero/target/debug/osis"
env_vars = { "RUST_LOG" = "info", "WORKER_TYPE" = "osis", "MAX_CONCURRENT_JOBS" = "5" }
# SAL Worker Configuration
# Handles System Abstraction Layer scripts
[sal_worker]
binary_path = "/Users/timurgordon/code/git.ourworld.tf/herocode/hero/target/debug/sal"
env_vars = { "RUST_LOG" = "info", "WORKER_TYPE" = "sal", "MAX_CONCURRENT_JOBS" = "3" }

View File

@@ -0,0 +1,144 @@
#!/bin/bash
# Hero Supervisor CLI Example Runner
# This script demonstrates various CLI operations
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SUPERVISOR_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
CONFIG_FILE="$SCRIPT_DIR/config.toml"
CLI_BINARY="$SUPERVISOR_DIR/target/release/hive-supervisor"
echo -e "${BLUE}=== Hero Supervisor CLI Example Runner ===${NC}"
echo "Script directory: $SCRIPT_DIR"
echo "Supervisor directory: $SUPERVISOR_DIR"
echo "Configuration file: $CONFIG_FILE"
echo
# Function to run CLI command with error handling
run_cli() {
local description="$1"
shift
echo -e "${YELLOW}Running: $description${NC}"
echo "Command: $CLI_BINARY --config $CONFIG_FILE $*"
echo
if "$CLI_BINARY" --config "$CONFIG_FILE" "$@"; then
echo -e "${GREEN}✓ Success${NC}"
else
echo -e "${RED}✗ Failed${NC}"
return 1
fi
echo
}
# Check if CLI binary exists
if [[ ! -f "$CLI_BINARY" ]]; then
echo -e "${YELLOW}Building CLI binary...${NC}"
cd "$SUPERVISOR_DIR"
cargo build --bin hive-supervisor --release
echo
fi
# Check if config file exists
if [[ ! -f "$CONFIG_FILE" ]]; then
echo -e "${RED}Error: Configuration file not found: $CONFIG_FILE${NC}"
exit 1
fi
echo -e "${BLUE}=== CLI Help and Information ===${NC}"
run_cli "Show main help" --help
echo -e "${BLUE}=== Worker Management Examples ===${NC}"
run_cli "List configured workers" workers list
run_cli "Show worker management help" workers --help
# Note: These commands would require actual worker binaries and Zinit setup
echo -e "${YELLOW}Note: The following commands require actual worker binaries and Zinit setup${NC}"
echo -e "${YELLOW}They are shown for demonstration but may fail without proper setup${NC}"
echo
# Uncomment these if you have the proper setup
# run_cli "Check worker status" workers status
# run_cli "Start all workers" workers start
# run_cli "Check worker status after start" workers status
echo -e "${BLUE}=== Job Management Examples ===${NC}"
run_cli "Show job management help" jobs --help
# Create sample jobs (these will also require workers to be running)
echo -e "${YELLOW}Sample job creation commands (require running workers):${NC}"
echo
echo "# Create OSIS job with inline script:"
echo "$CLI_BINARY --config $CONFIG_FILE jobs create \\"
echo " --script 'print(\"Hello from CLI!\");' \\"
echo " --script-type osis \\"
echo " --caller-id \"cli_demo\" \\"
echo " --context-id \"example_session\""
echo
echo "# Create job from sample script file:"
echo "$CLI_BINARY --config $CONFIG_FILE jobs create \\"
echo " --file \"$SCRIPT_DIR/sample_scripts/hello_osis.rhai\" \\"
echo " --script-type osis \\"
echo " --caller-id \"cli_demo\" \\"
echo " --context-id \"example_session\""
echo
echo "# List all jobs:"
echo "$CLI_BINARY --config $CONFIG_FILE jobs list"
echo
echo "# Check job status (replace JOB_ID with actual job ID):"
echo "$CLI_BINARY --config $CONFIG_FILE jobs status JOB_ID"
echo
echo -e "${BLUE}=== REPL Mode Example ===${NC}"
echo -e "${YELLOW}REPL mode command (interactive):${NC}"
echo "$CLI_BINARY --config $CONFIG_FILE repl \\"
echo " --caller-id \"cli_demo\" \\"
echo " --context-id \"example_session\" \\"
echo " --script-type osis \\"
echo " --timeout 60"
echo
echo -e "${BLUE}=== Sample Scripts ===${NC}"
echo "Available sample scripts in $SCRIPT_DIR/sample_scripts/:"
for script in "$SCRIPT_DIR/sample_scripts"/*; do
if [[ -f "$script" ]]; then
basename "$script"
fi
done
echo
echo -e "${BLUE}=== Verbose Logging Examples ===${NC}"
echo "# Debug logging:"
echo "$CLI_BINARY --config $CONFIG_FILE -v workers list"
echo
echo "# Trace logging:"
echo "$CLI_BINARY --config $CONFIG_FILE -vv workers list"
echo
echo "# No timestamps:"
echo "$CLI_BINARY --config $CONFIG_FILE --no-timestamp workers list"
echo
echo -e "${GREEN}=== Example Runner Complete ===${NC}"
echo -e "${YELLOW}To run actual commands, ensure you have:${NC}"
echo "1. Redis server running on localhost:6379"
echo "2. Zinit process manager installed and configured"
echo "3. Worker binaries available at the paths specified in config.toml"
echo
echo -e "${YELLOW}For testing without full setup, you can:${NC}"
echo "1. Update config.toml with paths to existing binaries"
echo "2. Use the CLI help commands and configuration validation"
echo "3. Test the REPL mode (requires workers to be running)"

View File

@@ -0,0 +1,90 @@
#!/usr/bin/env python3
"""
Sample Python script for demonstration
This script demonstrates Python worker functionality
"""
import json
import datetime
from typing import List, Dict
def main():
print("=== Python Worker Demo ===")
print("Python data processing operations")
# Data structures
print("\nData structures:")
users = [
{"id": 1, "name": "Alice", "age": 30, "role": "developer"},
{"id": 2, "name": "Bob", "age": 25, "role": "designer"},
{"id": 3, "name": "Charlie", "age": 35, "role": "manager"},
{"id": 4, "name": "Diana", "age": 28, "role": "developer"}
]
print(f"Total users: {len(users)}")
# Data filtering
developers = [user for user in users if user["role"] == "developer"]
print(f"Developers: {len(developers)}")
for dev in developers:
print(f" - {dev['name']} (age {dev['age']})")
# Statistical operations
print("\nStatistical operations:")
ages = [user["age"] for user in users]
avg_age = sum(ages) / len(ages)
min_age = min(ages)
max_age = max(ages)
print(f"Average age: {avg_age:.1f}")
print(f"Age range: {min_age} - {max_age}")
# Date/time operations
print("\nDate/time operations:")
now = datetime.datetime.now()
print(f"Current time: {now.strftime('%Y-%m-%d %H:%M:%S')}")
# Calculate birth years
current_year = now.year
for user in users:
birth_year = current_year - user["age"]
print(f"{user['name']} was born in {birth_year}")
# JSON processing
print("\nJSON processing:")
json_data = json.dumps(users, indent=2)
print("User data as JSON:")
print(json_data[:200] + "..." if len(json_data) > 200 else json_data)
# File operations simulation
print("\nFile operations:")
simulate_file_processing()
print("=== Python Demo Complete ===")
def simulate_file_processing():
"""Simulate file processing operations"""
files = [
{"name": "data.csv", "size": 1024, "type": "csv"},
{"name": "config.json", "size": 512, "type": "json"},
{"name": "report.pdf", "size": 2048, "type": "pdf"},
{"name": "script.py", "size": 768, "type": "python"}
]
total_size = sum(file["size"] for file in files)
print(f"Processing {len(files)} files, total size: {total_size} bytes")
# Group by type
file_types = {}
for file in files:
file_type = file["type"]
if file_type not in file_types:
file_types[file_type] = []
file_types[file_type].append(file["name"])
print("Files by type:")
for file_type, file_names in file_types.items():
print(f" {file_type}: {', '.join(file_names)}")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,34 @@
// Sample OSIS/HeroScript for demonstration
// This script demonstrates basic OSIS worker functionality
print("=== OSIS Worker Demo ===");
print("Hello from the OSIS worker!");
// Basic variable operations
let name = "Hero";
let version = "1.0";
print(`Running ${name} version ${version}`);
// Simple calculation
let x = 10;
let y = 20;
let result = x + y;
print(`Calculation: ${x} + ${y} = ${result}`);
// Array operations
let numbers = [1, 2, 3, 4, 5];
let sum = 0;
for num in numbers {
sum += num;
}
print(`Sum of array [1,2,3,4,5]: ${sum}`);
// Function definition and call
fn greet(person) {
return `Hello, ${person}! Welcome to Hero.`;
}
let greeting = greet("Developer");
print(greeting);
print("=== OSIS Demo Complete ===");

View File

@@ -0,0 +1,67 @@
// Sample V language script for demonstration
// This script demonstrates V worker functionality
module main
import math
fn main() {
println("=== V Worker Demo ===")
println("V language mathematical operations")
// Basic arithmetic
x := 15
y := 25
sum := x + y
product := x * y
println("Basic arithmetic:")
println("${x} + ${y} = ${sum}")
println("${x} * ${y} = ${product}")
// Mathematical functions
println("\nMathematical functions:")
angle := 45.0
sin_val := math.sin(math.radians(angle))
cos_val := math.cos(math.radians(angle))
println("sin(${angle}°) = ${sin_val:.4f}")
println("cos(${angle}°) = ${cos_val:.4f}")
// Array operations
numbers := [1, 4, 9, 16, 25]
println("\nArray operations:")
println("Numbers: ${numbers}")
mut total := 0
for num in numbers {
total += num
}
println("Sum: ${total}")
// Square roots
println("\nSquare roots:")
for num in numbers {
sqrt_val := math.sqrt(f64(num))
println("√${num} = ${sqrt_val:.2f}")
}
// Fibonacci sequence
println("\nFibonacci sequence (first 10 numbers):")
fib := fibonacci(10)
println("${fib}")
println("=== V Demo Complete ===")
}
fn fibonacci(n int) []int {
mut fib := []int{len: n}
if n >= 1 {
fib[0] = 0
}
if n >= 2 {
fib[1] = 1
}
for i in 2 .. n {
fib[i] = fib[i-1] + fib[i-2]
}
return fib
}

View File

@@ -0,0 +1,43 @@
// Sample SAL (System Abstraction Layer) script for demonstration
// This script demonstrates system-level operations through SAL worker
print("=== SAL Worker Demo ===");
print("System Abstraction Layer operations");
// System information gathering
print("Gathering system information...");
// Simulated system operations (actual SAL would have real system calls)
let hostname = "hero-system";
let uptime = "2 days, 4 hours";
let load_avg = "0.45, 0.52, 0.48";
print(`Hostname: ${hostname}`);
print(`Uptime: ${uptime}`);
print(`Load Average: ${load_avg}`);
// File system operations
print("\nFile system operations:");
let disk_usage = "45% used";
let available_space = "120GB available";
print(`Disk Usage: ${disk_usage}`);
print(`Available Space: ${available_space}`);
// Process management simulation
print("\nProcess management:");
let active_processes = 156;
let memory_usage = "68%";
print(`Active Processes: ${active_processes}`);
print(`Memory Usage: ${memory_usage}`);
// Network status
print("\nNetwork status:");
let network_interfaces = ["eth0", "lo"];
let connectivity = "Connected";
print(`Network Interfaces: ${network_interfaces}`);
print(`Connectivity: ${connectivity}`);
print("=== SAL Demo Complete ===");

View File

@@ -17,7 +17,6 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Configuration
let redis_url = "redis://localhost:6379";
let zinit_socket = "/var/run/zinit.sock";
// Create supervisor
let supervisor = SupervisorBuilder::new()

View File

@@ -12,7 +12,6 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Workers are automatically launched during build
let supervisor = SupervisorBuilder::new()
.redis_url("redis://localhost:6379")
.zinit_socket_path("/var/run/zinit.sock")
.osis_worker("/usr/local/bin/osis_worker")
.sal_worker("/usr/local/bin/sal_worker")
.v_worker("/usr/local/bin/v_worker")

View File

@@ -0,0 +1,18 @@
[global]
redis_url = "redis://localhost:6379"
[osis_worker]
binary_path = "/path/to/osis_worker"
env_vars = { "VAR1" = "value1", "VAR2" = "value2" }
[sal_worker]
binary_path = "/path/to/sal_worker"
env_vars = { "VAR1" = "value1", "VAR2" = "value2" }
[v_worker]
binary_path = "/path/to/v_worker"
env_vars = { "VAR1" = "value1", "VAR2" = "value2" }
[python_worker]
binary_path = "/path/to/python_worker"
env_vars = { "VAR1" = "value1", "VAR2" = "value2" }