Files
short-video-viral-replicator/agent-studio-mini/packages/harness/src/store.ts
T

4 lines
1.2 KiB
TypeScript

import {randomUUID} from 'node:crypto'; import type {HarnessEvent,HarnessEventType} from '@agent-studio/shared';
export interface EventStore{append(sessionId:string,event:{type:HarnessEventType;runId?:string;payload:Record<string,unknown>}):HarnessEvent;listAfter(sessionId:string,cursor?:number):HarnessEvent[];subscribe(sessionId:string,listener:(event:HarnessEvent)=>void):()=>void}
export class MemoryEventStore implements EventStore{private data=new Map<string,HarnessEvent[]>();private listeners=new Map<string,Set<(e:HarnessEvent)=>void>>();constructor(private limit=1000){} append(sessionId:string,input:{type:HarnessEventType;runId?:string;payload:Record<string,unknown>}){const list=this.data.get(sessionId)??[];const event={...input,eventId:`evt_${randomUUID()}`,sessionId,timestamp:new Date().toISOString(),sequence:(list.at(-1)?.sequence??0)+1} as HarnessEvent;list.push(event);if(list.length>this.limit)list.shift();this.data.set(sessionId,list);this.listeners.get(sessionId)?.forEach(fn=>fn(event));return event}listAfter(id:string,cursor=0){return (this.data.get(id)??[]).filter(e=>e.sequence>cursor)}subscribe(id:string,fn:(e:HarnessEvent)=>void){const set=this.listeners.get(id)??new Set();set.add(fn);this.listeners.set(id,set);return()=>set.delete(fn)}}