Vitruvian 0.1.2

There is a newer version of this package available.
See the version list below for details.
dotnet tool install --global Vitruvian --version 0.1.2
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local Vitruvian --version 0.1.2
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=Vitruvian&version=0.1.2
                    
nuke :add-package Vitruvian --version 0.1.2
                    

Vitruvian — .NET GOAP Agent Runtime

.NET GOAP agent runtime that decomposes user requests into dependency-aware execution plans, runs independent steps in parallel, and enforces human-in-the-loop approval, caching, and memory — all before any side-effecting action fires.

Vitruvian Agent Runtime — modular, GOAP-driven AI agent orchestration for .NET.

Third-party modules plug in via a single interface (IVitruvianModule). The host handles planning, routing, governance, and security so module authors focus only on capability logic.


Quick Start

Prerequisites

  • .NET 8 SDK (8.0.100 or later)
  • Git
  • An API key for OpenAI, Anthropic, or Google Gemini

Clone, build, and test

git clone https://github.com/mrrasmussendk/Vitruvian.git
cd Vitruvian
dotnet build Vitruvian.sln
dotnet test Vitruvian.sln

Configure a model provider

Create a .env.Vitruvian file in the project root (loaded automatically at startup):

VITRUVIAN_MODEL_PROVIDER=OpenAI
VITRUVIAN_OPENAI_API_KEY=sk-...

Or use the guided installer — see docs/INSTALL.md for all options.

Run the CLI

dotnet run --project src/Vitruvian.Cli
Vitruvian CLI started. Type a request (or 'quit' to exit):
>

Try some requests:

> What is the weather tomorrow?
> Create a file called notes.txt with content "Hello World"
> Read notes.txt then summarize it

Features

Feature Description
GOAP Planning Decomposes requests into dependency-aware plans before execution. Multi-step tasks are broken into steps that run in parallel when independent.
Multithreaded Execution Independent plan steps execute concurrently via Task.WhenAll. Dependent steps wait for their prerequisites.
Human-in-the-Loop (HITL) Write, delete, and execute operations are gated through IApprovalGate. Default-deny on timeout. Full audit trail.
Result Caching Identical (module, input) pairs return cached output, avoiding redundant LLM calls or side effects.
Compound Requests Multi-intent messages are automatically split and each sub-task runs through the full pipeline independently.
Conversation History In-memory conversation history (last 10 turns) provides context-aware routing and execution across turns.
Module Extensibility Implement IVitruvianModule, register via DI or drop a DLL into plugins/ — the GOAP planner discovers it automatically.
Security Linux-style permissions, HITL approval, sandboxed execution with resource limits, and signed-plugin enforcement.

Architecture

Every user request passes through three phases:

  User Request
       │
       ▼
  ┌──────────┐
  │   PLAN   │  GoapPlanner builds an ExecutionPlan
  └────┬─────┘  (PlanSteps + dependency edges)
       │
       ▼
  ┌──────────┐  PlanExecutor runs steps in waves:
  │ EXECUTE  │  • Cache check → HITL gate → Context injection
  │          │  • Module.ExecuteAsync → Cache store
  └────┬─────┘  Independent steps run in parallel
       │
       ▼
  ┌──────────┐
  │  MEMORY  │  Store plan result + conversation turn
  └────┬─────┘
       │
       ▼
    Response

The two core abstractions:

  • IVitruvianModule — every capability (built-in or third-party) implements this single interface.
  • GoapPlanner — takes a request and the list of registered modules, produces an ExecutionPlan with PlanStep nodes and DependsOn edges.

For a deeper dive see docs/ARCHITECTURE.md.


Building a Module

Create a net8.0 class library, reference Vitruvian.Abstractions, and implement IVitruvianModule:

using VitruvianAbstractions.Interfaces;

public sealed class TranslationModule : IVitruvianModule
{
    private readonly IModelClient? _modelClient;

    public string Domain => "translation";
    public string Description => "Translate text between languages using AI";

    public TranslationModule(IModelClient? modelClient = null)
        => _modelClient = modelClient;

    public async Task<string> ExecuteAsync(string request, string? userId, CancellationToken ct)
    {
        if (_modelClient is null) return "No model configured for translation.";
        return await _modelClient.GenerateAsync(
            $"Translate the following as requested: {request}", ct);
    }
}

Register via DI or drop the compiled DLL into plugins/. See docs/EXTENDING.md for the complete guide including SDK attributes, permissions, and API key declarations.


Documentation

All detailed documentation lives in the docs/ folder:

Document Audience Description
Installation Everyone Prerequisites, build, guided & manual setup, plugin installation
Using Vitruvian Users Running the CLI, runtime behaviour, compound requests
Architecture Developers GOAP pipeline, key components, execution flow
Extending Plugin authors Writing modules, SDK attributes, permissions, API keys
Governance Operators / Developers Scoring model, hysteresis, explainability
Security Operators / Plugin authors Permissions, HITL, sandboxing, installation controls
Policy Operators Policy validation and default behaviour
Operations Operators Audit, replay, and doctor commands
Compound Requests Developers Multi-intent detection, decomposition, execution
Contributing Contributors Development setup, project areas, testing

Repository Layout

Vitruvian.sln
├── src/
│   ├── Vitruvian.Abstractions/      ← Core interfaces, enums, facts, planning types
│   ├── Vitruvian.Runtime/           ← GoapPlanner, PlanExecutor, ModuleRouter,
│   │                                   PermissionChecker, CompoundRequestOrchestrator
│   ├── Vitruvian.PluginSdk/         ← SDK attributes for module metadata
│   ├── Vitruvian.PluginHost/        ← Plugin loader (AssemblyLoadContext), sandboxing
│   ├── Vitruvian.Hitl/              ← ConsoleApprovalGate, HITL facts
│   ├── Vitruvian.StandardModules/   ← Built-in modules (File, Conversation, Web, …)
│   ├── Vitruvian.WeatherModule/     ← Example standalone module
│   └── Vitruvian.Cli/               ← CLI entry point, RequestProcessor, ModelClientFactory
├── tests/
│   └── Vitruvian.Tests/             ← xUnit tests
├── docs/                            ← Detailed documentation (see table above)
└── scripts/                         ← Guided setup scripts (install.sh / install.ps1)

Configuration

Create a .env.Vitruvian file in the project root, or export environment variables before running:

Variable Description Default
VITRUVIAN_MODEL_PROVIDER AI provider: OpenAI, Anthropic, or Gemini
VITRUVIAN_OPENAI_API_KEY OpenAI API key
VITRUVIAN_ANTHROPIC_API_KEY Anthropic API key
VITRUVIAN_GEMINI_API_KEY Google Gemini API key
VITRUVIAN_MODEL_NAME Specific model to use Provider default
VITRUVIAN_WORKING_DIRECTORY File operations directory ~/Vitruvian-workspace
VITRUVIAN_MEMORY_CONNECTION_STRING SQLite connection string for durable memory In-memory

See docs/INSTALL.md for the full variable reference and profile-based setup.


Contributing

Contributions welcome! See docs/CONTRIBUTING.md for details.

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes following the existing patterns
  4. Write or update tests (target: all tests green)
  5. Submit a pull request

License

See LICENSE file for details.

Support

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
0.2.4 121 3/13/2026
0.2.3 98 3/11/2026
0.2.2 92 3/6/2026
0.2.1 87 3/6/2026
0.2.0 98 3/5/2026
0.1.9 89 3/5/2026
0.1.8 84 3/5/2026
0.1.5 94 3/5/2026
0.1.4 88 3/5/2026
0.1.3 97 3/5/2026
0.1.2 104 3/5/2026
0.1.1 92 3/5/2026
0.1.0 95 3/4/2026
0.0.9 90 3/4/2026
0.0.8 85 3/4/2026
0.0.7 88 3/4/2026
0.0.6 91 3/4/2026
0.0.5 86 3/4/2026
0.0.4 86 3/4/2026
0.0.3 95 3/3/2026