retort-js
Version:
Intuitive, production-ready prompt chaining in Javascript
76 lines (75 loc) • 2.79 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.RetortInputMessage = 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();
class RetortInputMessage extends message_1.RetortMessage {
constructor(options) {
super(options);
this.inputId = options.inputId;
this.retortType = "inputMessage";
this.inputQuery = options.inputQuery;
this.promise.inputId = options.inputId;
this.promise.retortType = "inputPromise";
this.promise.inputQuery = options.inputQuery;
}
}
exports.RetortInputMessage = RetortInputMessage;
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, (content) => {
resolve(content);
});
});
let fromConsole = askQuestion((inputQuery ?? "input:").trim() + " ", fromExternal);
let contentPromise = Promise.race([fromConsole, fromExternal]);
if (push) {
let message = new RetortInputMessage({ inputId, inputQuery, role, promise: contentPromise });
conversation.messages.push(message);
message.promise.then((m) => (0, log_message_1.logMessage)(m));
}
return contentPromise;
};
}
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);
}
});
rl.question("\n" + query, (ans) => {
if (!resolved) {
resolved = true;
cleanupConsole(2);
resolve(ans);
}
});
});
}