import { AgentError } from './errors.ts'; export type ObserveFunction = (data: T, ...rest: unknown[]) => void; export class Observable { observers: ObserveFunction[]; constructor() { this.observers = []; } subscribe(func: ObserveFunction) { this.observers.push(func); } unsubscribe(func: ObserveFunction) { this.observers = this.observers.filter(observer => observer !== func); } notify(data: T, ...rest: unknown[]) { this.observers.forEach(observer => observer(data, ...rest)); } } export type AgentLog = | { message: string; level: 'warn' | 'info'; } | { message: string; level: 'error'; error: AgentError; }; export class ObservableLog extends Observable { constructor() { super(); } print(message: string, ...rest: unknown[]) { this.notify({ message, level: 'info' }, ...rest); } warn(message: string, ...rest: unknown[]) { this.notify({ message, level: 'warn' }, ...rest); } error(message: string, error: AgentError, ...rest: unknown[]) { this.notify({ message, level: 'error', error }, ...rest); } }