Skip to content

Commit 4f148b0

Browse files
committed
multiple torchy tabs + a bunch of other improvements
1 parent 4dd9ad8 commit 4f148b0

File tree

5 files changed

+1034
-506
lines changed

5 files changed

+1034
-506
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
const DB_NAME = 'ai-integration-db';
2+
const DB_VERSION = 2;
3+
const SESSIONS_STORE = 'sessions';
4+
const METADATA_STORE = 'metadata';
5+
6+
let db;
7+
8+
function openDB() {
9+
return new Promise((resolve, reject) => {
10+
if (db) {
11+
return resolve(db);
12+
}
13+
14+
const request = indexedDB.open(DB_NAME, DB_VERSION);
15+
16+
request.onerror = (event) => {
17+
console.error("IndexedDB error:", event.target.error);
18+
reject("Error opening DB");
19+
};
20+
21+
request.onsuccess = (event) => {
22+
db = event.target.result;
23+
resolve(db);
24+
};
25+
26+
request.onupgradeneeded = (event) => {
27+
const db = event.target.result;
28+
const transaction = event.target.transaction;
29+
let sessionsStore;
30+
31+
if (!db.objectStoreNames.contains(SESSIONS_STORE)) {
32+
sessionsStore = db.createObjectStore(SESSIONS_STORE, { keyPath: 'id' });
33+
} else {
34+
sessionsStore = transaction.objectStore(SESSIONS_STORE);
35+
}
36+
37+
if (!db.objectStoreNames.contains(METADATA_STORE)) {
38+
db.createObjectStore(METADATA_STORE, { keyPath: 'key' });
39+
}
40+
41+
if (event.oldVersion < 2) {
42+
if (!sessionsStore.indexNames.contains('projectId')) {
43+
sessionsStore.createIndex('projectId', 'projectId', { unique: false });
44+
}
45+
// Migrate existing data from v1 to have a default projectId
46+
sessionsStore.openCursor().onsuccess = (e) => {
47+
const cursor = e.target.result;
48+
if (cursor) {
49+
const record = cursor.value;
50+
if (typeof record.projectId === 'undefined') {
51+
record.projectId = '0'; // Assign default project ID
52+
cursor.update(record);
53+
}
54+
cursor.continue();
55+
}
56+
};
57+
}
58+
};
59+
});
60+
}
61+
62+
export async function saveSession(sessionData) {
63+
const db = await openDB();
64+
const transaction = db.transaction(SESSIONS_STORE, 'readwrite');
65+
const store = transaction.objectStore(SESSIONS_STORE);
66+
67+
store.put(sessionData);
68+
return transaction.complete;
69+
}
70+
71+
export async function deleteSession(sessionId) {
72+
const db = await openDB();
73+
const transaction = db.transaction(SESSIONS_STORE, 'readwrite');
74+
const store = transaction.objectStore(SESSIONS_STORE);
75+
store.delete(sessionId);
76+
return transaction.complete;
77+
}
78+
79+
export async function loadSessionsForProject(projectId) {
80+
const db = await openDB();
81+
const transaction = db.transaction(SESSIONS_STORE, 'readonly');
82+
const store = transaction.objectStore(SESSIONS_STORE);
83+
const index = store.index('projectId');
84+
return new Promise((resolve, reject) => {
85+
const request = index.getAll(projectId);
86+
request.onerror = event => reject("Error loading sessions for project " + projectId);
87+
request.onsuccess = event => resolve(event.target.result);
88+
});
89+
}
90+
91+
export async function saveMetadata(key, value) {
92+
const db = await openDB();
93+
const transaction = db.transaction(METADATA_STORE, 'readwrite');
94+
const store = transaction.objectStore(METADATA_STORE);
95+
store.put({ key, value });
96+
return transaction.complete;
97+
}
98+
99+
export async function loadMetadata(key) {
100+
const db = await openDB();
101+
const transaction = db.transaction(METADATA_STORE, 'readonly');
102+
const store = transaction.objectStore(METADATA_STORE);
103+
return new Promise((resolve, reject) => {
104+
const request = store.get(key);
105+
request.onerror = event => reject(`Error loading metadata for key: ${key}`);
106+
request.onsuccess = event => resolve(event.target.result ? event.target.result.value : undefined);
107+
});
108+
}

src/addons/addons/ai-integration/helpers/helpers.js

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -96,26 +96,13 @@ export default class helpers {
9696
document.getElementById('Context_Selector_select').children[0].disabled = true;
9797
document.getElementById('Context_Selector_select').children.innerText = "Code Chunk";
9898
}
99-
static messageErrorOccured(messageContents) {
100-
document.AI_INTEGRATION.chatHistory.push({ "role": "user", "message": messageContents });
101-
//document.AI_INTEGRATION.chatHistory.push({ "role": "assistant", "message": "Error reading response" }); //not sure if the AI needs to know that it failed
102-
103-
helpers.disableCodeChunkAttachment();
104-
105-
document.AI_INTEGRATION.AI_currently_blabbering = false;
106-
if (document.getElementById('currentlyBlabberingOnThis') != null) {
107-
document.getElementById('currentlyBlabberingOnThis').innerHTML = "<h1 class=\"errorMessage\">Error reading response</h1>";
108-
document.getElementById('currentlyBlabberingOnThis').className = 'message';
109-
} else {
110-
document.getElementById('AI_is_thinking_what_to_blabber').remove();
111-
if (document.getElementById("currentlyBlabberingOnThis") != null) { //fixes a glitch
112-
document.getElementById("currentlyBlabberingOnThis").remove();
113-
}
114-
var aiMessage = document.createElement('div');
115-
aiMessage.className = 'ai-message';
116-
aiMessage.innerHTML = `<p class="message" id="currentlyBlabberingOnThis" class=\"errorMessage\">Error reading response</p>`;
117-
document.getElementById('chat_content').appendChild(aiMessage);
99+
static messageErrorOccured(messageContents, session) {
100+
if (!session) {
101+
console.error("messageErrorOccured called without a session.");
102+
return;
118103
}
104+
session.chatHistory.push({ "role": "user", "message": messageContents });
105+
session.isBlabbering = false;
119106
}
120107

121108
static isFirstRequest = true;
@@ -260,4 +247,4 @@ export default class helpers {
260247

261248
return xmlString.replace(/>\s+</g, '><').trim();
262249
}
263-
}
250+
}

0 commit comments

Comments
 (0)