UNPKG

@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
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); }