char-slop/berry
multipurpose self-modifiable agentic harness
git clone https://git.t4t.associates/char-slop/berry
8fcdffd
main
1import type { Context } from "@earendil-works/chord" ; 2import { awaitWithContext } from "@earendil-works/chord/context" ; 3import type { 4Agent , 5AnyTask , 6ConversationId , 7RegistryReader , 8Task , 9} from "@earendil-works/pi-durable" ; 10 11/** Adapt phase agents until pi-durable supports conversation-scoped tool registration. */ 12export function conversationRegistry ( 13registry :RegistryReader , 14resolve :( agent :Agent , id :ConversationId , context :Context ) => Promise < Agent >, 15) :RegistryReader { 16return { 17subscribe :( listener ) => registry . subscribe ( listener ), 18snapshot () { 19const snapshot = registry . snapshot (); 20const tasks = new Map < string , AnyTask >(); 21type Handler = Task < unknown , { phase :string }, unknown , object >[ "definition" ][ "abort" ]; 22const wrap = ( handler :Handler ) :Handler => ( record , runtime , context ) => { 23let agent :Promise < Agent > | undefined ; 24const adapted = new Proxy ( runtime , { 25get ( target , key ) { 26if ( key === "agent" ) { 27return async ( during :Context ) => { 28const base = await target . agent ( during ); 29agent ??= resolve ( base , target . conversationId , during ); 30return await awaitWithContext ( agent , during ); 31}; 32} 33return Reflect . get ( target , key ); 34}, 35}); 36return handler ( record , adapted , context ); 37}; 38for ( const original of snapshot . tasks ()) { 39const task = original as Task < unknown , { phase :string }, unknown , object >; 40const phases = Object . fromEntries ( 41Object . entries ( task . definition . phases ). map (([ name , phase ]) => [ name , wrap ( phase )]), 42); 43tasks . set ( task . definition . name , { 44 ...task , 45definition :{ ...task . definition , phases, abort :wrap ( task . definition . abort ) }, 46}); 47} 48return { 49installed :() => snapshot . installed (), 50extension :( name ) => snapshot . extension ( name ), 51tools :() => snapshot . tools (), 52sections :() => snapshot . sections (), 53tasks :() => [ ...tasks . values ()], 54task :( name ) => tasks . get ( name ), 55}; 56}, 57}; 58}