UNPKG

retort-js

Version:

Intuitive, production-ready prompt chaining in Javascript

76 lines (75 loc) 2.79 kB
"use strict"; 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); } }); }); }