diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..2700ec4
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,49 @@
+module.exports = {
+ env: {
+ browser: true,
+ es2021: true,
+ },
+ extends: [
+ 'plugin:vue/vue3-essential',
+ 'airbnb-base',
+ ],
+ overrides: [],
+ parserOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ },
+ plugins: [
+ 'vue',
+ ],
+ rules: {
+ 'vue/multi-word-component-names': ['error', {
+ ignores: ['Chat'],
+ }],
+ 'import/no-unresolved': 'off',
+ indent: ['error', 4, { SwitchCase: 1 }],
+ 'max-len': [
+ 'error', {
+ code: 150,
+ ignoreStrings: true,
+ ignoreTemplateLiterals: true,
+ ignoreComments: true,
+ },
+ ],
+ 'linebreak-style': 0,
+ 'arrow-parens': [2, 'as-needed', { requireForBlockBody: true }],
+ 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }],
+ 'no-console': 'off',
+ 'import/extensions': 'off',
+ 'no-use-before-define': [
+ 'error', {
+ functions: false,
+ },
+ ],
+ 'no-promise-executor-return': 'off',
+ 'no-param-reassign': 'off',
+ 'no-continue': 'off',
+ 'no-restricted-syntax': 'off',
+ 'no-undef': 'off',
+ 'import/prefer-default-export': 'off',
+ },
+};
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..03d9549
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app.vue b/app.vue
index c547314..8408e2c 100644
--- a/app.vue
+++ b/app.vue
@@ -7,7 +7,12 @@
diff --git a/components/Chat.vue b/components/Chat.vue
index a3a3dbe..7eef77c 100644
--- a/components/Chat.vue
+++ b/components/Chat.vue
@@ -4,11 +4,11 @@ import { marked } from 'marked';
import DOMPurify from 'isomorphic-dompurify';
import hljs from 'highlight.js';
import { v4 as uuidv4 } from 'uuid';
+import { storeToRefs } from 'pinia';
import BingIcon from '~/components/Icons/BingIcon.vue';
import GPTIcon from '~/components/Icons/GPTIcon.vue';
import ClientDropdown from '~/components/Chat/ClientDropdown.vue';
import ClientSettings from '~/components/Chat/ClientSettings.vue';
-import { storeToRefs } from 'pinia';
marked.setOptions({
silent: true,
@@ -60,13 +60,6 @@ const inputRows = computed(() => {
return Math.min(newlines + 1, 7);
});
-// watch inputRows for change and call `setChatContainerHeight` to adjust height
-watch(inputRows, () => {
- nextTick(() => {
- setChatContainerHeight();
- });
-});
-
const scrollToBottom = () => {
messagesContainerElement.value.scrollTop = messagesContainerElement.value.scrollHeight;
};
@@ -163,18 +156,18 @@ const sendMessage = async (input) => {
throw new Error(`Failed to send message. HTTP ${response.status} - ${response.statusText}`);
},
onclose() {
- throw new Error(`Failed to send message. Server closed the connection unexpectedly.`);
+ throw new Error('Failed to send message. Server closed the connection unexpectedly.');
},
onerror(err) {
throw err;
},
- onmessage(message) {
- if (message.data === '[DONE]') {
+ onmessage(eventMessage) {
+ if (eventMessage.data === '[DONE]') {
processingController.value.abort();
return;
}
- if (message.event === 'result') {
- const result = JSON.parse(message.data);
+ if (eventMessage.event === 'result') {
+ const result = JSON.parse(eventMessage.data);
if (result.jailbreakConversationId) {
conversationData.value = {
jailbreakConversationId: result.jailbreakConversationId,
@@ -208,15 +201,15 @@ const sendMessage = async (input) => {
nextTick().then(() => scrollToBottom());
return;
}
- if (message.event === 'error') {
- const data = JSON.parse(message.data);
- botMessage.text = data.error || 'An error occurred. Please try again.';
+ if (eventMessage.event === 'error') {
+ const eventMessageData = JSON.parse(eventMessage.data);
+ botMessage.text = eventMessageData.error || 'An error occurred. Please try again.';
botMessage.error = true;
- botMessage.raw = data;
+ botMessage.raw = eventMessageData;
nextTick().then(() => scrollToBottom());
return;
}
- botMessage.text += JSON.parse(message.data);
+ botMessage.text += JSON.parse(eventMessage.data);
nextTick().then(() => scrollToBottom());
},
});
@@ -237,7 +230,10 @@ const setChatContainerHeight = () => {
const footerElementHeight = document.querySelector('footer').offsetHeight;
const inputContainerElementHeight = inputContainerElement.value.offsetHeight;
const heightOffset = window.document.documentElement.clientHeight - window.innerHeight + 50;
- const containerHeight = window.document.documentElement.clientHeight - (headerElementHeight + footerElementHeight) - inputContainerElementHeight - (heightOffset / 2);
+ const containerHeight = window.document.documentElement.clientHeight
+ - (headerElementHeight + footerElementHeight)
+ - inputContainerElementHeight
+ - (heightOffset / 2);
// set container height
messagesContainerElement.value.style.height = `${containerHeight}px`;
// move input container element bottom down
@@ -295,6 +291,13 @@ if (!process.server) {
window.removeEventListener('resize', setChatContainerHeight);
stopProcessing();
});
+
+ // watch inputRows for change and call `setChatContainerHeight` to adjust height
+ watch(inputRows, () => {
+ nextTick(() => {
+ setChatContainerHeight();
+ });
+ });
}
@@ -359,7 +362,10 @@ if (!process.server) {
@@ -367,7 +373,10 @@ if (!process.server) {
v-for="response in suggestedResponses"
:key="response"
@click="sendMessage(response)"
- class="flex-1 py-2 px-3 bg-white/10 backdrop-blur-sm text-slate-300 text-sm shadow rounded transition duration-300 ease-in-out hover:bg-white/20"
+ class="
+ flex-1 py-2 px-3 bg-white/10 backdrop-blur-sm text-slate-300 text-sm
+ shadow rounded transition duration-300 ease-in-out hover:bg-white/20
+ "
>
{{ response }}
@@ -425,7 +434,10 @@ if (!process.server) {
@keydown.enter.exact.prevent="sendMessage(message)"
placeholder="Type your message here..."
:disabled="!!processingController"
- class="py-4 pl-14 pr-14 rounded-l-sm text-slate-100 w-full bg-white/5 backdrop-blur-sm placeholder-white/40 focus:outline-none resize-none placeholder:truncate"
+ class="
+ py-4 pl-14 pr-14 rounded-l-sm text-slate-100 w-full bg-white/5 backdrop-blur-sm
+ placeholder-white/40 focus:outline-none resize-none placeholder:truncate
+ "
:class="{
'opacity-50 cursor-not-allowed': !!processingController,
}"
diff --git a/components/Chat/ClientDropdown.vue b/components/Chat/ClientDropdown.vue
index f1fdef8..0117142 100644
--- a/components/Chat/ClientDropdown.vue
+++ b/components/Chat/ClientDropdown.vue
@@ -1,8 +1,8 @@
+