@forgeflowai/chat
Version:
This is an embeddable Chat widget for n8n. It allows the execution of AI-Powered Workflows through a Chat window.
91 lines (90 loc) • 4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ChatPlugin = void 0;
var _vue = require("vue");
var _uuid = require("uuid");
var _eventBuses = require("@forgeflowai/chat/event-buses");
var api = _interopRequireWildcard(require("@forgeflowai/chat/api"));
var _constants = require("@forgeflowai/chat/constants");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
const ChatPlugin = exports.ChatPlugin = {
install(app, options) {
app.provide(_constants.ChatOptionsSymbol, options);
const messages = (0, _vue.ref)([]);
const currentSessionId = (0, _vue.ref)(null);
const waitingForResponse = (0, _vue.ref)(false);
const initialMessages = (0, _vue.computed)(() => (options.initialMessages ?? []).map(text => ({
id: (0, _uuid.v4)(),
text,
sender: "bot",
createdAt: /* @__PURE__ */new Date().toISOString()
})));
async function sendMessage(text) {
const sentMessage = {
id: (0, _uuid.v4)(),
text,
sender: "user",
createdAt: /* @__PURE__ */new Date().toISOString()
};
messages.value.push(sentMessage);
waitingForResponse.value = true;
void (0, _vue.nextTick)(() => {
_eventBuses.chatEventBus.emit("scrollToBottom");
});
const sendMessageResponse = await api.sendMessage(text, currentSessionId.value, options);
let textMessage = sendMessageResponse.output ?? sendMessageResponse.text ?? "";
if (textMessage === "" && Object.keys(sendMessageResponse).length > 0) {
try {
textMessage = JSON.stringify(sendMessageResponse, null, 2);
} catch (e) {}
}
const receivedMessage = {
id: (0, _uuid.v4)(),
text: textMessage,
sender: "bot",
createdAt: /* @__PURE__ */new Date().toISOString()
};
messages.value.push(receivedMessage);
waitingForResponse.value = false;
void (0, _vue.nextTick)(() => {
_eventBuses.chatEventBus.emit("scrollToBottom");
});
}
async function loadPreviousSession() {
if (!options.loadPreviousSession) {
return;
}
const sessionId = localStorage.getItem(_constants.localStorageSessionIdKey) ?? (0, _uuid.v4)();
const previousMessagesResponse = await api.loadPreviousSession(sessionId, options);
const timestamp = /* @__PURE__ */new Date().toISOString();
messages.value = (previousMessagesResponse?.data || []).map((message, index) => ({
id: `${index}`,
text: message.kwargs.content,
sender: message.id.includes("HumanMessage") ? "user" : "bot",
createdAt: timestamp
}));
if (messages.value.length) {
currentSessionId.value = sessionId;
}
return sessionId;
}
async function startNewSession() {
currentSessionId.value = (0, _uuid.v4)();
localStorage.setItem(_constants.localStorageSessionIdKey, currentSessionId.value);
}
const chatStore = {
initialMessages,
messages,
currentSessionId,
waitingForResponse,
loadPreviousSession,
startNewSession,
sendMessage
};
app.provide(_constants.ChatSymbol, chatStore);
app.config.globalProperties.$chat = chatStore;
}
};