type JsonObject = Record export type ActionStatus = 'done' | 'feedback' | 'failed' export type PageOutput = string | {markdown: string; body?: string} export type RoutedResult< TStatus extends string = string, TData extends JsonObject = JsonObject, > = { status: TStatus data?: TData message?: string } export type ActionResult = RoutedResult< ActionStatus, TData > & { page?: PageOutput } export type Agent< Input = unknown, Result extends RoutedResult = RoutedResult, > = (input: Input) => Result | Promise export type Selector = ( input: Input, ) => Event | Promise export type Until = ( input: Input, ) => boolean | Promise export function agent< Input = unknown, Result extends RoutedResult = RoutedResult, >(fn: Agent): Agent { return fn } export function select( fn: Selector, ): Selector { return fn } export function until(fn: Until): Until { return fn }