mahler
Version:
A automated task composer and HTN based planner for building autonomous system agents
121 lines • 4.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NullLogger = void 0;
exports.readableTrace = readableTrace;
const agent_1 = require("../agent");
const planner_1 = require("../planner");
const distance_1 = require("../distance");
const DAG = require("../dag");
exports.NullLogger = {
debug: () => {
/* noop*/
},
info: () => {
/* noop*/
},
warn: () => {
/* noop*/
},
error: () => {
/* noop*/
},
};
/**
* Create a human readable tracer of events during agent runtime
*/
function readableTrace(logger) {
const log = {
...exports.NullLogger,
...logger,
};
const toLog = (o) => {
if (o.op === 'create') {
return ['create', o.path, 'with value', o.target];
}
if (o.op === 'update') {
return ['update', o.path, 'from', o.source, 'to', o.target];
}
return ['delete', o.path];
};
return function (e) {
switch (e.event) {
case 'start': {
log.info('applying new target state');
return;
}
case 'find-plan':
log.info('looking for a plan');
{
// avoid no-case-declarations
const changes = (0, distance_1.diff)(e.state, e.target);
log.debug(`pending changes:${changes.length > 0 ? '' : ' none'}`);
changes.map(toLog).forEach((change) => {
log.debug('-', ...change);
});
}
break;
case 'plan-found':
log.info(`plan found after ${e.stats.iterations} iterations in ${e.stats.time.toFixed(1)}ms`);
log.debug('will execute the following actions:');
DAG.toString(e.start, (a) => a.action.description)
.split('\n')
.map((action) => {
log.debug(action);
});
break;
case 'plan-not-found':
if (e.cause !== planner_1.SearchFailed) {
log.error('no plan found, reason:', e.cause.message ?? e.cause);
}
else {
log.warn('no plan found');
}
break;
case 'plan-timeout':
log.error(`planning timed-out after ${e.timeout}(ms), this might be a bug`);
return;
case 'plan-executed': {
log.info('plan executed successfully');
return;
}
case 'action-condition-failed': {
log.warn(`${e.action.description}: condition failed`);
return;
}
case 'action-start': {
log.info(`${e.action.description}: running ...`);
return;
}
case 'action-success': {
log.info(`${e.action.description}: success`);
return;
}
case 'action-failure': {
log.error(`${e.action.description}: failed`, e.cause);
return;
}
case 'backoff': {
log.debug(`waiting ${e.delayMs / 1000}s before re - planning`);
return;
}
case 'success': {
log.info('nothing else to do: target state reached');
return;
}
case 'failure':
if (e.cause instanceof agent_1.Failure) {
log.error(`aborting target apply after ${e.cause.tries} failed attempts`);
}
else if (e.cause instanceof agent_1.Stopped) {
log.warn('plan execution cancelled');
}
else {
log.error(`unknown error occured while applying target state:`, e?.message ?? e);
}
break;
default:
break;
}
};
}
//# sourceMappingURL=logger.js.map