@reliverse/rse-sdk
Version:
@reliverse/rse-sdk allows you to create new plugins for @reliverse/rse CLI, interact with reliverse.org, and even extend your own CLI functionality (you may also try @reliverse/dler-sdk for this case).
97 lines (96 loc) • 2.89 kB
JavaScript
import { re } from "@reliverse/relico";
import { inputPrompt, msg } from "@reliverse/rempts";
import { streamText } from "ai";
import { EXIT_KEYWORDS, MODEL } from "./ai-const.js";
import { agentRelinter } from "./relinter/relinter.js";
const messages = [];
export async function aiChat(config) {
while (true) {
const userInput = await getUserInput();
const parsedInput = parseUserInput(userInput);
if (parsedInput.hasRelinter) {
await handleRelinterFlow(config, parsedInput);
} else {
await handleNormalChatFlow(userInput);
}
if (shouldExit(userInput)) {
break;
}
}
}
async function getUserInput() {
const input = await inputPrompt({ title: "You:", symbol: "info" });
return input.trim();
}
function parseUserInput(userInput) {
const tokens = userInput.split(/\s+/);
let hasRelinter = false;
const paths = [];
const taskParts = [];
for (const rawToken of tokens) {
const token = removeTrailingPunctuation(rawToken);
if (token.toLowerCase() === "@relinter") {
hasRelinter = true;
continue;
}
if (looksLikePath(token)) {
paths.push(token);
continue;
}
taskParts.push(token);
}
return {
hasRelinter,
paths,
task: taskParts.join(" ").trim()
};
}
function removeTrailingPunctuation(token) {
return token.replace(/[.,!?;:]+$/, "");
}
function looksLikePath(token) {
return token.includes("/") || token.includes("\\") || /\.(jsx?|tsx?)$/i.test(token);
}
async function handleRelinterFlow(config, parsedInput) {
const { hasRelinter, paths, task } = parsedInput;
if (!hasRelinter) return;
const finalPaths = paths.length > 0 ? paths : ["."];
await agentRelinter(config, finalPaths, task);
}
async function handleNormalChatFlow(userInput) {
messages.push({ role: "user", content: userInput });
console.log(`${re.dim("\u2139")} ${re.bold("rse")}`);
try {
const result = streamText({
model: MODEL,
messages,
system: "You are a professional software developer. Your name is rse"
});
let assistantResponse = "";
process.stdout.write(re.dim("\u2502 "));
for await (const delta of result.textStream) {
const lines = delta.split("\n");
for (let i = 0; i < lines.length; i++) {
if (i > 0) {
console.log();
process.stdout.write(re.dim("\u2502 "));
}
process.stdout.write(lines[i] ?? "");
}
assistantResponse += delta;
}
console.log();
msg({ type: "M_BAR" });
messages.push({ role: "assistant", content: assistantResponse });
} catch (error) {
console.error(
"Error:",
error instanceof Error ? error.message : String(error)
);
msg({ type: "M_BAR", borderColor: "dim" });
}
}
function shouldExit(userInput) {
const lower = userInput.toLowerCase();
return EXIT_KEYWORDS.some((keyword) => keyword === lower);
}