actualised-core 0.1.1

Autonomous multi-agent orchestration engine for AI teams and game studios
# actualised-core

`actualised-core` is the native Rust engine for **Actualised AI** — an autonomous multi-agent orchestration framework designed for AI engineering teams and generative game studios.

## Features

- **Autonomous Agent Hierarchy**: Topological DFS and parent/child delegation across lead agents and specialists.
- **Pluggable Multi-Provider LLM Engine**: Native support for Doubleword AI, Google Gemini, OpenAI, and Anthropic.
- **Per-Agent Routing**: Route individual agents to specific models, providers, and temperatures (e.g. DeepSeek v3.2 / v4.1 on Doubleword for leads, lighter models for leaf nodes).
- **Doubleword Batch Processing**: Automated submission and asynchronous polling of OpenAI-compatible JSONL batch jobs. Completed batches are automatically injected into the requesting agent's next turn.
- **Native Custom Tool Execution**: Implement the `ToolExecutor` trait in pure Rust to intercept and handle custom studio or engine tools (e.g. Godot scene inspections, procedural generators, compiler triggers).
- **Persistent State**: Full integration with SurrealDB (local embedded KV or cloud WebSocket/HTTP) for transactional state, agent memory footprints, and conversation turns.

## Installation

Add to your `Cargo.toml`:

```toml
[dependencies]
actualised-core = "0.1"
```

## Quick Start (Rust Embedding)

```rust
use std::sync::Arc;
use async_trait::async_trait;
use actualised_core::orchestrator::{Orchestrator, ToolExecutor};
use actualised_core::state::{CompanyState, Agent};
use actualised_core::memory::MemoryManager;
use actualised_core::inference::ToolCall;

// 1. Define custom game studio or application tools
struct GameStudioToolExecutor;

#[async_trait]
impl ToolExecutor for GameStudioToolExecutor {
    async fn execute(&self, agent_id: &str, tool_call: &ToolCall) -> Result<String, String> {
        match tool_call.name.as_str() {
            "inspect_scene_tree" => {
                Ok("{\"root\": \"Node3D\", \"children\": [\"Player\", \"WorldEnvironment\"]}".to_string())
            }
            "generate_terrain_tres" => {
                Ok("Generated terrain resource at res://levels/chunk_0_0.tres".to_string())
            }
            _ => Err(format!("Unknown custom tool: {}", tool_call.name)),
        }
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 2. Initialize company state and memory manager
    let mut state = CompanyState::init("surrealkv://./state.db", None, None).await?;
    let memory = MemoryManager::new("./agent_memory")?;

    // 3. Set up orchestrator and register the custom tool executor
    let mut orchestrator = Orchestrator::new(state, memory);
    orchestrator.set_tool_executor(Arc::new(GameStudioToolExecutor));

    // 4. Run an orchestration cycle
    orchestrator.run_cycle().await?;

    Ok(())
}
```

## License

MIT