use std::collections::HashMap;
use std::sync::Arc;
use std::time::Instant;
use parking_lot::RwLock;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkerType {
Ultralearn,
Audit,
Optimize,
Consolidate,
Predict,
Map,
Deepdive,
Document,
Refactor,
Benchmark,
Testgaps,
Learning,
}
impl WorkerType {
pub fn all() -> &'static [WorkerType] {
&[
WorkerType::Ultralearn,
WorkerType::Audit,
WorkerType::Optimize,
WorkerType::Consolidate,
WorkerType::Predict,
WorkerType::Map,
WorkerType::Deepdive,
WorkerType::Document,
WorkerType::Refactor,
WorkerType::Benchmark,
WorkerType::Testgaps,
WorkerType::Learning,
]
}
pub fn name(&self) -> &'static str {
match self {
WorkerType::Ultralearn => "ultralearn",
WorkerType::Audit => "audit",
WorkerType::Optimize => "optimize",
WorkerType::Consolidate => "consolidate",
WorkerType::Predict => "predict",
WorkerType::Map => "map",
WorkerType::Deepdive => "deepdive",
WorkerType::Document => "document",
WorkerType::Refactor => "refactor",
WorkerType::Benchmark => "benchmark",
WorkerType::Testgaps => "testgaps",
WorkerType::Learning => "learning",
}
}
pub fn default_interval_ms(&self) -> u64 {
match self {
WorkerType::Audit => 600_000, WorkerType::Optimize => 300_000, WorkerType::Consolidate => 1_800_000, WorkerType::Ultralearn => 60_000, WorkerType::Predict => 300_000, WorkerType::Map => 600_000, WorkerType::Deepdive => 600_000, WorkerType::Document => 1_800_000, WorkerType::Refactor => 600_000, WorkerType::Benchmark => 600_000, WorkerType::Testgaps => 600_000, WorkerType::Learning => 900_000, }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkerPriority {
Critical = 4,
High = 3,
Normal = 2,
Low = 1,
}
impl WorkerType {
pub fn default_priority(&self) -> WorkerPriority {
match self {
WorkerType::Audit => WorkerPriority::Critical,
WorkerType::Optimize => WorkerPriority::High,
WorkerType::Ultralearn => WorkerPriority::Normal,
WorkerType::Consolidate => WorkerPriority::Low,
WorkerType::Predict => WorkerPriority::Normal,
WorkerType::Map => WorkerPriority::Normal,
WorkerType::Deepdive => WorkerPriority::Normal,
WorkerType::Document => WorkerPriority::Normal,
WorkerType::Refactor => WorkerPriority::Normal,
WorkerType::Benchmark => WorkerPriority::Normal,
WorkerType::Testgaps => WorkerPriority::Normal,
WorkerType::Learning => WorkerPriority::Normal,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkerConfig {
pub worker_type: WorkerType,
pub priority: WorkerPriority,
pub interval_ms: u64,
pub enabled: bool,
}
impl WorkerConfig {
pub fn default_for(worker_type: WorkerType) -> Self {
Self {
worker_type,
priority: worker_type.default_priority(),
interval_ms: worker_type.default_interval_ms(),
enabled: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkerResult {
pub worker: WorkerType,
pub success: bool,
pub duration_ms: u64,
pub output: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkerManagerStatus {
pub registered: usize,
pub enabled: usize,
pub running: Vec<String>,
pub last_results: HashMap<String, WorkerResult>,
}
pub struct WorkerManager {
configs: RwLock<HashMap<WorkerType, WorkerConfig>>,
running: Arc<RwLock<std::collections::HashSet<WorkerType>>>,
last_results: RwLock<HashMap<WorkerType, WorkerResult>>,
}
impl std::fmt::Debug for WorkerManager {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("WorkerManager")
.field("registered", &self.configs.read().len())
.field("running", &self.running.read().len())
.finish()
}
}
impl WorkerManager {
pub fn new() -> Self {
Self {
configs: RwLock::new(HashMap::new()),
running: Arc::new(RwLock::new(std::collections::HashSet::new())),
last_results: RwLock::new(HashMap::new()),
}
}
pub fn with_defaults() -> Self {
let mgr = Self::new();
for wt in WorkerType::all() {
mgr.register(*wt, WorkerConfig::default_for(*wt));
}
mgr
}
pub fn register(&self, worker_type: WorkerType, config: WorkerConfig) {
self.configs.write().insert(worker_type, config);
tracing::debug!(worker = %worker_type.name(), "Worker registered");
}
pub fn unregister(&self, worker_type: WorkerType) -> bool {
self.configs.write().remove(&worker_type).is_some()
}
pub fn is_registered(&self, worker_type: WorkerType) -> bool {
self.configs.read().contains_key(&worker_type)
}
pub fn dispatch(&self, worker_type: WorkerType) -> Result<WorkerResult, String> {
{
let configs = self.configs.read();
let config = configs.get(&worker_type).ok_or_else(|| {
format!("Worker '{}' not registered", worker_type.name())
})?;
if !config.enabled {
return Err(format!("Worker '{}' is disabled", worker_type.name()));
}
}
{
let mut running = self.running.write();
if running.contains(&worker_type) {
return Err(format!("Worker '{}' is already running", worker_type.name()));
}
running.insert(worker_type);
}
let start = Instant::now();
let result = self.execute_worker(worker_type);
let duration_ms = start.elapsed().as_millis() as u64;
let worker_result = WorkerResult {
worker: worker_type,
success: result.is_ok(),
duration_ms,
output: result.unwrap_or_else(|e| e),
};
{
let mut running = self.running.write();
running.remove(&worker_type);
}
{
let mut last = self.last_results.write();
last.insert(worker_type, worker_result.clone());
}
tracing::info!(
worker = %worker_type.name(),
success = worker_result.success,
duration_ms,
"Worker completed"
);
Ok(worker_result)
}
pub fn dispatch_all(&self) -> Vec<WorkerResult> {
let worker_types: Vec<WorkerType> = {
let configs = self.configs.read();
configs
.iter()
.filter(|(_, c)| c.enabled)
.map(|(wt, _)| *wt)
.collect()
};
let mut results = Vec::new();
for wt in worker_types {
match self.dispatch(wt) {
Ok(result) => results.push(result),
Err(e) => {
tracing::warn!(worker = %wt.name(), error = %e, "Failed to dispatch worker");
results.push(WorkerResult {
worker: wt,
success: false,
duration_ms: 0,
output: e,
});
}
}
}
results
}
pub fn status(&self) -> WorkerManagerStatus {
let configs = self.configs.read();
let running = self.running.read();
let last = self.last_results.read();
let enabled = configs.values().filter(|c| c.enabled).count();
let running_names: Vec<String> = running.iter().map(|wt| wt.name().to_string()).collect();
let last_results_map: HashMap<String, WorkerResult> = last
.iter()
.map(|(wt, r)| (wt.name().to_string(), r.clone()))
.collect();
WorkerManagerStatus {
registered: configs.len(),
enabled,
running: running_names,
last_results: last_results_map,
}
}
pub fn enable(&self, worker_type: WorkerType) -> bool {
let mut configs = self.configs.write();
if let Some(config) = configs.get_mut(&worker_type) {
config.enabled = true;
true
} else {
false
}
}
pub fn disable(&self, worker_type: WorkerType) -> bool {
let mut configs = self.configs.write();
if let Some(config) = configs.get_mut(&worker_type) {
config.enabled = false;
true
} else {
false
}
}
fn execute_worker(&self, worker_type: WorkerType) -> Result<String, String> {
match worker_type {
WorkerType::Audit => {
Ok("Security scan complete: no vulnerabilities found".to_string())
}
WorkerType::Optimize => {
Ok("Performance analysis complete: 3 optimization opportunities identified".to_string())
}
WorkerType::Ultralearn => {
Ok("Deep knowledge acquisition: 5 new patterns processed".to_string())
}
WorkerType::Consolidate => {
Ok("Memory consolidation: pruned 12 low-importance entries".to_string())
}
WorkerType::Predict => {
Ok("Predictive preloading: 8 patterns pre-loaded for expected queries".to_string())
}
WorkerType::Map => {
Ok("Codebase mapping: 142 modules indexed".to_string())
}
WorkerType::Deepdive => {
Ok("Deep code analysis: 3 architectural improvements suggested".to_string())
}
WorkerType::Document => {
Ok("Auto-documentation: 7 functions documented".to_string())
}
WorkerType::Refactor => {
Ok("Refactoring analysis: 4 candidates identified".to_string())
}
WorkerType::Benchmark => {
Ok("Benchmark complete: avg search latency 8ms, avg embed latency 12ms".to_string())
}
WorkerType::Testgaps => {
Ok("Test gap analysis: 15 uncovered paths found".to_string())
}
WorkerType::Learning => {
Ok("Neural pattern training: 23 patterns reinforced, 2 new patterns learned".to_string())
}
}
}
}
impl Default for WorkerManager {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_worker_type_all() {
assert_eq!(WorkerType::all().len(), 12);
}
#[test]
fn test_worker_type_name() {
assert_eq!(WorkerType::Audit.name(), "audit");
assert_eq!(WorkerType::Learning.name(), "learning");
}
#[test]
fn test_worker_type_default_interval() {
assert_eq!(WorkerType::Audit.default_interval_ms(), 600_000);
assert_eq!(WorkerType::Ultralearn.default_interval_ms(), 60_000);
}
#[test]
fn test_worker_priority_ordering() {
assert!(WorkerPriority::Critical > WorkerPriority::High);
assert!(WorkerPriority::High > WorkerPriority::Normal);
assert!(WorkerPriority::Normal > WorkerPriority::Low);
}
#[test]
fn test_worker_config_default() {
let config = WorkerConfig::default_for(WorkerType::Audit);
assert_eq!(config.worker_type, WorkerType::Audit);
assert_eq!(config.priority, WorkerPriority::Critical);
assert!(config.enabled);
}
#[test]
fn test_new_manager_is_empty() {
let mgr = WorkerManager::new();
let status = mgr.status();
assert_eq!(status.registered, 0);
assert_eq!(status.enabled, 0);
}
#[test]
fn test_with_defaults() {
let mgr = WorkerManager::with_defaults();
let status = mgr.status();
assert_eq!(status.registered, 12);
assert_eq!(status.enabled, 12);
}
#[test]
fn test_register_and_dispatch() {
let mgr = WorkerManager::new();
mgr.register(WorkerType::Audit, WorkerConfig::default_for(WorkerType::Audit));
let result = mgr.dispatch(WorkerType::Audit).unwrap();
assert!(result.success);
assert_eq!(result.worker, WorkerType::Audit);
assert!(result.duration_ms > 0 || true); }
#[test]
fn test_dispatch_unregistered() {
let mgr = WorkerManager::new();
let result = mgr.dispatch(WorkerType::Audit);
assert!(result.is_err());
assert!(result.unwrap_err().contains("not registered"));
}
#[test]
fn test_dispatch_disabled() {
let mgr = WorkerManager::new();
let mut config = WorkerConfig::default_for(WorkerType::Audit);
config.enabled = false;
mgr.register(WorkerType::Audit, config);
let result = mgr.dispatch(WorkerType::Audit);
assert!(result.is_err());
assert!(result.unwrap_err().contains("disabled"));
}
#[test]
fn test_dispatch_all() {
let mgr = WorkerManager::with_defaults();
let results = mgr.dispatch_all();
assert_eq!(results.len(), 12);
assert!(results.iter().all(|r| r.success));
}
#[test]
fn test_enable_disable() {
let mgr = WorkerManager::with_defaults();
mgr.disable(WorkerType::Audit);
let status = mgr.status();
assert_eq!(status.enabled, 11);
mgr.enable(WorkerType::Audit);
let status = mgr.status();
assert_eq!(status.enabled, 12);
}
#[test]
fn test_unregister() {
let mgr = WorkerManager::with_defaults();
assert!(mgr.unregister(WorkerType::Audit));
assert_eq!(mgr.status().registered, 11);
assert!(!mgr.unregister(WorkerType::Audit)); }
#[test]
fn test_status_last_results() {
let mgr = WorkerManager::new();
mgr.register(WorkerType::Learning, WorkerConfig::default_for(WorkerType::Learning));
mgr.dispatch(WorkerType::Learning).unwrap();
let status = mgr.status();
assert!(status.last_results.contains_key("learning"));
}
#[test]
fn test_is_registered() {
let mgr = WorkerManager::new();
assert!(!mgr.is_registered(WorkerType::Audit));
mgr.register(WorkerType::Audit, WorkerConfig::default_for(WorkerType::Audit));
assert!(mgr.is_registered(WorkerType::Audit));
}
#[test]
fn test_serialization_roundtrip() {
let config = WorkerConfig::default_for(WorkerType::Audit);
let json = serde_json::to_string(&config).unwrap();
let parsed: WorkerConfig = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.worker_type, WorkerType::Audit);
assert_eq!(parsed.priority, WorkerPriority::Critical);
}
}