retort-js
Version:
Intuitive, production-ready prompt chaining in Javascript
68 lines (67 loc) • 2.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.defineInput = exports.inputStore = void 0;
const id_1 = require("./id");
const log_message_1 = require("./log-message");
const message_1 = require("./message");
const readline_1 = __importDefault(require("readline"));
exports.inputStore = new Map();
function defineInput(conversation, role, push) {
return function input(inputSettings) {
const inputId = (0, id_1.id)("input");
const inputQuery = inputSettings?.query;
let fromExternal = new Promise((resolve) => {
exports.inputStore.set(inputId, (value) => {
resolve(new message_1.RetortMessage({ role, content: value }));
});
});
let fromConsole = askQuestion((inputQuery ?? "input:").trim() + " ", fromExternal).then((content) => {
return new message_1.RetortMessage({ role, content });
});
let m = Promise.race([fromConsole, fromExternal]);
m.inputId = inputId;
m.retortType = "inputPromise";
m.inputQuery = inputQuery;
if (push) {
conversation.messagePromises.push(m);
m.then((m) => (0, log_message_1.logMessage)(m));
}
return m;
};
}
exports.defineInput = defineInput;
function askQuestion(query, answeredElsewhere) {
let hasBeenCleanedUp = false;
function cleanupConsole(linesToCleanUp = 1) {
if (!hasBeenCleanedUp) {
hasBeenCleanedUp = true;
readline_1.default.moveCursor(process.stdout, 0, -linesToCleanUp);
readline_1.default.clearScreenDown(process.stdout);
rl.close();
}
}
const rl = readline_1.default.createInterface({
input: process.stdin,
output: process.stdout,
});
var resolved = false;
return new Promise((resolve) => {
answeredElsewhere.then((ans) => {
if (!resolved) {
resolved = true;
cleanupConsole(1);
resolve(ans.content);
}
});
rl.question("\n" + query, (ans) => {
if (!resolved) {
resolved = true;
cleanupConsole(2);
resolve(ans);
}
});
});
}