@autobe/agent
Version:
AI backend server code generator
127 lines (116 loc) • 4.23 kB
text/typescript
import {
AutoBeEvent,
AutoBeHistory,
IAutoBeGetFilesOptions,
} from "@autobe/interface";
import { AutoBeTokenUsage } from "./context/AutoBeTokenUsage";
import { emplaceMap } from "./utils/emplaceMap";
/**
* Base class for AutoBE agents providing event subscription capabilities.
*
* Implements Observer pattern with type-safe event handling through generic
* event type mapping.
*
* @author Samchon
*/
export abstract class AutoBeAgentBase {
/** @internal */
private readonly listeners_: Map<
string,
Set<(event: AutoBeEvent) => Promise<void> | void>
>;
public constructor() {
this.listeners_ = new Map();
}
/**
* Retrieves all generated files from the current development session.
*
* Transforms the development process into deployable artifacts including
* requirements documentation, database schemas, API specifications, NestJS
* implementation code, and test suites. The generated files represent a fully
* functional backend application ready for deployment.
*
* @param options Configuration specifying database system and code generation
* preferences
* @returns Promise resolving to file paths mapped to complete file contents
*/
public abstract getFiles(
options?: Partial<IAutoBeGetFilesOptions>,
): Promise<Record<string, string>>;
/**
* Retrieves the complete conversation and development history.
*
* Returns chronologically ordered record of all events including user
* messages, assistant responses, development activities, and progress events.
* This history enables conversation replay and development process analysis.
*
* @returns Array of all history records from session start
*/
public abstract getHistories(): AutoBeHistory[];
/**
* Retrieves comprehensive AI token usage statistics for the current session.
*
* Returns detailed breakdown of token consumption across all specialized
* agents and processing phases, enabling cost monitoring and performance
* analysis. Includes aggregate totals and component-specific breakdowns.
*
* @returns Token usage statistics with breakdowns by agent and operation type
*/
public abstract getTokenUsage(): AutoBeTokenUsage;
/**
* Registers an event listener for specific development phase events.
*
* Enables real-time notifications about conversation flow, development
* progress, and completion events. The type-safe event system ensures
* listeners receive properly typed events corresponding to their registration
* type.
*
* @param type Event type to listen for
* @param listener Callback function receiving the typed event when fired
* @returns This instance for method chaining
*/
public on<Type extends AutoBeEvent.Type>(
type: Type,
listener: (event: AutoBeEvent.Mapper[Type]) => Promise<void> | void,
): this {
emplaceMap(this.listeners_, type, () => new Set()).add(
// biome-ignore lint: intended
listener as (event: AutoBeEvent) => any,
);
return this;
}
/**
* Unregisters a previously registered event listener.
*
* Removes the specified listener from the notification system. The listener
* function reference must exactly match the function originally registered
* with {@link on} for successful removal.
*
* @param type Event type the listener was registered for
* @param listener The exact listener function reference to remove
* @returns This instance for method chaining
*/
public off<Type extends AutoBeEvent.Type>(
type: Type,
listener: (event: AutoBeEvent.Mapper[Type]) => Promise<void> | void,
): this {
const set = this.listeners_.get(type);
if (set === undefined) return this;
// biome-ignore lint: intended
set.delete(listener as (event: AutoBeEvent) => any);
if (set.size === 0) this.listeners_.delete(type);
return this;
}
/** @internal */
protected async dispatch(event: AutoBeEvent): Promise<void> {
const set = this.listeners_.get(event.type);
if (set === undefined) return;
await Promise.all(
Array.from(set).map(async (listener) => {
try {
await listener(event);
} catch {}
}),
);
}
}