Prospero: een nieuwe coding harness voor een beschaafder tijdperk

Prospero is geschreven in mijn C++-stijl met een vlot Dear ImGui docking-interface. Het gebruikt ongeveer twee grootteordes minder middelen dan andere harnesses, zonder in te leveren op functionaliteit. Ook liefhebbers van de donkere modus zijn voorzien.

Let op dat Prospero geen ingebouwde modelproviders heeft. Deze moet je zelf aanleveren, bijvoorbeeld via llama.cpp, een on-premise model op de werkplek, OpenRouter, de Anthropic API, de OpenAI API, etc. (Je kunt je Claude-abonnement hier niet voor gebruiken).

Wat is een coding harness?

Voor wie niet bekend is met coding harnesses: in een chat-interface wisselen jij en de AI elkaar af in het schrijven van berichten. Een coding harness breidt dit concept uit door de AI in staat te stellen te "praten" met tools die door de harness worden aangeboden. Tools "antwoorden" met hun output. Een tool kan bijvoorbeeld een bestand lezen of schrijven, of een shell-commando uitvoeren. Een AI zal vervolgens zelfstandig van de ene tool-call naar de andere gaan en loopen op de resultaten. Een dergelijke AI wordt een agent genoemd. Af en toe stuurt de AI je een bericht om je op de hoogte te stellen van de voortgang of om een vraag te stellen; de chat-interface blijft dus gewoon beschikbaar.

Agenten en subagenten

Sommige harnesses, waaronder Prospero, stellen agenten in staat om subagenten aan te maken om hun wil uit te voeren, om parallel te werken of om hun context schoon te houden (zodat hun werkgeheugen niet wordt gevuld met subtaken). Agenten kunnen elkaar berichten sturen en coördineren bij taken.

Mits er SSH-toegang is tot een andere machine, of via WSL, kan Prospero een headless kopie van zichzelf implementeren op andere hosts, zodat agenten op die systemen kunnen opereren. De Professional Edition bevat engines voor combinaties van x86/x86-64 en ARM64 op macOS, Windows en Linux. De Windows x86-engine werkt zelfs op Windows XP en kan solitaire en mijnenveger spelen als je daarom vraagt.

Desktopcontrole en Headless modus

Dat laatste is mogelijk omdat Prospero een van de weinige harnesses is met desktopcontrol-mogelijkheden. Als je model vision ondersteunt — wat elk model dat de moeite waard is inmiddels doet — dan kan het je bureaublad "zien" en ermee communiceren. Het kan klikken, typen en slepen om GUI-applicaties live te testen en te debuggen, zonder dat daar een gespecialiseerde, per-app MCP-assistent voor nodig is.

Deze headless engine is de reden waarom geen TUI (Text User Interface) nodig is. De harness-engine draait op het headless systeem, en de UI draait op je desktop of laptop. Met een kleine extra configuratie kan de harness volledig onafhankelijk van de GUI draaien, zodat hij doorgaat wanneer het GUI-systeem niet is aangesloten; je kunt later weer opnieuw verbinden.

Omdat Prospero zo licht is, is het mogelijk een van de enige harnesses die een fuzz-campagne kan aansturen, vooral op een headless systeem, zonder dat de Linux OOM-killer (Out Of Memory) de geheugenvretende harness aanvalt in plaats van het ongecontroleerde fuzz-doel dat de crash veroorzaakte. Te vaak heb ik uren later gecontroleerd hoe een fuzz-campagne verliep, om erachter te komen dat er niets was bereikt omdat het harness-proces was beëindigd. (Waarom zou je een agent een fuzz-campagne laten runnen? Omdat hij ontdekte bugs on the fly kan repareren en de campagne gaande kan houden!)

Configuratie

De configuratie bevindt zich in ~/.config/prospero/prospero.ini. Deze is eenvoudig te bewerken. Geen JSON, gelukkig. Je kunt het in versiebeheer zetten of simpelweg kopiëren en plakken. Alternatief kan elke instelling via de Settings-pagina in de GUI worden bereikt, zodat je het INI-bestand niet handmatig hoeft te bewerken. INI-bestanden kunnen ook naar elkaar verwijzen, waarbij niet alleen lokale bestandspaden maar ook URL's kunnen worden opgegeven:

include = https://example.com/prospero.ini

Het idee is om een live gedeelde of beheerde configuratie mogelijk te maken. Inclusies via URL zijn beperkt in wat ze kunnen instellen, met een strikte regel tegen alles wat in een shell-commando zou kunnen verschijnen. Toch is er nog steeds vertrouwen nodig, aangezien een configuratie een omgevingsvariabele kan extraheren door deze als API-sleutel te gebruiken en een endpoint aan te leveren dat hij zelf beheert.

Prospero haalt een modellenlijst en andere parameters zoals de contextgrootte op van het endpoint, maar je kunt dit zelf aanpassen. Een typische configuratie kan er als volgt uitzien:

model = falstaff/Qwen3.8-27B

[endpoint falstaff]
url = http://falstaff.local/
key = env:FALSTAFF_API_KEY

[model Qwen3.8-27B]
edit_format = replace
template.reasoning_effort = medium

[model Qwen3.8-27B-xhigh]
like = Qwen3.8-27B
template.reasoning_effort = xhigh

[web]
search = searxng
url = https://search.example.com/
key = env:EXAMPLE_API_KEY

Passieve rendering

Het ImGui-paradigma maakt doorgaans gebruik van actieve rendering, waarbij het beeld wordt ververst op de vsync, net als bij een videogame. Dit is gepast in sommige contexten, zoals interfaces binnen games. Minder zo voor grotendeels statische, tekstgeoriënteerde UI's zoals een coding harness. In plaats daarvan gebruikt Prospero passieve rendering met settle frames om animaties te voltooien voordat hij in ruststand gaat. Wanneer er niets te doen is, doet Prospero niets. Het belast de GPU niet terwijl de agent wacht op een build.

"Never wait forever"

Een irritatie bij de meeste andere harnesses is hoe gemakkelijk ze vastlopen. Ik start een langdurige taak, ga slapen, en ontdek 's ochtends dat de harness om twee uur 's nachts is blijven hangen op een triviaal probleem, waardoor de rest van de tijd is verspild. Daarom is het belangrijkste ontwerpprincipe van Prospero: Never wait forever.

Elke operatie heeft een deadline. Deze beslissing beïnvloedt alles. Als je er niet bent om een gevraagde machtiging te verlenen, krijgt de agent een weigering door time-out en moet hij zonder doen. Om te helpen, geeft Prospero een systeemmelding (toast) wanneer een agent je aandacht nodig heeft, zodat je dit minder snel mist als je aanwezig bent.

De harness zelf ploegt door intermitterende fouten heen en doet zijn best om de agent naar de voltooiing van zijn taak te drijven. Alle netwerkverzoeken hebben time-outs en watchdogs voorkomen oneindig wachten. Agent-mailboxen zijn begrensd. Shell-commando's die hun time-out bereiken, worden omgezet in asynchrone achtergrondcommando's. De agent kan hier met een time-out op blijven wachten en wordt op regelmatige intervallen gewekt om te beslissen of hij moet doorgaan.

De enige uitzondering is de Plan-modus, waarin de agent onbeperkt wacht nadat hij een plan heeft voorgesteld of om verduidelijking heeft gevraagd (via de ask_user tool). Er wordt ervan uitgegaan dat een gebruiker de agent tijdens de Plan-modus in de gaten houdt.

Geen zwerfprocessen

Een andere regelmatige irritatie bij andere harnesses was dat agenten processen startten die nooit werden opgeruimd. Een agent start een parallelle build, bereikt een time-out omdat hij te optimistisch was, en de build "stopt" door een deel van het build-systeem te killen. Maar in werkelijkheid gaat de build gewoon door, althans gedeeltelijk. De agent probeert het opnieuw, en nu draaien er twee builds die elkaar hinderen, een puinhoop maken en mijn systeem platleggen.

Het feit dat Prospero een synchrone time-out promooteert naar een asynchrone taak is op zichzelf al een enorme verbetering, maar er is een aanvullend principe van kracht: de gehele procesboom leeft en sterft samen. Wanneer een commando wordt gestopt, wordt het gestopt. Dit is triviaal op Windows, hoewel weinig harnesses hiervan gebruik lijken te maken. Het is moeilijker op macOS en Linux, maar Prospero voert dit consistent uit.

Ingebouwde zelfhulp

Zoals elke harness ondersteunt Prospero skills: vooraf ingepakte instructies over hoe een bepaalde taak moet worden uitgevoerd. Prospero bevat een skill over zichzelf en kan zijn eigen ingebouwde documentatie lezen. Als je de agent vraagt hoe hij iets in Prospero moet doen of configureren, kan de agent niet alleen je vraag beantwoorden, maar ook een hyperlink geven die je naar de relevante plek in de UI brengt. Hij kan ook je prospero.ini bewerken en herladen om zaken namens jou te configureren. Dit is niet uniek voor Prospero, maar ik ken geen enkele andere harness die dit bijna zo goed doet.

Keuze van de shell

Op Windows is Prospero ontworpen om goed samen te werken met w64devkit en zal hij de voorkeur geven aan die shell als deze beschikbaar is. Modellen die zijn ontworpen voor coderen kennen w64devkit standaard, dus deze tools vullen elkaar aan. Natuurlijk ben je niet gebonden aan die shell en kun je vrij een andere standaard shell kiezen.

Prospero is echter een zeldzame harness waarbij je halverwege een sessie van shell kunt wisselen. Soms is PowerShell beter geschikt voor de taak, dus kun je die uit het dropdown-menu kiezen. De agent wordt op de hoogte gesteld van de wijziging en geïnformeerd over bekende eigenaardigheden (bijv. "dit is een oude Bash!"). Op macOS kun je schakelen tussen bash en zsh.

Overige functionaliteiten

Prospero beschikt over de gebruikelijke functies die je van een geavanceerde shell mag verwachten:

  • Het kan Git worktrees gebruiken, inclusief subagent worktrees, zodat agenten een repository kunnen delen.
  • Het spreekt het Model Context Protocol (MCP).
  • Het kan het web doorzoeken (indien toegestaan).
  • Je kunt zij-chats starten die context delen, gerealiseerd als subagenten.
  • Je kunt sessies forken.

Voorlopig is er geen ingebouwde terminal of editor. In plaats daarvan opent Prospero een externe terminal of editor naar keuze. Ik gebruik liever Vim dan een ingebouwd notepad.exe-equivalent. Met Ctrl+G kun je je prompt bewerken in een externe editor.

Machtigingen en beveiliging

Zoals bij alle harnesses zal het systeem van machtigingen een kwaadaardige agent niet tegenhouden. Agenten schrijven en voeren programma's uit op je computer en kunnen dus uiteindelijk alles bereiken waar de harness toegang toe heeft. Machtigingen zijn bedoeld als een vriendelijke herinnering aan je wensen en om eenvoudige fouten op te vangen. Denk aan: "Ho stop, blijf binnen het project" of "Beheer mijn bureaublad op dit moment niet". Als je een agent echt wilt uitsluiten, moet je de harness zelf beperken, bijvoorbeeld door deze in een container of op een Raspberry Pi te plaatsen.

Community Edition versus Professional

Ik ben erg enthousiast over Prospero en heb het gevoel dat het een van de beste beschikbare coding harnesses is. Het is hoe dergelijke tools gebouwd zouden moeten worden. Omdat ik meer heb geïnvesteerd dan alleen tijd in dit project, heb ik het opgesplitst in twee niveaus:

  • Community Edition: De versie die gratis op GitHub te vinden is. Deze heeft geen ingebouwde headless engines, waardoor remote deployments beperkt zijn. Daarnaast is er een kleine melding die herinnert aan het feit dat je de Community Edition gebruikt. Geschikt voor hobbyisten.
  • Professional Edition: Tegen een nominale vergoeding krijg je een DRM-vrije download met gratis updates. Alle headless engines zijn ingebouwd, zodat je met één druk op de knop remote deployments en remote sessies op andere systemen kunt pushen. Een essentiële functie voor professionals.

In beide gevallen zijn de Windows- en macOS-builds digitaal ondertekend. Als Prospero professioneel nuttig voor je is, zelfs zonder de remote deployment-functie, word je aangemoedigd een kopie te kopen om mijn lopende kosten te ondersteunen.