mahler
Version:
A automated task composer and HTN based planner for building autonomous system agents
80 lines (79 loc) • 3.07 kB
TypeScript
import type { Path, PathType } from '../path';
import type { Context } from './context';
import type { Ref } from '../ref';
import type { AnyOp, Update, Create } from '../operation';
interface Instance<TState, TPath extends PathType, TOp extends AnyOp> {
/**
* The identifier for the task
*/
readonly id: string;
/**
* The actual path that this instance applies to
*/
readonly path: Path<TPath>;
/**
* The target for the instruction
*/
readonly target: TOp extends Update | Create ? Context<TState, TPath, TOp>['target'] : undefined;
/**
* THe instanced description for this instance
*/
readonly description: string;
/**
* A pre-condition that needs to be met before the instance can be used
*/
condition(s: TState): boolean;
}
/** An action task that has been applied to a specific context */
export interface Action<TState = any, TPath extends PathType = any, TOp extends AnyOp = any> extends Instance<TState, TPath, TOp> {
readonly _tag: 'action';
effect(s: Ref<TState>): void;
/**
* Run the action
*/
(s: Ref<TState>): Promise<void>;
}
export declare const MethodExpansion: {
SEQUENTIAL: "sequential";
DETECT: "detect";
};
export type MethodExpansion = (typeof MethodExpansion)[keyof typeof MethodExpansion];
/** A method task that has been applied to a specific context */
export interface Method<TState = any, TPath extends PathType = any, TOp extends AnyOp = any> extends Instance<TState, TPath, TOp> {
readonly _tag: 'method';
/**
* The method expansion. The default is 'detect', meaning the planner will try to execute
* the instructions returned by the method in parallel and go back to sequential expansion
* if conflicts are detected. If sequential is chosen, the planner will jump straight to
* sequential expansion. This is a workaround to handle those cases where detection may fail
* due to instructios that read data handled by a parallel branch.
*/
readonly expansion: MethodExpansion;
/**
* The method to be called when the task is executed
* if the method returns an empty list, this means the procedure is not applicable
*/
(s: TState): Instruction<TState> | Array<Instruction<TState>>;
}
export type Instruction<TState = any, TPath extends PathType = any, TOp extends AnyOp = any> = Action<TState, TPath, TOp> | Method<TState, TPath, TOp>;
/**
* Check if an instruction is a method
*/
declare function isMethod<TState = any>(t: Instruction<TState>): t is Method<TState>;
/**
* Check if an instruction is an action
*/
declare function isAction<TState = any>(t: Instruction<TState>): t is Action<TState>;
declare function isEqual<TState = any>(i1: Instruction<TState>, i2: Instruction<TState>): boolean;
export declare const Method: {
is: typeof isMethod;
equals: typeof isEqual;
};
export declare const Action: {
is: typeof isAction;
equals: typeof isEqual;
};
export declare const Instruction: {
equals: typeof isEqual;
};
export {};