char-slop/berry
multipurpose self-modifiable agentic harness
git clone https://git.t4t.associates/char-slop/berry
0bacd13
main
1import { assert , assertEquals , assertRejects } from "@std/assert" ; 2import { createModels , type Provider } from "@earendil-works/pi-ai" ; 3import { fauxProvider } from "@earendil-works/pi-ai/providers/faux" ; 4import { MemoryStorage } from "@earendil-works/pi-durable" ; 5import { defineExtension } from "@berry/api" ; 6import { until } from "@berry/util" ; 7import { openBerry } from "./berry.ts" ; 8 9Deno . test ( "providers registered during a failed setup never replace the running load" , async () => { 10const models = createModels (); 11const berry = await openBerry ( new MemoryStorage (), models ); 12const original = { ...fauxProvider (). provider , id :"custom" }; 13const extension = ( provider :Provider ) => 14defineExtension ({ 15name :"provider" , 16initial :() => null , 17setup ( ext ) { 18ext . provider ( provider ); 19}, 20}); 21try { 22await berry . install ( extension ( original )); 23await assertRejects (() => 24berry . install ( defineExtension ({ 25 ...extension ({ ...original }), 26setup ( ext ) { 27ext . provider ({ ...original }); 28ext . provider ({ ...original , id :"new" }); 29throw new Error ( "setup failed" ); 30}, 31})) 32); 33assertEquals ( models . getProvider ( "custom" ), original ); 34assertEquals ( models . getProvider ( "new" ), undefined ); 35} finally { 36await berry . close (); 37} 38}); 39 40Deno . test ( "builtin overrides survive reload and restore originals on release" , async () => { 41const models = createModels (); 42const builtin = fauxProvider (). provider ; 43const second = { ...builtin , id :"second" }; 44models . setProvider ( builtin ); 45models . setProvider ( second ); 46const berry = await openBerry ( new MemoryStorage (), models ); 47const override = { ...builtin , name :"override" }; 48const replacement = { ...builtin , name :"replacement" }; 49const extension = ( providers :Provider []) => 50defineExtension ({ 51name :"provider" , 52initial :() => null , 53setup ( ext ) { 54for ( const provider of providers ) ext . provider ( provider ); 55}, 56}); 57try { 58await berry . install ( extension ([ override , { ...second }])); 59assertEquals ( models . getProvider ( builtin . id ), override ); 60assert ( models . getProvider ( "second" ) !== second ); 61await berry . install ( extension ([ replacement ])); 62assertEquals ( models . getProvider ( builtin . id ), replacement ); 63assertEquals ( models . getProvider ( "second" ), second ); 64berry . uninstall ( "provider" ); 65assertEquals ( models . getProvider ( builtin . id ), builtin ); 66await berry . install ( extension ([ override ])); 67} finally { 68await berry . close (); 69} 70assertEquals ( models . getProvider ( builtin . id ), builtin ); 71}); 72 73Deno . test ( "provider conflicts leave staged overrides and the running load untouched" , async () => { 74const models = createModels (); 75const builtin = fauxProvider (). provider ; 76models . setProvider ( builtin ); 77const berry = await openBerry ( new MemoryStorage (), models ); 78const owned = { ...builtin , id :"custom" }; 79try { 80await berry . install ( defineExtension ({ 81name :"owner" , 82initial :() => null , 83setup :( ext ) => ext . provider ( owned ), 84})); 85await assertRejects (() => 86berry . install ( defineExtension ({ 87name :"conflict" , 88initial :() => null , 89setup ( ext ) { 90ext . provider ({ ...builtin }); 91ext . provider ({ ...owned }); 92}, 93})) 94); 95assertEquals ( models . getProvider ( builtin . id ), builtin ); 96assertEquals ( models . getProvider ( "custom" ), owned ); 97await assertRejects (() => 98berry . install ( defineExtension ({ 99name :"owner" , 100initial :() => null , 101setup ( ext ) { 102ext . provider ({ ...builtin }); 103ext . provider ({ ...builtin }); 104}, 105})) 106); 107assertEquals ( models . getProvider ( builtin . id ), builtin ); 108assertEquals ( models . getProvider ( "custom" ), owned ); 109} finally { 110await berry . close (); 111} 112}); 113 114Deno . test ( "reload and uninstall release only the providers owned by that extension load" , async () => { 115const models = createModels (); 116const berry = await openBerry ( new MemoryStorage (), models ); 117const original = { ...fauxProvider (). provider , id :"custom" }; 118const replacement = { ...original , name :"replacement" }; 119let disposed = false ; 120try { 121await berry . install ( defineExtension ({ 122name :"provider" , 123initial :() => null , 124setup ( ext ) { 125ext . provider ( original ); 126ext . provider ({ ...original , id :"removed" }); 127ext . onDispose (() => void ( disposed = true )); 128}, 129})); 130await berry . install ( defineExtension ({ 131name :"provider" , 132initial :() => null , 133setup ( ext ) { 134ext . provider ( replacement ); 135}, 136})); 137await until (() => disposed ); 138assertEquals ( models . getProvider ( "custom" ), replacement ); 139assertEquals ( models . getProvider ( "removed" ), undefined ); 140await assertRejects (() => 141berry . install ( defineExtension ({ 142name :"other" , 143initial :() => null , 144setup ( ext ) { 145ext . provider ({ ...replacement }); 146}, 147})) 148); 149assertEquals ( models . getProvider ( "custom" ), replacement ); 150berry . uninstall ( "provider" ); 151assertEquals ( models . getProvider ( "custom" ), undefined ); 152 153await berry . install ( defineExtension ({ 154name :"provider" , 155initial :() => null , 156setup ( ext ) { 157ext . provider ( replacement ); 158}, 159})); 160assert ( models . getProvider ( "custom" )); 161} finally { 162await berry . close (); 163} 164assertEquals ( models . getProvider ( "custom" ), undefined ); 165});