* hackathon: Refactor Jan into an Electron app * chore: correct NextJS export output path * chore: build electron app for all production targets * fix: correct assetPrefix for production build * chore: preferences shortcut * chore: refactor * chore: refactor into ts * feature/#52-compile-plugin-with-webpack * chore: introduce renderer <=> plugins <=> main invocation * chore: suppress errors - deprecate graphql & next-auth * chore: data plugin functions * add llm support Signed-off-by: James <james@jan.ai> * chore: update plugin * chore: introduce data-plugin * chore: plugin invokes main with args and synchronously * chore: install db plugin should setup db * feature: Data Driver Plugin - Load conversations and messages from data plugin * chore: store text message sent * chore: shared core services * feature: inference service * chore: conversations ordering * adding model management service Signed-off-by: James <james@jan.ai> * chore: strict type * feature: abstract plugin preferences * chore: abstract plugin preference * Revert "chore: strict type" This reverts commit 9be188d827a0b2e081e9e04b192c323799de5bb5. * chore: base-plugin styling * feature: create and delete conversation * chore: fix plugin search & clean messages * chore: typing indicator * chore: refactor useSendChatMessage * chore: persists inserted id to in-memory messages * chore: search conversation history * add delete and download model (#189) Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> * chore: add empty state for conversation list * chore: prompt missing extension function & fix app crashes * chore: prompt user to install required plugins * chore: add launch background * chore: relaunch app on model downloaded * Jan app add installation instruction (#191) Co-authored-by: Hien To <> * Chore: rename folder web-client to app (#192) * Chore: rename folder web-client to app --------- Co-authored-by: Hien To <> * revert: add pre-install package * add progress for downloading model Signed-off-by: James <james@jan.ai> * feature: production bundle * add download progress Signed-off-by: James <james@jan.ai> * chore: add new chat function * fix: electron asar unpack modules & dynamic import * chore: fix unpack * chore: fix dev pack * Add instruction to build dmg file to README.md * init model dynamically Signed-off-by: James <james@jan.ai> --------- Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: NamH <NamNh0122@gmail.com> Co-authored-by: hiento09 <136591877+hiento09@users.noreply.github.com> Co-authored-by: Hien To <>
153 lines
4.1 KiB
JavaScript
153 lines
4.1 KiB
JavaScript
const sqlite3 = require("sqlite3").verbose();
|
|
const path = require("path");
|
|
const { app } = require("electron");
|
|
|
|
function init() {
|
|
const db = new sqlite3.Database(path.join(app.getPath("userData"), "jan.db"));
|
|
|
|
db.serialize(() => {
|
|
db.run(
|
|
"CREATE TABLE IF NOT EXISTS models ( id INTEGER PRIMARY KEY, name TEXT, image TEXT, url TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);"
|
|
);
|
|
db.run(
|
|
"CREATE TABLE IF NOT EXISTS conversations ( id INTEGER PRIMARY KEY, name TEXT, model_id INTEGER, image TEXT, message TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);"
|
|
);
|
|
db.run(
|
|
"CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY, name TEXT, conversation_id INTEGER, user TEXT, message TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);"
|
|
);
|
|
});
|
|
|
|
const stmt = db.prepare(
|
|
"INSERT INTO conversations (name, model_id, image, message) VALUES (?, ?, ?, ?)"
|
|
);
|
|
stmt.finalize();
|
|
db.close();
|
|
}
|
|
function getConversations() {
|
|
return new Promise((res) => {
|
|
const db = new sqlite3.Database(
|
|
path.join(app.getPath("userData"), "jan.db")
|
|
);
|
|
|
|
db.all(
|
|
"SELECT * FROM conversations ORDER BY created_at DESC",
|
|
(err, row) => {
|
|
res(row);
|
|
}
|
|
);
|
|
db.close();
|
|
});
|
|
}
|
|
function storeConversation(conversation) {
|
|
return new Promise((res) => {
|
|
const db = new sqlite3.Database(
|
|
path.join(app.getPath("userData"), "jan.db")
|
|
);
|
|
|
|
db.serialize(() => {
|
|
const stmt = db.prepare(
|
|
"INSERT INTO conversations (name, model_id, image, message) VALUES (?, ?, ?, ?)"
|
|
);
|
|
stmt.run(
|
|
conversation.name,
|
|
conversation.model_id,
|
|
conversation.image,
|
|
conversation.message,
|
|
function (err) {
|
|
if (err) {
|
|
// Handle the insertion error here
|
|
console.error(err.message);
|
|
res(undefined);
|
|
return;
|
|
}
|
|
const id = this.lastID;
|
|
console.log(`Record inserted successfully with ID ${id}`);
|
|
res(id);
|
|
return;
|
|
}
|
|
);
|
|
stmt.finalize();
|
|
});
|
|
|
|
db.close();
|
|
});
|
|
}
|
|
function storeMessage(message) {
|
|
return new Promise((res) => {
|
|
const db = new sqlite3.Database(
|
|
path.join(app.getPath("userData"), "jan.db")
|
|
);
|
|
|
|
db.serialize(() => {
|
|
const stmt = db.prepare(
|
|
"INSERT INTO messages (name, conversation_id, user, message) VALUES (?, ?, ?, ?)"
|
|
);
|
|
stmt.run(
|
|
message.name,
|
|
message.conversation_id,
|
|
message.user,
|
|
message.message,
|
|
function (err) {
|
|
if (err) {
|
|
// Handle the insertion error here
|
|
console.error(err.message);
|
|
res(undefined);
|
|
return;
|
|
}
|
|
const id = this.lastID;
|
|
console.log(`Record inserted successfully with ID ${id}`);
|
|
res(id);
|
|
return;
|
|
}
|
|
);
|
|
stmt.finalize();
|
|
});
|
|
|
|
db.close();
|
|
});
|
|
}
|
|
function deleteConversation(id) {
|
|
return new Promise((res) => {
|
|
const db = new sqlite3.Database(
|
|
path.join(app.getPath("userData"), "jan.db")
|
|
);
|
|
|
|
db.serialize(() => {
|
|
const deleteConv = db.prepare("DELETE FROM conversations WHERE id = ?");
|
|
deleteConv.run(id);
|
|
deleteConv.finalize();
|
|
const deleteMessages = db.prepare(
|
|
"DELETE FROM messages WHERE conversation_id = ?"
|
|
);
|
|
deleteMessages.run(id);
|
|
deleteMessages.finalize();
|
|
res([]);
|
|
});
|
|
|
|
db.close();
|
|
});
|
|
}
|
|
|
|
function getConversationMessages(conversation_id) {
|
|
return new Promise((res) => {
|
|
const db = new sqlite3.Database(
|
|
path.join(app.getPath("userData"), "jan.db")
|
|
);
|
|
|
|
const query = `SELECT * FROM messages WHERE conversation_id = ${conversation_id} ORDER BY created_at DESC`;
|
|
db.all(query, (err, row) => {
|
|
res(row);
|
|
});
|
|
db.close();
|
|
});
|
|
}
|
|
|
|
module.exports = {
|
|
init,
|
|
getConversations,
|
|
deleteConversation,
|
|
storeConversation,
|
|
storeMessage,
|
|
getConversationMessages,
|
|
};
|