diff --git a/src/App.svelte b/src/App.svelte
index df57dc04..9a373b55 100644
--- a/src/App.svelte
+++ b/src/App.svelte
@@ -1,7 +1,7 @@
diff --git a/src/lib/ChatScreens/AdvancedChatEditor.svelte b/src/lib/ChatScreens/AdvancedChatEditor.svelte
index e5948176..4f511f35 100644
--- a/src/lib/ChatScreens/AdvancedChatEditor.svelte
+++ b/src/lib/ChatScreens/AdvancedChatEditor.svelte
@@ -1,7 +1,7 @@
diff --git a/src/lib/ChatScreens/DefaultChatScreen.svelte b/src/lib/ChatScreens/DefaultChatScreen.svelte
index 37a91ed1..39b25c96 100644
--- a/src/lib/ChatScreens/DefaultChatScreen.svelte
+++ b/src/lib/ChatScreens/DefaultChatScreen.svelte
@@ -140,15 +140,13 @@
}
if(rerollid < rerolls.length - 1){
if(Array.isArray(rerolls[rerollid + 1])){
- let db = DBState.db
rerollid += 1
let rerollData = structuredClone(rerolls[rerollid])
- let msgs = db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message
+ let msgs = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message
for(let i = 0; i < rerollData.length; i++){
msgs[msgs.length - rerollData.length + i] = rerollData[i]
}
- db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message = msgs
- DBState.db = db
+ DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message = msgs
}
return
}
@@ -199,15 +197,13 @@
return
}
if(Array.isArray(rerolls[rerollid - 1])){
- let db = DBState.db
rerollid -= 1
let rerollData = structuredClone(rerolls[rerollid])
- let msgs = db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message
+ let msgs = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message
for(let i = 0; i < rerollData.length; i++){
msgs[msgs.length - rerollData.length + i] = rerollData[i]
}
- db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message = msgs
- DBState.db = db
+ DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message = msgs
}
}
diff --git a/src/lib/Playground/PlaygroundMenu.svelte b/src/lib/Playground/PlaygroundMenu.svelte
index ee91cb0f..01a0ec8b 100644
--- a/src/lib/Playground/PlaygroundMenu.svelte
+++ b/src/lib/Playground/PlaygroundMenu.svelte
@@ -8,27 +8,25 @@
import PlaygroundSyntax from "./PlaygroundSyntax.svelte";
import { findCharacterIndexbyId } from "src/ts/util";
import { characterFormatUpdate, createBlankChar } from "src/ts/characters";
- import { get } from "svelte/store";
- import { DataBase, setDatabase, type character } from "src/ts/storage/database.svelte";
+ import { DBState, type character } from "src/ts/storage/database.svelte";
import PlaygroundImageGen from "./PlaygroundImageGen.svelte";
import PlaygroundParser from "./PlaygroundParser.svelte";
import ToolConvertion from "./ToolConvertion.svelte";
- import { joinMultiuserRoom } from "src/ts/sync/multiuser";
+ import { joinMultiuserRoom } from "src/ts/sync/multiuser";
let easterEggTouch = $state(0)
const playgroundChat = () => {
- let db = get(DataBase)
const charIndex = findCharacterIndexbyId('§playground')
PlaygroundStore.set(2)
if (charIndex !== -1) {
- const char = db.characters[charIndex] as character
+ const char = DBState.db.characters[charIndex] as character
char.utilityBot = true
char.name = 'assistant'
char.firstMessage = '{{none}}'
- db.characters[charIndex] = char
+ DBState.db.characters[charIndex] = char
characterFormatUpdate(charIndex)
selectedCharID.set(charIndex)
@@ -38,8 +36,7 @@
const character = createBlankChar()
character.chaId = '§playground'
- db.characters.push(character)
- setDatabase(db)
+ DBState.db.characters.push(character)
playgroundChat()
diff --git a/src/lib/Setting/Pages/FilesSettings.svelte b/src/lib/Setting/Pages/FilesSettings.svelte
index 4a2d2cc7..c1ce5b28 100644
--- a/src/lib/Setting/Pages/FilesSettings.svelte
+++ b/src/lib/Setting/Pages/FilesSettings.svelte
@@ -2,9 +2,7 @@
import { language } from "src/lang";
import { alertConfirm } from "src/ts/alert";
import { checkDriver } from "src/ts/drive/drive";
- import { DataBase } from "src/ts/storage/database.svelte";
import { isNodeServer, isTauri } from "src/ts/storage/globalApi";
- import { persistantStorageRecommended } from "src/ts/storage/persistant";
diff --git a/src/lib/SideBars/SideChatList.svelte b/src/lib/SideBars/SideChatList.svelte
index cb901127..fbe165a8 100644
--- a/src/lib/SideBars/SideChatList.svelte
+++ b/src/lib/SideBars/SideChatList.svelte
@@ -107,7 +107,7 @@
const option = await alertChatOptions()
switch(option){
case 0:{
- const newChat = structuredClone(chara.chats[i])
+ const newChat = structuredClone($state.snapshot(chara.chats[i]))
newChat.name = `Copy of ${newChat.name}`
chara.chats.unshift(newChat)
chara.chatPage = 0
diff --git a/src/lib/SideBars/Sidebar.svelte b/src/lib/SideBars/Sidebar.svelte
index 266054b9..1abc2921 100644
--- a/src/lib/SideBars/Sidebar.svelte
+++ b/src/lib/SideBars/Sidebar.svelte
@@ -137,7 +137,7 @@
const da = db.characterOrder[mainIndex.index]
if(typeof(da) !== 'string'){
mainId = da.id
- movingFolder = structuredClone(da)
+ movingFolder = structuredClone($state.snapshot(da))
if(targetIndex.folder){
return
}
diff --git a/src/lib/UI/Realm/RealmUpload.svelte b/src/lib/UI/Realm/RealmUpload.svelte
index bc115a8f..de666c3c 100644
--- a/src/lib/UI/Realm/RealmUpload.svelte
+++ b/src/lib/UI/Realm/RealmUpload.svelte
@@ -85,7 +85,7 @@
if(!latin1.test(enNotes)){
alertError("English version of creator notes must contain only Latin-1 characters")
}
- shareRisuHub2(char, {
+ shareRisuHub2($state.snapshot(char) as character, {
anon: privateMode,
nsfw: nsfwMode,
tag: tags,
diff --git a/src/ts/alert.ts b/src/ts/alert.ts
index 878a822f..1f0cbc2c 100644
--- a/src/ts/alert.ts
+++ b/src/ts/alert.ts
@@ -3,7 +3,7 @@ import { sleep } from "./util"
import { language } from "../lang"
import { isNodeServer, isTauri } from "./storage/globalApi"
import { Capacitor } from "@capacitor/core"
-import { DataBase, type MessageGenerationInfo } from "./storage/database.svelte"
+import { getDatabase, type MessageGenerationInfo } from "./storage/database.svelte"
interface alertData{
type: 'error'|'normal'|'none'|'ask'|'wait'|'selectChar'
@@ -27,7 +27,7 @@ export const alertGenerationInfoStore = writable(n
export function alertError(msg:string){
console.error(msg)
- const db = get(DataBase)
+ const db = getDatabase()
if(typeof(msg) !== 'string'){
try{
diff --git a/src/ts/characterCards.ts b/src/ts/characterCards.ts
index ec42b872..1ddd1be0 100644
--- a/src/ts/characterCards.ts
+++ b/src/ts/characterCards.ts
@@ -1,6 +1,6 @@
import { get, writable, type Writable } from "svelte/store"
import { alertCardExport, alertConfirm, alertError, alertInput, alertMd, alertNormal, alertSelect, alertStore, alertTOS, alertWait } from "./alert"
-import { DataBase, defaultSdDataFunc, type character, setDatabase, type customscript, type loreSettings, type loreBook, type triggerscript, importPreset, type groupChat, setCurrentCharacter, getCurrentCharacter } from "./storage/database.svelte"
+import { defaultSdDataFunc, type character, setDatabase, type customscript, type loreSettings, type loreBook, type triggerscript, importPreset, type groupChat, setCurrentCharacter, getCurrentCharacter, getDatabase, setDatabaseLite } from "./storage/database.svelte"
import { checkNullish, decryptBuffer, encryptBuffer, isKnownUri, selectFileByDom, selectMultipleFile, sleep } from "./util"
import { language } from "src/lang"
import { v4 as uuidv4, v4 } from 'uuid';
@@ -52,13 +52,13 @@ async function importCharacterProcess(f:{
const data = f.data instanceof Uint8Array ? f.data : new Uint8Array(await f.data.arrayBuffer())
const da = JSON.parse(Buffer.from(data).toString('utf-8'))
if(await importCharacterCardSpec(da)){
- let db = get(DataBase)
+ let db = getDatabase()
return db.characters.length - 1
}
if((da.char_name || da.name) && (da.char_persona || da.description) && (da.char_greeting || da.first_mes)){
- let db = get(DataBase)
+ let db = getDatabase()
db.characters.push(convertOffSpecCards(da))
- DataBase.set(db)
+ setDatabaseLite(db)
alertNormal(language.importedCharacter)
return
}
@@ -68,7 +68,7 @@ async function importCharacterProcess(f:{
}
}
- let db = get(DataBase)
+ let db = getDatabase()
db.statics.imports += 1
if(f.name.endsWith('charx')){
@@ -99,7 +99,7 @@ async function importCharacterProcess(f:{
card.data.extensions.risuai.customScripts = md.regex ?? []
}
await importCharacterCardSpec(card, undefined, 'normal', reader.assets)
- let db = get(DataBase)
+ let db = getDatabase()
return db.characters.length - 1
}
@@ -193,7 +193,7 @@ async function importCharacterProcess(f:{
const decrypted = await decryptBuffer(encrypted, password)
const charaData:CharacterCardV2Risu = JSON.parse(Buffer.from(decrypted).toString('utf-8'))
if(await importCharacterCardSpec(charaData, img, "normal", assets)){
- let db = get(DataBase)
+ let db = getDatabase()
return db.characters.length - 1
}
else{
@@ -210,7 +210,7 @@ async function importCharacterProcess(f:{
try {
const charaData:CharacterCardV2Risu = JSON.parse(Buffer.from(decrypted).toString('utf-8'))
if(await importCharacterCardSpec(charaData, img, "normal", assets)){
- let db = get(DataBase)
+ let db = getDatabase()
return db.characters.length - 1
}
} catch (error) {
@@ -232,13 +232,13 @@ async function importCharacterProcess(f:{
console.log(charaData)
const imgp = await saveAsset(await reencodeImage(img))
db.characters.push(convertOffSpecCards(charaData, imgp))
- DataBase.set(db)
+ setDatabaseLite(db)
alertNormal(language.importedCharacter)
return db.characters.length - 1
}
await importCharacterCardSpec(parsed, img, "normal", assets)
- db = get(DataBase)
+ db = getDatabase()
return db.characters.length - 1
}
@@ -319,7 +319,7 @@ export async function characterURLImport() {
const importData = JSON.parse(Buffer.from(decodeURIComponent(data), 'base64').toString('utf-8'))
importData.id = v4()
- const db = get(DataBase)
+ const db = getDatabase()
if(importData.lowLevelAccess){
const conf = await alertConfirm(language.lowLevelAccessConfirm)
if(!conf){
@@ -363,7 +363,7 @@ export async function characterURLImport() {
const module = new Uint8Array(await data.arrayBuffer())
const md = await readModule(Buffer.from(module))
md.id = v4()
- const db = get(DataBase)
+ const db = getDatabase()
db.modules.push(md)
setDatabase(db)
alertNormal(language.successImport)
@@ -447,7 +447,7 @@ export async function characterURLImport() {
if(name.endsWith('risum')){
const md = await readModule(Buffer.from(data))
md.id = v4()
- const db = get(DataBase)
+ const db = getDatabase()
db.modules.push(md)
setDatabase(db)
alertNormal(language.successImport)
@@ -568,7 +568,7 @@ function convertOffSpecCards(charaData:OldTavernChar|CharacterCardV2Risu, imgp:s
}
export async function exportChar(charaID:number):Promise {
- const db = get(DataBase)
+ const db = getDatabase({snapshot: true})
let char = structuredClone(db.characters[charaID])
if(char.type === 'group'){
@@ -605,7 +605,7 @@ async function importCharacterCardSpec(card:CharacterCardV2Risu|CharacterCardV3,
const data = card.data
console.log(card)
let im = img ? await saveAsset(await reencodeImage(img)) : undefined
- let db = get(DataBase)
+ let db = getDatabase()
const risuext = structuredClone(data.extensions.risuai)
let emotions:[string, string][] = []
@@ -1434,8 +1434,8 @@ export async function shareRisuHub2(char:character, arg:{
headers: {
"Content-Type": 'image/png',
"x-risu-api-version": "4",
- "x-risu-token": get(DataBase)?.account?.token,
- 'x-risu-username': arg.anon ? '' : (get(DataBase)?.account?.id),
+ "x-risu-token": getDatabase()?.account?.token,
+ 'x-risu-username': arg.anon ? '' : (getDatabase()?.account?.id),
'x-risu-debug': 'true',
'x-risu-update-id': arg.update ? (char.realmId ?? 'null') : 'null'
}
@@ -1540,7 +1540,7 @@ export async function downloadRisuHub(id:string, arg:{
data: res.body
})
checkCharOrder()
- let db = get(DataBase)
+ let db = getDatabase()
if(db.characters[db.characters.length-1] && (db.goCharacterOnImport || arg.forceRedirect)){
const index = db.characters.length-1
characterFormatUpdate(index);
@@ -1557,7 +1557,7 @@ export async function downloadRisuHub(id:string, arg:{
await importCharacterCardSpec(data, await getHubResources(img), 'hub')
checkCharOrder()
- let db = get(DataBase)
+ let db = getDatabase()
if(db.characters[db.characters.length-1] && (db.goCharacterOnImport || arg.forceRedirect)){
const index = db.characters.length-1
characterFormatUpdate(index);
diff --git a/src/ts/characters.ts b/src/ts/characters.ts
index c23cda46..dbf1b06e 100644
--- a/src/ts/characters.ts
+++ b/src/ts/characters.ts
@@ -1,5 +1,5 @@
import { get, writable } from "svelte/store";
-import { DataBase, saveImage, setDatabase, type character, type Chat, defaultSdDataFunc, type loreBook } from "./storage/database.svelte";
+import { saveImage, setDatabase, type character, type Chat, defaultSdDataFunc, type loreBook, getDatabase } from "./storage/database.svelte";
import { alertAddCharacter, alertConfirm, alertError, alertNormal, alertSelect, alertStore, alertWait } from "./alert";
import { language } from "../lang";
import { decode as decodeMsgpack } from "msgpackr";
@@ -16,7 +16,7 @@ import { doingChat } from "./process";
import { importCharacter } from "./characterCards";
export function createNewCharacter() {
- let db = get(DataBase)
+ let db = getDatabase()
db.characters.push(createBlankChar())
setDatabase(db)
checkCharOrder()
@@ -24,7 +24,7 @@ export function createNewCharacter() {
}
export function createNewGroup(){
- let db = get(DataBase)
+ let db = getDatabase()
db.characters.push({
type: 'group',
name: "",
@@ -45,7 +45,8 @@ export function createNewGroup(){
chaId: uuidv4(),
firstMsgIndex: -1,
characterTalks: [],
- characterActive: []
+ characterActive: [],
+ realmId: ''
})
setDatabase(db)
checkCharOrder()
@@ -82,7 +83,7 @@ export async function selectCharImg(charIndex:number) {
return
}
const img = selected.data
- let db = get(DataBase)
+ let db = getDatabase()
const imgp = await saveImage(await reencodeImage(img))
dumpCharImage(charIndex)
db.characters[charIndex].image = imgp
@@ -90,7 +91,7 @@ export async function selectCharImg(charIndex:number) {
}
export function dumpCharImage(charIndex:number) {
- let db = get(DataBase)
+ let db = getDatabase()
const char = db.characters[charIndex] as character
if(!char.image || char.image === ''){
return
@@ -108,7 +109,7 @@ export function dumpCharImage(charIndex:number) {
}
export function changeCharImage(charIndex:number,changeIndex:number) {
- let db = get(DataBase)
+ let db = getDatabase()
const char = db.characters[charIndex] as character
const image = char.ccAssets[changeIndex].uri
char.ccAssets.splice(changeIndex, 1)
@@ -128,7 +129,7 @@ export async function addCharEmotion(charId:number) {
addingEmotion.set(false)
return
}
- let db = get(DataBase)
+ let db = getDatabase()
for(const f of selected){
const img = f.data
const imgp = await saveImage(img)
@@ -144,7 +145,7 @@ export async function addCharEmotion(charId:number) {
}
export async function rmCharEmotion(charId:number, emotionId:number) {
- let db = get(DataBase)
+ let db = getDatabase()
let dbChar = db.characters[charId]
if(dbChar.type !== 'group'){
dbChar.emotionImages.splice(emotionId, 1)
@@ -161,7 +162,7 @@ export async function exportChat(page:number){
const doTranslate = (mode === '2' || mode === '3') ? (await alertSelect([language.translateContent, language.doNotTranslate])) === '0' : false
const anonymous = (mode === '2' || mode === '3') ? ((await alertSelect([language.includePersonaName, language.hidePersonaName])) === '1') : false
const selectedID = get(selectedCharID)
- const db = get(DataBase)
+ const db = getDatabase()
const chat = db.characters[selectedID].chats[page]
const char = db.characters[selectedID]
const date = new Date().toJSON();
@@ -335,7 +336,7 @@ export async function importChat(){
}
try {
const selectedID = get(selectedCharID)
- let db = get(DataBase)
+ let db = getDatabase()
if(dat.name.endsWith('jsonl')){
const lines = Buffer.from(dat.data).toString('utf-8').split('\n')
@@ -412,14 +413,14 @@ export async function importChat(){
}
function formatTavernChat(chat:string, charName:string){
- const db = get(DataBase)
+ const db = getDatabase()
return chat.replace(/<([Uu]ser)>|\{\{([Uu]ser)\}\}/g, getUserName()).replace(/((\{\{)|<)([Cc]har)(=.+)?((\}\})|>)/g, charName)
}
export function characterFormatUpdate(index:number|character, arg:{
updateInteraction?:boolean,
} = {}){
- let db = get(DataBase)
+ let db = getDatabase()
let cha = typeof(index) === 'number' ? db.characters[index] : index
if(cha.chats.length === 0){
cha.chats = [{
@@ -587,7 +588,7 @@ export async function makeGroupImage() {
type: 'wait',
msg: `Loading..`
})
- const db = get(DataBase)
+ const db = getDatabase()
const charID = get(selectedCharID)
const group = db.characters[charID]
if(group.type !== 'group'){
@@ -687,7 +688,7 @@ export async function addDefaultCharacters() {
return
}
let char:character = va.data
- let db = get(DataBase)
+ let db = getDatabase()
if(char.emotionImages && char.emotionImages.length > 0){
for(let i=0;i num){
alertToast(`Changed to Preset: ${pres[num].name}`)
diff --git a/src/ts/kei/backup.ts b/src/ts/kei/backup.ts
index a1bf50e1..8fc53f45 100644
--- a/src/ts/kei/backup.ts
+++ b/src/ts/kei/backup.ts
@@ -1,10 +1,9 @@
-import { get } from "svelte/store"
import { alertNormal, alertSelect } from "../alert"
import { keiServerURL } from "./kei"
-import { DataBase, setDatabase } from "../storage/database.svelte"
+import { getDatabase, setDatabase } from "../storage/database.svelte"
export async function autoServerBackup(){
- const db = get(DataBase)
+ const db = getDatabase()
const res = await fetch(keiServerURL() + '/autobackup/list', {
method: 'POST',
headers: {
@@ -81,7 +80,7 @@ export async function autoServerBackup(){
let lastKeiSave = 0
export async function saveDbKei() {
try{
- let db = get(DataBase)
+ let db = getDatabase()
if(db.account.kei){
if(Date.now() - lastKeiSave < 60000 * 5){
return
diff --git a/src/ts/kei/kei.ts b/src/ts/kei/kei.ts
index 6324f7f1..46beda40 100644
--- a/src/ts/kei/kei.ts
+++ b/src/ts/kei/kei.ts
@@ -1,9 +1,8 @@
-import { get } from "svelte/store";
import { hubURL } from "../characterCards";
-import { DataBase } from "../storage/database.svelte";
+import { getDatabase } from "../storage/database.svelte";
export function keiServerURL(){
- const db = get(DataBase)
+ const db = getDatabase()
if(db.keiServerURL) return db.keiServerURL;
return hubURL + "/kei";
}
\ No newline at end of file
diff --git a/src/ts/model/openrouter.ts b/src/ts/model/openrouter.ts
index bad407f8..a6d6c626 100644
--- a/src/ts/model/openrouter.ts
+++ b/src/ts/model/openrouter.ts
@@ -1,9 +1,8 @@
-import { get } from "svelte/store"
-import { DataBase } from "../storage/database.svelte"
+import { getDatabase } from "../storage/database.svelte"
export async function openRouterModels() {
try {
- const db = get(DataBase)
+ const db = getDatabase()
let headers = {
"Authorization": "Bearer " + db.openrouterKey,
"Content-Type": "application/json"
diff --git a/src/ts/parser.ts b/src/ts/parser.ts
index 82cac466..f3f0806a 100644
--- a/src/ts/parser.ts
+++ b/src/ts/parser.ts
@@ -1,6 +1,6 @@
import DOMPurify from 'isomorphic-dompurify';
import markdownit from 'markdown-it'
-import { DataBase, getCurrentCharacter, setDatabase, type Database, type Message, type character, type customscript, type groupChat, type triggerscript } from './storage/database.svelte';
+import { getCurrentCharacter, getDatabase, setDatabase, type Database, type Message, type character, type customscript, type groupChat, type triggerscript } from './storage/database.svelte';
import { getFileSrc } from './storage/globalApi';
import { processScriptFull } from './process/scripts';
import { get } from 'svelte/store';
@@ -75,7 +75,7 @@ DOMPurify.addHook("uponSanitizeAttribute", (node, data) => {
function renderMarkdown(md:markdownit, data:string){
- const db = get(DataBase)
+ const db = getDatabase()
let quotes = ['“', '”', '‘', '’']
if(db?.customQuotes){
quotes = db.customQuotesData ?? quotes
@@ -254,7 +254,7 @@ async function renderHighlightableMarkdown(data:string) {
export const assetRegex = /{{(raw|path|img|image|video|audio|bg|emotion|asset|video-img|source)::(.+?)}}/g
async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|character, mode:'normal'|'back', mode2:'unset'|'pre'|'post' = 'unset'){
- const db = get(DataBase)
+ const db = getDatabase()
const assetWidthString = (db.assetWidth && db.assetWidth !== -1 || db.assetWidth === 0) ? `max-width:${db.assetWidth}rem;` : ''
let assetPaths:{[key:string]:{
@@ -500,7 +500,7 @@ export async function hasher(data:Uint8Array){
}
export async function convertImage(data:Uint8Array) {
- if(!get(DataBase).imageCompression){
+ if(!getDatabase().imageCompression){
return data
}
const type = checkImageType(data)
@@ -1775,7 +1775,7 @@ export function risuChatParser(da:string, arg:{
cbsConditions?:CbsConditions
} = {}):string{
const chatID = arg.chatID ?? -1
- const db = arg.db ?? get(DataBase)
+ const db = arg.db ?? getDatabase()
const aChara = arg.chara
const visualize = arg.visualize ?? false
let chara:character|string = null
@@ -1797,7 +1797,7 @@ export function risuChatParser(da:string, arg:{
}
}
if(arg.tokenizeAccurate){
- const db = arg.db ?? get(DataBase)
+ const db = arg.db ?? getDatabase()
const selchar = chara ?? db.characters[get(selectedCharID)]
if(!selchar){
chara = 'bot'
@@ -2103,7 +2103,7 @@ export function risuChatParser(da:string, arg:{
export function getChatVar(key:string){
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
if(!char){
@@ -2126,12 +2126,12 @@ export function getChatVar(key:string){
}
export function getGlobalChatVar(key:string){
- const db = get(DataBase)
+ const db = getDatabase()
return db.globalChatVariables[key] ?? 'null'
}
export function setChatVar(key:string, value:string){
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
const chat = char.chats[char.chatPage]
diff --git a/src/ts/persona.ts b/src/ts/persona.ts
index e783767f..2091d7b8 100644
--- a/src/ts/persona.ts
+++ b/src/ts/persona.ts
@@ -1,5 +1,5 @@
import { get } from "svelte/store"
-import { DataBase, saveImage, setDatabase } from "./storage/database.svelte"
+import { getDatabase, saveImage, setDatabase } from "./storage/database.svelte"
import { getUserName, selectSingleFile, sleep } from "./util"
import { alertError, alertNormal, alertStore } from "./alert"
import { downloadFile, readImage } from "./storage/globalApi"
@@ -14,7 +14,7 @@ export async function selectUserImg() {
return
}
const img = selected.data
- let db = get(DataBase)
+ let db = getDatabase()
const imgp = await saveImage(img)
db.userIcon = imgp
db.personas[db.selectedPersona] = {
@@ -27,7 +27,7 @@ export async function selectUserImg() {
}
export function saveUserPersona() {
- let db = get(DataBase)
+ let db = getDatabase()
db.personas[db.selectedPersona].name=db.username
db.personas[db.selectedPersona].icon=db.userIcon,
db.personas[db.selectedPersona].personaPrompt=db.personaPrompt,
@@ -39,7 +39,7 @@ export function changeUserPersona(id:number, save:'save'|'noSave' = 'save') {
if(save === 'save'){
saveUserPersona()
}
- let db = get(DataBase)
+ let db = getDatabase()
const pr = db.personas[id]
db.personaPrompt = pr.personaPrompt
db.username = pr.name,
@@ -56,7 +56,7 @@ interface PersonaCard {
}
export async function exportUserPersona(){
- let db = get(DataBase)
+ let db = getDatabase({snapshot: true})
if(!db.userIcon){
alertError(language.errors.noUserIcon)
return
@@ -107,7 +107,7 @@ export async function importUserPersona(){
}
const data:PersonaCard = JSON.parse(Buffer.from(decoded, 'base64').toString('utf-8'))
if(data.name && data.personaPrompt){
- let db = get(DataBase)
+ let db = getDatabase()
db.personas.push({
name: data.name,
icon: await saveImage(await reencodeImage(v.data)),
diff --git a/src/ts/plugins/embedscript.ts b/src/ts/plugins/embedscript.ts
index 4ae83bb3..5ea02e78 100644
--- a/src/ts/plugins/embedscript.ts
+++ b/src/ts/plugins/embedscript.ts
@@ -2,7 +2,7 @@ import { get } from 'svelte/store'
import type { ScriptMode } from '../process/scripts'
//@ts-ignore
import WorkerUrl from './embedworker?worker&url'
-import { DataBase, type Message } from '../storage/database.svelte'
+import { getDatabase, type Message } from '../storage/database.svelte'
import { selectedCharID } from '../stores'
import { setDatabase } from '../storage/database.svelte'
@@ -77,14 +77,16 @@ function runVirtualJS(code:string){
}
addWorkerFunction('getChat', async () => {
- const db = get(DataBase)
+ const db = getDatabase({
+ snapshot: true
+ })
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
return structuredClone(char.chats[char.chatPage].message)
})
addWorkerFunction('setChat', async (data:Message[]) => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
let newChat:Message[] = []
for(const dat of data){
@@ -117,14 +119,14 @@ addWorkerFunction('setChat', async (data:Message[]) => {
})
addWorkerFunction('getName', async () => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
return char.name
})
addWorkerFunction('setName', async (data:string) => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
if(typeof data !== 'string'){
return false
@@ -135,7 +137,7 @@ addWorkerFunction('setName', async (data:string) => {
})
addWorkerFunction('getDescription', async () => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
if(char.type === 'group'){
@@ -145,7 +147,7 @@ addWorkerFunction('getDescription', async () => {
})
addWorkerFunction('setDescription', async (data:string) => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char =db.characters[selectedChar]
if(typeof data !== 'string'){
@@ -161,14 +163,14 @@ addWorkerFunction('setDescription', async (data:string) => {
})
addWorkerFunction('getCharacterFirstMessage', async () => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
return char.firstMessage
})
addWorkerFunction('setCharacterFirstMessage', async (data:string) => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
if(typeof data !== 'string'){
@@ -181,14 +183,14 @@ addWorkerFunction('setCharacterFirstMessage', async (data:string) => {
})
addWorkerFunction('getBackgroundEmbedding', async () => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
return char.backgroundHTML
})
addWorkerFunction('setBackgroundEmbedding', async (data:string) => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
if(typeof data !== 'string'){
return false
@@ -200,7 +202,7 @@ addWorkerFunction('setBackgroundEmbedding', async (data:string) => {
addWorkerFunction('getState', async (statename) => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
const chat = char.chats[char.chatPage]
@@ -208,7 +210,7 @@ addWorkerFunction('getState', async (statename) => {
})
addWorkerFunction('setState', async (statename, data) => {
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
const chat = char.chats[char.chatPage]
@@ -245,7 +247,7 @@ export async function runCharacterJS(arg:{
}):Promise{
try {
if(arg.code === null){
- const db = get(DataBase)
+ const db = getDatabase()
const selectedChar = get(selectedCharID)
arg.code = db.characters[selectedChar].virtualscript
}
diff --git a/src/ts/plugins/plugins.ts b/src/ts/plugins/plugins.ts
index 37d256fc..c32d9225 100644
--- a/src/ts/plugins/plugins.ts
+++ b/src/ts/plugins/plugins.ts
@@ -1,7 +1,7 @@
import { get, writable } from "svelte/store";
import { language } from "../../lang";
import { alertError } from "../alert";
-import { DataBase } from "../storage/database.svelte";
+import { getDatabase, setDatabaseLite } from "../storage/database.svelte";
import { checkNullish, selectSingleFile, sleep } from "../util";
import type { OpenAIChat } from "../process";
import { globalFetch } from "../storage/globalApi";
@@ -29,7 +29,7 @@ export type RisuPlugin = ProviderPlugin
export async function importPlugin(){
try {
- let db = get(DataBase)
+ let db = getDatabase()
const f = await selectSingleFile(['js'])
if(!f){
return
@@ -96,7 +96,7 @@ export async function importPlugin(){
db.plugins ??= []
db.plugins.push(pluginData)
- DataBase.set(db)
+ setDatabaseLite(db)
loadPlugins()
} catch (error) {
console.error(error)
@@ -123,7 +123,7 @@ function postMsgPluginWorker(type:string, body:any){
let pluginTranslator = false
export async function loadPlugins() {
- let db = get(DataBase)
+ let db = getDatabase()
if(pluginWorker){
pluginWorker.terminate()
pluginWorker = null
@@ -219,7 +219,7 @@ export async function loadPlugins() {
}
case "getArg":{
try {
- const db = get(DataBase)
+ const db = getDatabase()
const arg:string[] = data.body.arg.split('::')
for(const plug of db.plugins){
if(arg[0] === plug.name){
@@ -243,7 +243,7 @@ export async function loadPlugins() {
break
}
case "getChar":{
- const db = get(DataBase)
+ const db = getDatabase()
const charid = get(selectedCharID)
const char = db.characters[charid]
postMsgPluginWorker('fetchData',{
@@ -253,7 +253,7 @@ export async function loadPlugins() {
break
}
case "setChar":{
- const db = get(DataBase)
+ const db = getDatabase()
const charid = get(selectedCharID)
db.characters[charid] = data.body
break
@@ -303,7 +303,7 @@ export async function pluginProcess(arg:{
bias: {[key:string]:string}
}|{}){
try {
- let db = get(DataBase)
+ let db = getDatabase()
if(!pluginWorker){
return {
success: false,
diff --git a/src/ts/process/command.ts b/src/ts/process/command.ts
index 2fbe0050..ad0a4c0f 100644
--- a/src/ts/process/command.ts
+++ b/src/ts/process/command.ts
@@ -1,5 +1,5 @@
import { get } from "svelte/store";
-import { DataBase, getCurrentCharacter, getCurrentChat, setCurrentChat, setDatabase } from "../storage/database.svelte";
+import { getCurrentCharacter, getCurrentChat, getDatabase, setCurrentChat, setDatabase } from "../storage/database.svelte";
import { selectedCharID } from "../stores";
import { alertInput, alertMd, alertNormal, alertSelect, alertToast } from "../alert";
import { sayTTS } from "./tts";
@@ -40,7 +40,7 @@ export async function processMultiCommand(command:string) {
async function processCommand(command:string, pipe:string):Promise{
- const db = get(DataBase)
+ const db = getDatabase()
const currentChar = db.characters[get(selectedCharID)]
const currentChat = currentChar.chats[currentChar.chatPage]
let {commandName, arg, namedArg} = commandParser(command, pipe)
@@ -180,7 +180,7 @@ async function processCommand(command:string, pipe:string):Promise {
- const db = get(DataBase);
+ const db = getDatabase();
console.log("Summarizing");
if (db.supaModelType === 'distilbart') {
@@ -123,7 +121,7 @@ export async function hypaMemoryV2(
arg: { asHyper?: boolean, summaryModel?: string, summaryPrompt?: string, hypaModel?: string } = {}
): Promise<{ currentTokens: number; chats: OpenAIChat[]; error?: string; memory?: HypaV2Data; }> {
- const db = get(DataBase);
+ const db = getDatabase();
const data: HypaV2Data = room.hypaV2Data ?? { chunks: [], mainChunks: [] };
let allocatedTokens = db.hypaAllocatedTokens;
diff --git a/src/ts/process/memory/supaMemory.ts b/src/ts/process/memory/supaMemory.ts
index 09fcfc4e..352dd00f 100644
--- a/src/ts/process/memory/supaMemory.ts
+++ b/src/ts/process/memory/supaMemory.ts
@@ -1,6 +1,5 @@
-import { get } from "svelte/store";
import type { OpenAIChat } from "..";
-import { DataBase, type Chat, type character, type groupChat } from "../../storage/database.svelte";
+import { getDatabase, type Chat, type character, type groupChat } from "../../storage/database.svelte";
import { tokenize, type ChatTokenizer } from "../../tokenizer";
import { requestChatData } from "../request";
import { HypaProcesser } from "./hypamemory";
@@ -18,7 +17,7 @@ export async function supaMemory(
tokenizer:ChatTokenizer,
arg:{asHyper?:boolean} = {}
): Promise<{ currentTokens: number; chats: OpenAIChat[]; error?:string; memory?:string;lastId?:string}>{
- const db = get(DataBase)
+ const db = getDatabase()
currentTokens += 10
diff --git a/src/ts/process/models/local.ts b/src/ts/process/models/local.ts
index 44bf2583..0224ff04 100644
--- a/src/ts/process/models/local.ts
+++ b/src/ts/process/models/local.ts
@@ -4,8 +4,7 @@ import { sleep } from "src/ts/util";
import * as path from "@tauri-apps/api/path";
import { exists, readTextFile } from "@tauri-apps/plugin-fs";
import { alertClear, alertError, alertMd, alertWait } from "src/ts/alert";
-import { get } from "svelte/store";
-import { DataBase } from "src/ts/storage/database.svelte";
+import { getDatabase } from "src/ts/storage/database.svelte";
let serverRunning = false;
export function checkLocalModel():Promise{
@@ -130,7 +129,7 @@ export async function loadExllamaFull(){
async function runLocalModelOld(prompt:string){
- const db = get(DataBase)
+ const db = getDatabase()
if(!serverRunning){
await loadExllamaFull()
@@ -273,7 +272,7 @@ export async function runGGUFModel(arg:{
export async function tokenizeGGUFModel(prompt:string):Promise {
const key = await getLocalKey()
- const db = get(DataBase)
+ const db = getDatabase()
const modelPath = db.aiModel.replace('local_', '')
const b = await fetch("http://localhost:10026/llamacpp/tokenize", {
method: "POST",
diff --git a/src/ts/process/models/modelString.ts b/src/ts/process/models/modelString.ts
index 9e003621..6727cb28 100644
--- a/src/ts/process/models/modelString.ts
+++ b/src/ts/process/models/modelString.ts
@@ -1,8 +1,7 @@
-import { DataBase } from "src/ts/storage/database.svelte";
-import { get } from "svelte/store";
+import { getDatabase } from "src/ts/storage/database.svelte";
export function getGenerationModelString(){
- const db = get(DataBase)
+ const db = getDatabase()
switch (db.aiModel){
case 'reverse_proxy':
return 'reverse_proxy-' + (db.reverseProxyOobaMode ? 'ooba' : db.proxyRequestModel)
diff --git a/src/ts/process/models/nai.ts b/src/ts/process/models/nai.ts
index 51e113d1..d82b05a5 100644
--- a/src/ts/process/models/nai.ts
+++ b/src/ts/process/models/nai.ts
@@ -1,12 +1,11 @@
-import { DataBase, setDatabase } from "src/ts/storage/database.svelte"
+import { getDatabase, setDatabase } from "src/ts/storage/database.svelte"
import type { OpenAIChat } from ".."
-import { get } from "svelte/store"
import { globalFetch } from "src/ts/storage/globalApi"
import { alertError, alertInput, alertNormal, alertWait } from "src/ts/alert"
import { getUserName, sleep } from "src/ts/util"
export function stringlizeNAIChat(formated:OpenAIChat[], char:string, continued: boolean){
- const db = get(DataBase)
+ const db = getDatabase()
let seperator = db.NAIsettings.seperator.replaceAll("\\n","\n") || '\n'
let starter = db.NAIsettings.starter.replaceAll("\\n","\n") || '⁂'
let resultString:string[] = []
@@ -109,7 +108,7 @@ export const novelLogin = async () => {
const data = r.data?.accessToken
- const db = get(DataBase)
+ const db = getDatabase()
db.novelai.token = data
alertNormal('Logged in to NovelAI')
diff --git a/src/ts/process/modules.ts b/src/ts/process/modules.ts
index afda7118..c496632e 100644
--- a/src/ts/process/modules.ts
+++ b/src/ts/process/modules.ts
@@ -1,8 +1,7 @@
import { language } from "src/lang"
import { alertConfirm, alertError, alertModuleSelect, alertNormal, alertStore } from "../alert"
-import { DataBase, getCurrentCharacter, getCurrentChat, setCurrentCharacter, setDatabase, type customscript, type loreBook, type triggerscript } from "../storage/database.svelte"
+import { getCurrentCharacter, getCurrentChat, getDatabase, setCurrentCharacter, setDatabase, type customscript, type loreBook, type triggerscript } from "../storage/database.svelte"
import { AppendableBuffer, downloadFile, isNodeServer, isTauri, readImage, saveAsset } from "../storage/globalApi"
-import { get } from "svelte/store"
import { selectSingleFile, sleep } from "../util"
import { v4 } from "uuid"
import { convertExternalLorebook } from "./lorebook"
@@ -171,7 +170,7 @@ export async function importModule(){
return
}
let fileData = f.data
- const db = get(DataBase)
+ const db = getDatabase()
if(f.name.endsWith('.risum')){
try {
const buf = Buffer.from(fileData)
@@ -248,7 +247,7 @@ export async function importModule(){
}
function getModuleById(id:string){
- const db = get(DataBase)
+ const db = getDatabase()
for(let i=0;i m.id === ids[i] || (m.namespace === ids[i] && m.namespace))
if(module){
@@ -273,7 +272,7 @@ let lastModules = ''
let lastModuleData:RisuModule[] = []
export function getModules(){
const currentChat = getCurrentChat()
- const db = get(DataBase)
+ const db = getDatabase()
let ids = db.enabledModules ?? []
if (currentChat){
ids = ids.concat(currentChat.modules ?? [])
diff --git a/src/ts/process/prompt.ts b/src/ts/process/prompt.ts
index 5c91e7b3..1fe542a1 100644
--- a/src/ts/process/prompt.ts
+++ b/src/ts/process/prompt.ts
@@ -1,6 +1,6 @@
import { get } from "svelte/store";
import { tokenizeAccurate } from "../tokenizer";
-import { DataBase, presetTemplate, setDatabase, type Database } from "../storage/database.svelte";
+import { getDatabase, presetTemplate, setDatabase, type Database } from "../storage/database.svelte";
import { alertError, alertNormal } from "../alert";
import type { OobaChatCompletionRequestParams } from "../model/ooba";
@@ -383,7 +383,7 @@ export function promptConvertion(files:{ name: string, content: string, type:str
if(type === 'STCHAT'){
preset.aiModel = 'openrouter'
preset.subModel = 'openrouter'
- const db = get(DataBase)
+ const db = getDatabase()
db.botPresets.push(preset)
setDatabase(db)
@@ -461,7 +461,7 @@ export function promptConvertion(files:{ name: string, content: string, type:str
preset.name ||= 'Converted from JSON'
- const db = get(DataBase)
+ const db = getDatabase()
db.botPresets.push(preset)
setDatabase(db)
diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts
index 6010c90d..f0ce3980 100644
--- a/src/ts/process/request.ts
+++ b/src/ts/process/request.ts
@@ -1,6 +1,6 @@
import { get } from "svelte/store";
import type { MultiModal, OpenAIChat, OpenAIChatFull } from ".";
-import { DataBase, type character } from "../storage/database.svelte";
+import { getDatabase, type character } from "../storage/database.svelte";
import { pluginProcess } from "../plugins/plugins";
import { language } from "../../lang";
import { stringlizeAINChat, stringlizeChat, getStopStrings, unstringlizeAIN, unstringlizeChat } from "./stringlize";
@@ -88,7 +88,7 @@ type ParameterMap = {
};
function applyParameters(data: { [key: string]: any }, parameters: Parameter[], rename: ParameterMap = {}) {
- const db = get(DataBase)
+ const db = getDatabase()
for(const parameter of parameters){
let value = 0
switch(parameter){
@@ -136,7 +136,7 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[],
}
export async function requestChatData(arg:requestDataArgument, model:'model'|'submodel', abortSignal:AbortSignal=null):Promise {
- const db = get(DataBase)
+ const db = getDatabase()
let trys = 0
while(true){
const da = await requestChatDataMain(arg, model, abortSignal)
@@ -178,7 +178,7 @@ export interface OpenAIChatExtra {
export async function requestChatDataMain(arg:requestDataArgument, model:'model'|'submodel', abortSignal:AbortSignal=null):Promise {
- const db = get(DataBase)
+ const db = getDatabase()
let formated = structuredClone(arg.formated)
let maxTokens = arg.maxTokens ??db.maxResponse
let temperature = arg.temperature ?? (db.temperature / 100)
diff --git a/src/ts/process/scripts.ts b/src/ts/process/scripts.ts
index dc31a8a3..0c413df5 100644
--- a/src/ts/process/scripts.ts
+++ b/src/ts/process/scripts.ts
@@ -1,6 +1,6 @@
import { get } from "svelte/store";
import { CharEmotion, selectedCharID } from "../stores";
-import { DataBase, setDatabase, type character, type customscript, type groupChat, type Database } from "../storage/database.svelte";
+import { type character, type customscript, type groupChat, type Database, getDatabase } from "../storage/database.svelte";
import { downloadFile } from "../storage/globalApi";
import { alertError, alertNormal } from "../alert";
import { language } from "src/lang";
@@ -27,7 +27,7 @@ export async function processScript(char:character|groupChat, data:string, mode:
}
export function exportRegex(s?:customscript[]){
- let db = get(DataBase)
+ let db = getDatabase()
const script = s ?? db.globalscript
const data = Buffer.from(JSON.stringify({
type: 'regex',
@@ -43,7 +43,7 @@ export async function importRegex(o?:customscript[]):Promise{
if(!filedata){
return o
}
- let db = get(DataBase)
+ let db = getDatabase()
try {
const imported= JSON.parse(Buffer.from(filedata).toString('utf-8'))
if(imported.type === 'regex' && imported.data){
@@ -67,7 +67,7 @@ export async function importRegex(o?:customscript[]):Promise{
let bestMatchCache = new Map()
export async function processScriptFull(char:character|groupChat|simpleCharacterArgument, data:string, mode:ScriptMode, chatID = -1, cbsConditions:CbsConditions = {}){
- let db = get(DataBase)
+ let db = getDatabase()
let emoChanged = false
const scripts = (db.globalscript ?? []).concat(char.customscript).concat(getModuleRegexScripts())
data = await runCharacterJS({
diff --git a/src/ts/process/stableDiff.ts b/src/ts/process/stableDiff.ts
index bd6ea5b4..86440540 100644
--- a/src/ts/process/stableDiff.ts
+++ b/src/ts/process/stableDiff.ts
@@ -1,5 +1,5 @@
import { get } from "svelte/store"
-import { DataBase, type character } from "../storage/database.svelte"
+import { getDatabase, type character } from "../storage/database.svelte"
import { requestChatData } from "./request"
import { alertError } from "../alert"
import { globalFetch, readImage } from "../storage/globalApi"
@@ -8,7 +8,7 @@ import type { OpenAIChat } from "."
import { processZip } from "./processzip"
import { keiServerURL } from "../kei/kei"
export async function stableDiff(currentChar:character,prompt:string){
- let db = get(DataBase)
+ let db = getDatabase()
if(db.sdProvider === ''){
alertError("Stable diffusion is not set in settings.")
@@ -56,7 +56,7 @@ export async function stableDiff(currentChar:character,prompt:string){
}
export async function generateAIImage(genPrompt:string, currentChar:character, neg:string, returnSdData:string):Promise{
- const db = get(DataBase)
+ const db = getDatabase()
console.log(db.sdProvider)
if(db.sdProvider === 'webui'){
@@ -490,7 +490,7 @@ export async function generateAIImage(genPrompt:string, currentChar:character, n
}
}
if(db.sdProvider === 'kei'){
- const db = get(DataBase)
+ const db = getDatabase()
let auth = db?.account?.token
if(!auth){
db.account = JSON.parse(localStorage.getItem("fallbackRisuToken"))
diff --git a/src/ts/process/stringlize.ts b/src/ts/process/stringlize.ts
index e9301cef..a9234ae1 100644
--- a/src/ts/process/stringlize.ts
+++ b/src/ts/process/stringlize.ts
@@ -1,6 +1,5 @@
-import { get } from "svelte/store";
import type { OpenAIChat } from ".";
-import { DataBase } from "../storage/database.svelte";
+import { getDatabase } from "../storage/database.svelte";
import { getUserName } from "../util";
export function multiChatReplacer(){
@@ -41,7 +40,7 @@ function appendWhitespace(prefix:string, seperator:string=" ") {
return prefix
}
export function stringlizeChatOba(formated:OpenAIChat[], characterName:string, suggesting:boolean, continued:boolean){
- const db = get(DataBase)
+ const db = getDatabase()
let resultString:string[] = []
let { systemPrefix, userPrefix, assistantPrefix, seperator } = db.ooba.formating;
systemPrefix = systemPrefix ?? ""
@@ -103,7 +102,7 @@ function toTitleCase(s:string){
return s[0].toUpperCase() + s.slice(1).toLowerCase()
}
export function getStopStrings(suggesting:boolean=false){
- const db = get(DataBase)
+ const db = getDatabase()
let { userPrefix, seperator } = db.ooba.formating;
if(!seperator){
seperator = "\n"
@@ -160,7 +159,7 @@ export function unstringlizeChat(text:string, formated:OpenAIChat[], char:string
export function getUnstringlizerChunks(formated:OpenAIChat[], char:string, mode:'ain'|'normal' = 'normal'){
let chunks:string[] = ["system note:", "system:","system note:", "system:"]
let charNames:string[] = []
- const db = get(DataBase)
+ const db = getDatabase()
if(char){
charNames.push(char)
if(mode === 'ain'){
@@ -212,7 +211,7 @@ export function getUnstringlizerChunks(formated:OpenAIChat[], char:string, mode:
export function stringlizeAINChat(formated:OpenAIChat[], char:string, continued: boolean){
let resultString:string[] = []
- const db = get(DataBase)
+ const db = getDatabase()
for(const form of formated){
console.log(form)
@@ -292,7 +291,7 @@ function extractAINOutputStrings(inputString:string, characters:string[]) {
export function unstringlizeAIN(data:string,formated:OpenAIChat[], char:string = ''){
- const db = get(DataBase)
+ const db = getDatabase()
const chunksResult = getUnstringlizerChunks(formated, char ,'ain')
const chunks = chunksResult.chunks
let result:['char'|'user',string][] = []
diff --git a/src/ts/process/templates/chatTemplate.ts b/src/ts/process/templates/chatTemplate.ts
index 7a7b1742..e1701085 100644
--- a/src/ts/process/templates/chatTemplate.ts
+++ b/src/ts/process/templates/chatTemplate.ts
@@ -1,7 +1,6 @@
import { Template } from '@huggingface/jinja';
import type { OpenAIChat } from '..';
-import { get } from 'svelte/store';
-import { DataBase, getCurrentCharacter } from 'src/ts/storage/database.svelte';
+import { getCurrentCharacter, getDatabase } from 'src/ts/storage/database.svelte';
import { getUserName } from 'src/ts/util';
export const chatTemplates = {
@@ -29,7 +28,7 @@ export const applyChatTemplate = (messages:OpenAIChat[], arg:{
type?: string
custom?: string
} = {}) => {
- const db = get(DataBase)
+ const db = getDatabase()
const currentChar = getCurrentCharacter()
const type = arg.type ?? db.instructChatTemplate
if(!type){
diff --git a/src/ts/process/templates/getRecomended.ts b/src/ts/process/templates/getRecomended.ts
index 137ffffc..e7ac344a 100644
--- a/src/ts/process/templates/getRecomended.ts
+++ b/src/ts/process/templates/getRecomended.ts
@@ -1,12 +1,11 @@
-import { DataBase, setPreset, type botPreset, setDatabase } from "src/ts/storage/database.svelte";
+import { setPreset, type botPreset, setDatabase, getDatabase } from "src/ts/storage/database.svelte";
import { defaultAutoSuggestPrefixOoba, defaultAutoSuggestPrompt, defaultAutoSuggestPromptOoba } from "src/ts/storage/defaultPrompts";
-import { get } from "svelte/store";
-import { prebuiltNAIpresets, prebuiltPresets } from "./templates";
+import { prebuiltPresets } from "./templates";
import { alertConfirm, alertSelect } from "src/ts/alert";
import { language } from "src/lang";
export async function setRecommended(model: string, ask:'ask'|'force') {
- const db = get(DataBase)
+ const db = getDatabase()
if(!(recommendedPresetExist(model))){
return
}
diff --git a/src/ts/process/templates/jsonSchema.ts b/src/ts/process/templates/jsonSchema.ts
index b397810a..d741e233 100644
--- a/src/ts/process/templates/jsonSchema.ts
+++ b/src/ts/process/templates/jsonSchema.ts
@@ -1,6 +1,5 @@
import { risuChatParser } from "src/ts/parser"
-import { DataBase } from "src/ts/storage/database.svelte"
-import { get } from "svelte/store"
+import { getDatabase } from "src/ts/storage/database.svelte"
export function convertInterfaceToSchema(int:string){
if(!int.startsWith('interface ') && !int.startsWith('export interface ')){
@@ -122,7 +121,7 @@ export function convertInterfaceToSchema(int:string){
}
export function getOpenAIJSONSchema(){
- const db = get(DataBase)
+ const db = getDatabase()
const schema = {
"name": "format",
"strict": db.strictJsonSchema,
diff --git a/src/ts/process/triggers.ts b/src/ts/process/triggers.ts
index 157dfc98..45032dbe 100644
--- a/src/ts/process/triggers.ts
+++ b/src/ts/process/triggers.ts
@@ -1,5 +1,5 @@
import { parseChatML, risuChatParser } from "../parser";
-import { DataBase, getCurrentCharacter, getCurrentChat, type Chat, type character } from "../storage/database.svelte";
+import { getCurrentCharacter, getCurrentChat, getDatabase, type Chat, type character } from "../storage/database.svelte";
import { tokenize } from "../tokenizer";
import { getModuleTriggers } from "./modules";
import { get } from "svelte/store";
@@ -167,7 +167,7 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{
v.lowLevelAccess = CharacterlowLevelAccess
return v
}).concat(getModuleTriggers())
- const db = get(DataBase)
+ const db = getDatabase()
const defaultVariables = parseKeyValue(char.defaultVariables).concat(parseKeyValue(db.templateDefaultVariables))
let chat = structuredClone(arg.chat ?? char.chats[char.chatPage])
if((!triggers) || (triggers.length === 0)){
@@ -191,7 +191,7 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{
function setVar(key:string, value:string){
const selectedCharId = get(selectedCharID)
const currentCharacter = getCurrentCharacter()
- const db = get(DataBase)
+ const db = getDatabase()
varChanged = true
chat.scriptstate ??= {}
chat.scriptstate['$' + key] = value
diff --git a/src/ts/process/tts.ts b/src/ts/process/tts.ts
index 71ab805f..b4dd9768 100644
--- a/src/ts/process/tts.ts
+++ b/src/ts/process/tts.ts
@@ -1,11 +1,10 @@
-import { get } from "svelte/store";
import { alertError } from "../alert";
-import { DataBase, getCurrentCharacter, type character } from "../storage/database.svelte";
+import { getCurrentCharacter, getDatabase, type character } from "../storage/database.svelte";
import { runTranslator, translateVox } from "../translator/translator";
import { globalFetch, loadAsset } from "../storage/globalApi";
import { language } from "src/lang";
import { sleep } from "../util";
-import { registerOnnxModel, runVITS } from "./transformers";
+import { runVITS } from "./transformers";
let sourceNode:AudioBufferSourceNode = null
@@ -23,7 +22,7 @@ export async function sayTTS(character:character,text:string) {
return
}
- let db = get(DataBase)
+ let db = getDatabase()
text = text.replace(/\*/g,'')
if(character.ttsReadOnlyQuoted){
@@ -383,7 +382,7 @@ export function getWebSpeechTTSVoices() {
}
export async function getElevenTTSVoices() {
- let db = get(DataBase)
+ let db = getDatabase()
const data = await fetch('https://api.elevenlabs.io/v1/voices', {
headers: {
@@ -397,7 +396,7 @@ export async function getElevenTTSVoices() {
}
export async function getVOICEVOXVoices() {
- const db = get(DataBase);
+ const db = getDatabase();
const speakerData = await fetch(`${db.voicevoxUrl}/speakers`)
const speakerList = await speakerData.json()
const speakersInfo = speakerList.map((speaker) => {
diff --git a/src/ts/realm.ts b/src/ts/realm.ts
index e781e7b7..bf28a01f 100644
--- a/src/ts/realm.ts
+++ b/src/ts/realm.ts
@@ -1,7 +1,7 @@
import { get } from "svelte/store";
import { exportCharacterCard } from "./characterCards";
import { VirtualWriter, isTauri, openURL } from "./storage/globalApi";
-import { DataBase, getCurrentCharacter, type character } from "./storage/database.svelte";
+import { getCurrentCharacter, getDatabase, type character } from "./storage/database.svelte";
import { alertStore } from "./alert";
let pong = false;
@@ -15,7 +15,7 @@ window.addEventListener("message", (event) => {
});
export async function shareRealmCardData():Promise<{ name: ArrayBuffer; data: ArrayBuffer; }> {
- const char = structuredClone(getCurrentCharacter()) as character
+ const char = structuredClone(getCurrentCharacter({snapshot:true})) as character
const trimedName = char.name.replace(/[^a-zA-Z0-9]/g, '') || 'character';
const writer = new VirtualWriter()
const namebuf = new TextEncoder().encode(trimedName + '.png')
@@ -31,8 +31,8 @@ export async function shareRealmCardData():Promise<{ name: ArrayBuffer; data: Ar
}
export async function openRealm(name:string,data:ArrayBuffer) {
- const tk = get(DataBase)?.account?.token;
- const id = get(DataBase)?.account?.id
+ const tk = getDatabase()?.account?.token;
+ const id = getDatabase()?.account?.id
const trimedName = name.replace(/[^a-zA-Z0-9]/g, '') || 'character';
const filedata = encodeURIComponent(Buffer.from(data).toString('base64')) + `&${trimedName}.png`;
const url = `https://realm.risuai.net/upload?token=${tk}&token_id=${id}#filedata=${filedata}`
diff --git a/src/ts/storage/accountStorage.ts b/src/ts/storage/accountStorage.ts
index 2397a67b..ee539e4b 100644
--- a/src/ts/storage/accountStorage.ts
+++ b/src/ts/storage/accountStorage.ts
@@ -1,9 +1,9 @@
-import { get, writable } from "svelte/store"
-import { DataBase } from "./database.svelte"
+import { writable } from "svelte/store"
+import { getDatabase } from "./database.svelte"
import { hubURL } from "../characterCards"
import localforage from "localforage"
-import { alertError, alertLogin, alertStore, alertWait } from "../alert"
-import { forageStorage, getUnpargeables, replaceDbResources } from "./globalApi"
+import { alertLogin, alertStore, alertWait } from "../alert"
+import { forageStorage, getUnpargeables } from "./globalApi"
import { encodeRisuSave } from "./risuSave"
import { v4 } from "uuid"
import { language } from "src/lang"
@@ -99,7 +99,7 @@ export class AccountStorage{
return Buffer.from(ab)
}
async keys():Promise{
- let db = get(DataBase)
+ let db = getDatabase()
return getUnpargeables(db, 'pure')
}
async removeItem(key:string){
@@ -107,7 +107,7 @@ export class AccountStorage{
}
private checkAuth(){
- const db = get(DataBase)
+ const db = getDatabase()
this.auth = db?.account?.token
if(!this.auth){
db.account = JSON.parse(localStorage.getItem("fallbackRisuToken"))
@@ -122,7 +122,7 @@ export class AccountStorage{
export async function unMigrationAccount() {
const keys = await forageStorage.keys()
- let db = get(DataBase)
+ let db = getDatabase()
let i = 0;
const MigrationStorage = localforage.createInstance({name: "risuai"})
diff --git a/src/ts/storage/autoStorage.ts b/src/ts/storage/autoStorage.ts
index ccb98aa7..3f57a25d 100644
--- a/src/ts/storage/autoStorage.ts
+++ b/src/ts/storage/autoStorage.ts
@@ -3,8 +3,7 @@ import { isNodeServer, replaceDbResources } from "./globalApi"
import { NodeStorage } from "./nodeStorage"
import { OpfsStorage } from "./opfsStorage"
import { alertInput, alertSelect, alertStore } from "../alert"
-import { get } from "svelte/store"
-import { DataBase, type Database } from "./database.svelte"
+import { getDatabase, type Database } from "./database.svelte"
import { AccountStorage } from "./accountStorage"
import { decodeRisuSave, encodeRisuSave } from "./risuSave";
import { language } from "src/lang"
@@ -40,7 +39,7 @@ export class AutoStorage{
}
async checkAccountSync(){
- let db = get(DataBase)
+ let db = getDatabase()
if(this.isAccount){
return true
}
diff --git a/src/ts/storage/database.svelte.ts b/src/ts/storage/database.svelte.ts
index 14e3f423..84b848d0 100644
--- a/src/ts/storage/database.svelte.ts
+++ b/src/ts/storage/database.svelte.ts
@@ -12,28 +12,13 @@ import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme';
import type { PromptItem, PromptSettings } from '../process/prompt';
import type { OobaChatCompletionRequestParams } from '../model/ooba';
-export const DataBase = writable({} as any as Database)
export const DBState = $state({
- db: get(DataBase)
+ db: {} as any as Database
})
export const loadedStore = writable(false)
export let appVer = "137.1.0"
export let webAppSubVer = '-svelte5-exp'
-DataBase.subscribe(data => {
- //check it is pointing to the right object
- if(DBState.db !== data){
- //if not, update it
- DBState.db = data
- }
-})
-
-$effect(() => {
- //same as above, but for the other way around
- if(DBState.db !== get(DataBase)){
- DataBase.set(DBState.db)
- }
-})
export function setDatabase(data:Database){
if(checkNullish(data.characters)){
@@ -464,21 +449,36 @@ export function setDatabase(data:Database){
data.groupOtherBotRole ??= 'user'
data.customGUI ??= ''
changeLanguage(data.language)
- DataBase.set(data)
+ setDatabaseLite(data)
}
-export function getCurrentCharacter(){
- const db = get(DataBase)
+export function setDatabaseLite(data:Database){
+ DBState.db = data
+}
+
+interface getDatabaseOptions{
+ snapshot?:boolean
+}
+
+export function getDatabase(options:getDatabaseOptions = {}):Database{
+ if(options.snapshot){
+ return $state.snapshot(DBState.db) as Database
+ }
+ return DBState.db as Database
+}
+
+export function getCurrentCharacter(options:getDatabaseOptions = {}):character|groupChat{
+ const db = getDatabase(options)
db.characters ??= []
const char = db.characters?.[get(selectedCharID)]
return char
}
export function setCurrentCharacter(char:character|groupChat){
- const db = get(DataBase)
+ const db = getDatabase()
db.characters ??= []
db.characters[get(selectedCharID)] = char
- DataBase.set(db)
+ setDatabaseLite(db)
}
export function getCurrentChat(){
@@ -1328,7 +1328,7 @@ export const defaultSdDataFunc = () =>{
}
export function saveCurrentPreset(){
- let db = get(DataBase)
+ let db = getDatabase()
let pres = db.botPresets
pres[db.botPresetsId] = {
name: pres[db.botPresetsId].name,
@@ -1392,7 +1392,7 @@ export function saveCurrentPreset(){
export function copyPreset(id:number){
saveCurrentPreset()
- let db = get(DataBase)
+ let db = getDatabase()
let pres = db.botPresets
const newPres = structuredClone(pres[id])
newPres.name += " Copy"
@@ -1404,7 +1404,7 @@ export function changeToPreset(id =0, savecurrent = true){
if(savecurrent){
saveCurrentPreset()
}
- let db = get(DataBase)
+ let db = getDatabase()
let pres = db.botPresets
const newPres = pres[id]
db.botPresetsId = id
@@ -1492,7 +1492,7 @@ import { selectedCharID } from '../stores';
export async function downloadPreset(id:number, type:'json'|'risupreset'|'return' = 'json'){
saveCurrentPreset()
- let db = get(DataBase)
+ let db = getDatabase()
let pres = structuredClone(db.botPresets[id])
console.log(pres)
pres.openAIKey = ''
@@ -1563,7 +1563,7 @@ export async function importPreset(f:{
pre = {...presetTemplate,...(JSON.parse(Buffer.from(f.data).toString('utf-8')))}
console.log(pre)
}
- let db = get(DataBase)
+ let db = getDatabase()
if(pre.presetVersion && pre.presetVersion >= 3){
//NAI preset
const pr = structuredClone(prebuiltPresets.NAI2)
diff --git a/src/ts/storage/exportAsDataset.ts b/src/ts/storage/exportAsDataset.ts
index f157eb6b..359a3727 100644
--- a/src/ts/storage/exportAsDataset.ts
+++ b/src/ts/storage/exportAsDataset.ts
@@ -1,11 +1,11 @@
import { get } from "svelte/store";
-import { DataBase } from "./database.svelte";
+import { getDatabase } from "./database.svelte";
import { downloadFile } from "./globalApi";
import { alertNormal } from "../alert";
import { language } from "src/lang";
export async function exportAsDataset(){
- const db = get(DataBase)
+ const db = getDatabase()
let dataset = []
for(const char of db.characters){
diff --git a/src/ts/storage/globalApi.ts b/src/ts/storage/globalApi.ts
index f16483bf..45056c80 100644
--- a/src/ts/storage/globalApi.ts
+++ b/src/ts/storage/globalApi.ts
@@ -13,7 +13,7 @@ import { v4 as uuidv4, v4 } from 'uuid';
import { appDataDir, join } from "@tauri-apps/api/path";
import { get } from "svelte/store";
import {open} from '@tauri-apps/plugin-shell'
-import { DataBase, loadedStore, setDatabase, type Database, defaultSdDataFunc } from "./database.svelte";
+import { loadedStore, setDatabase, type Database, defaultSdDataFunc, getDatabase } from "./database.svelte";
import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow";
import { checkRisuUpdate } from "../update";
import { MobileGUI, botMakerMode, selectedCharID } from "../stores";
@@ -310,12 +310,9 @@ let lastSave = ''
* @returns {Promise} - A promise that resolves when the database has been saved.
*/
export async function saveDb(){
- lastSave = JSON.stringify(get(DataBase))
- let changed = false
+ lastSave = JSON.stringify(getDatabase())
+ let changed = true
syncDrive()
- DataBase.subscribe(() => {
- changed = true
- })
let gotChannel = false
const sessionID = v4()
let channel:BroadcastChannel
@@ -346,8 +343,11 @@ export async function saveDb(){
if(channel){
channel.postMessage(sessionID)
}
- changed = false
- let db = get(DataBase)
+ let db = getDatabase()
+ if(!db.characters){
+ await sleep(1000)
+ continue
+ }
db.saveTime = Math.floor(Date.now() / 1000)
if(isTauri){
const dbData = encodeRisuSave(db)
@@ -393,7 +393,7 @@ export async function saveDb(){
* @returns {Promise} - A promise that resolves to an array of backup timestamps.
*/
async function getDbBackups() {
- let db = get(DataBase)
+ let db = getDatabase()
if(db?.account?.useSync){
return []
}
@@ -547,7 +547,7 @@ export async function loadData() {
else{
usingSw = false
}
- if(get(DataBase).didFirstSetup){
+ if(getDatabase().didFirstSetup){
characterURLImport()
}
}
@@ -557,7 +557,7 @@ export async function loadData() {
try {
await loadPlugins()
} catch (error) {}
- if(get(DataBase).account){
+ if(getDatabase().account){
try {
await loadRisuAccountData()
} catch (error) {}
@@ -572,7 +572,7 @@ export async function loadData() {
}
await checkNewFormat()
- const db = get(DataBase);
+ const db = getDatabase();
updateColorScheme()
updateTextThemeAndCSS()
updateAnimationSpeed()
@@ -720,7 +720,7 @@ export function addFetchLog(arg: {
*/
export async function globalFetch(url: string, arg: GlobalFetchArgs = {}): Promise {
try {
- const db = get(DataBase);
+ const db = getDatabase();
const method = arg.method ?? "POST";
db.requestmet = "normal";
@@ -1056,7 +1056,7 @@ export function replaceDbResources(db: Database, replacer: { [key: string]: stri
* @returns {Promise} - A promise that resolves when the database format check and update is complete.
*/
async function checkNewFormat(): Promise {
- let db = get(DataBase);
+ let db = getDatabase();
// Check data integrity
db.characters = db.characters.map((v) => {
@@ -1147,40 +1147,7 @@ async function checkNewFormat(): Promise {
db.formatversion = 3;
}
if (db.formatversion < 4) {
- db.modules ??= [];
- db.enabledModules ??= [];
- // Convert global lore and global regex to modules
- if (db.globalscript && db.globalscript.length > 0) {
- const id = v4();
- let regexModule: RisuModule = {
- name: "Global Regex",
- description: "Converted from legacy global regex",
- id: id,
- regex: structuredClone(db.globalscript)
- };
- db.modules.push(regexModule);
- db.enabledModules.push(id);
- db.globalscript = [];
- }
- if (db.loreBook && db.loreBook.length > 0) {
- const selIndex = db.loreBookPage;
- for (let i = 0; i < db.loreBook.length; i++) {
- const id = v4();
- let lbModule: RisuModule = {
- name: db.loreBook[i].name || "Unnamed Global Lorebook",
- description: "Converted from legacy global lorebook",
- id: id,
- lorebook: structuredClone(db.loreBook[i].data)
- };
- db.modules.push(lbModule);
- if (i === selIndex) {
- db.enabledModules.push(id);
- }
- db.globalscript = [];
- }
- db.loreBook = [];
- }
-
+ //migration removed due to issues
db.formatversion = 4;
}
if (!db.characterOrder) {
@@ -1209,9 +1176,9 @@ async function checkNewFormat(): Promise {
* Ensures that all characters are properly ordered and removes any invalid entries.
*/
export function checkCharOrder() {
- let db = get(DataBase)
+ let db = getDatabase()
db.characterOrder = db.characterOrder ?? []
- let ordered = structuredClone(db.characterOrder ?? [])
+ let ordered = []
for(let i=0;i; headers: Headers; status: number }> {
let headers = arg.headers ?? {}
- const db = get(DataBase)
+ const db = getDatabase()
let throughProxy = (!isTauri) && (!isNodeServer) && (!db.usePlainFetch)
let fetchLogIndex = addFetchLog({
body: arg.body,
@@ -1977,7 +1947,7 @@ export function trimNonLatin(data:string){
* The corresponding CSS variable '--risu-height-size' is set accordingly.
*/
export function updateHeightMode(){
- const db = get(DataBase)
+ const db = getDatabase()
const root = document.querySelector(':root') as HTMLElement;
switch(db.heightMode){
case 'auto':
diff --git a/src/ts/storage/persistant.ts b/src/ts/storage/persistant.ts
index 3f8b7f06..6cb829f0 100644
--- a/src/ts/storage/persistant.ts
+++ b/src/ts/storage/persistant.ts
@@ -1,5 +1,5 @@
import { get } from "svelte/store";
-import { DataBase } from "./database.svelte";
+import { getDatabase } from "./database.svelte";
import { alertNormal } from "../alert";
import { language } from "src/lang";
import { isNodeServer, isTauri } from "./globalApi";
@@ -38,7 +38,7 @@ async function requestPersistantStorageMain() {
}
export async function persistantStorageRecommended() {
- const db = get(DataBase)
+ const db = getDatabase()
if(navigator.storage && navigator.storage.persist && (!isTauri) && (!isNodeServer)) {
if(await navigator.storage.persisted()) {
return false;
diff --git a/src/ts/stores.ts b/src/ts/stores.ts
index 3493df7c..5ab3140c 100644
--- a/src/ts/stores.ts
+++ b/src/ts/stores.ts
@@ -1,8 +1,7 @@
-import { get, writable, type Writable } from "svelte/store";
-import { DataBase, getCurrentCharacter, type Chat, type character, type groupChat } from "./storage/database.svelte";
-import { isEqual } from "lodash";
+import { writable, type Writable } from "svelte/store";
+import { getDatabase, type Chat, type character, type groupChat } from "./storage/database.svelte";
import type { simpleCharacterArgument } from "./parser";
-import { getUserIcon, getUserIconProtrait, getUserName, sleep } from "./util";
+import { sleep } from "./util";
import { getModules } from "./process/modules";
function updateSize(){
@@ -75,7 +74,7 @@ export function createSimpleCharacter(char:character|groupChat){
const simpleChar:simpleCharacterArgument = {
type: "simple",
- customscript: structuredClone(char.customscript),
+ customscript: char.customscript,
chaId: char.chaId,
additionalAssets: char.additionalAssets,
virtualscript: char.virtualscript,
@@ -89,7 +88,7 @@ export function createSimpleCharacter(char:character|groupChat){
function trySync(){
try {
- let db = get(DataBase)
+ let db = getDatabase()
CurrentShowMemoryLimit.set(db.showMemoryLimit)
} catch (error) {}
}
diff --git a/src/ts/sync/multiuser.ts b/src/ts/sync/multiuser.ts
index e0775164..ef261341 100644
--- a/src/ts/sync/multiuser.ts
+++ b/src/ts/sync/multiuser.ts
@@ -1,7 +1,7 @@
import { v4 } from 'uuid';
import { alertError, alertInput, alertNormal, alertStore, alertWait } from '../alert';
import { get, writable } from 'svelte/store';
-import { DataBase, setDatabase, type character, saveImage, type Chat, getCurrentChat, setCurrentChat } from '../storage/database.svelte';
+import { setDatabase, type character, saveImage, type Chat, getCurrentChat, setCurrentChat, getDatabase } from '../storage/database.svelte';
import { selectedCharID } from '../stores';
import { findCharacterIndexbyId, sleep } from '../util';
import type { DataConnection, Peer } from 'peerjs';
@@ -79,7 +79,9 @@ export async function createMultiuserRoom(){
console.log("new connection", conn)
async function requestChar(excludeAssets:string[]|null = null){
- const db = get(DataBase)
+ const db = getDatabase({
+ snapshot: true
+ })
const selectedCharId = get(selectedCharID)
const char = structuredClone(db.characters[selectedCharId])
if(char.type === 'group'){
@@ -127,7 +129,9 @@ export async function createMultiuserRoom(){
requestChar()
}
if(data.type === 'receive-char'){
- const db = get(DataBase)
+ const db = getDatabase({
+ snapshot: true
+ })
const selectedCharId = get(selectedCharID)
const char = structuredClone(db.characters[selectedCharId])
const recivedChar = data.data
@@ -137,7 +141,7 @@ export async function createMultiuserRoom(){
char.chats[char.chatPage] = recivedChar.chats[0]
}
if(data.type === 'request-chat-sync'){
- const db = get(DataBase)
+ const db = getDatabase()
const selectedCharId = get(selectedCharID)
const char = db.characters[selectedCharId]
char.chats[char.chatPage] = data.data
@@ -157,7 +161,7 @@ export async function createMultiuserRoom(){
}
}
if(data.type === 'request-chat'){
- const db = get(DataBase)
+ const db = getDatabase()
const selectedCharId = get(selectedCharID)
const char = db.characters[selectedCharId]
const chat = char.chats[char.chatPage]
@@ -285,7 +289,7 @@ export async function joinMultiuserRoom(){
switch(data.type){
case 'receive-char':{
//create temp character
- const db = get(DataBase)
+ const db = getDatabase()
const cha = data.data
cha.chaId = '§temp'
cha.chatPage = 0
@@ -309,7 +313,9 @@ export async function joinMultiuserRoom(){
break
}
case 'receive-chat':{
- const db = get(DataBase)
+ const db = getDatabase({
+ snapshot: true
+ })
const selectedCharId = get(selectedCharID)
const char = structuredClone(db.characters[selectedCharId])
char.chats[char.chatPage] = data.data
diff --git a/src/ts/tokenizer.ts b/src/ts/tokenizer.ts
index 2e3d8f41..1d04031a 100644
--- a/src/ts/tokenizer.ts
+++ b/src/ts/tokenizer.ts
@@ -1,7 +1,6 @@
import type { Tiktoken } from "@dqbd/tiktoken";
import type { Tokenizer } from "@mlc-ai/web-tokenizers";
-import { DataBase, type groupChat, type character, type Chat, getCurrentCharacter } from "./storage/database.svelte";
-import { get } from "svelte/store";
+import { type groupChat, type character, type Chat, getCurrentCharacter, getDatabase } from "./storage/database.svelte";
import type { MultiModal, OpenAIChat } from "./process";
import { supportsInlayImage } from "./process/files/image";
import { risuChatParser } from "./parser";
@@ -22,7 +21,7 @@ export const tokenizerList = [
] as const
export async function encode(data:string):Promise<(number[]|Uint32Array|Int32Array)>{
- let db = get(DataBase)
+ let db = getDatabase()
if(db.aiModel === 'openrouter' || db.aiModel === 'reverse_proxy'){
switch(db.customTokenizer){
case 'mistral':
@@ -130,7 +129,7 @@ async function tikJS(text:string, model='cl100k_base') {
}
async function geminiTokenizer(text:string) {
- const db = get(DataBase)
+ const db = getDatabase()
const fetchResult = await globalFetch(`https://generativelanguage.googleapis.com/v1beta/${db.aiModel}:countTextTokens`, {
"headers": {
"content-type": "application/json",
@@ -249,7 +248,7 @@ export class ChatTokenizer {
}
async tokenizeMultiModal(data:MultiModal){
- const db = get(DataBase)
+ const db = getDatabase()
if(!supportsInlayImage()){
return this.chatAdditonalTokens
}
diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts
index 0ab93f00..cab660d9 100644
--- a/src/ts/translator/translator.ts
+++ b/src/ts/translator/translator.ts
@@ -1,6 +1,6 @@
import { get } from "svelte/store"
import { translatorPlugin } from "../plugins/plugins"
-import { DataBase, type character, type customscript, type groupChat } from "../storage/database.svelte"
+import { getDatabase, type character, type customscript, type groupChat } from "../storage/database.svelte"
import { globalFetch, isTauri } from "../storage/globalApi"
import { alertError } from "../alert"
import { requestChatData } from "../process/request"
@@ -10,7 +10,6 @@ import { selectedCharID } from "../stores"
import { getModuleRegexScripts } from "../process/modules"
import { getNodetextToSentence, sleep } from "../util"
import { processScriptFull } from "../process/scripts"
-import { Capacitor } from "@capacitor/core"
let cache={
origin: [''],
@@ -20,7 +19,7 @@ let cache={
let waitTrans = 0
export async function translate(text:string, reverse:boolean) {
- let db = get(DataBase)
+ let db = getDatabase()
const plug = await translatorPlugin(text, reverse ? db.translator: 'en', reverse ? 'en' : db.translator)
if(plug){
return plug.content
@@ -105,7 +104,7 @@ export async function runTranslator(text:string, reverse:boolean, from:string,ta
}
async function translateMain(text:string, arg:{from:string, to:string, host:string}){
- let db = get(DataBase)
+ let db = getDatabase()
if(db.translatorType === 'llm'){
const tr = db.translator || 'en'
return translateLLM(text, {to: tr})
@@ -208,7 +207,7 @@ async function jaTrans(text:string) {
}
export function isExpTranslator(){
- const db = get(DataBase)
+ const db = getDatabase()
return db.translatorType === 'llm' || db.translatorType === 'deepl' || db.translatorType === 'deeplX'
}
@@ -216,7 +215,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
let alwaysExistChar: character | groupChat | simpleCharacterArgument;
if(charArg !== ''){
if(typeof(charArg) === 'string'){
- const db = get(DataBase)
+ const db = getDatabase()
const charId = get(selectedCharID)
alwaysExistChar = db.characters[charId]
}
@@ -232,7 +231,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
chaId: 'simple'
}
}
- let db = get(DataBase)
+ let db = getDatabase()
let DoingChat = get(doingChat)
if(DoingChat){
if(isExpTranslator()){
@@ -440,7 +439,7 @@ export async function translateHTML(html: string, reverse:boolean, charArg:simpl
}
function needSuperChunkedTranslate(){
- return get(DataBase).translatorType === 'deeplX'
+ return getDatabase().translatorType === 'deeplX'
}
let llmCache = new Map()
@@ -455,7 +454,7 @@ async function translateLLM(text:string, arg:{to:string}){
return ``
})
- const db = get(DataBase)
+ const db = getDatabase()
const charIndex = get(selectedCharID)
const currentChar = db.characters[charIndex]
let translatorNote
diff --git a/src/ts/util.ts b/src/ts/util.ts
index 12498709..0b7bc4c3 100644
--- a/src/ts/util.ts
+++ b/src/ts/util.ts
@@ -1,6 +1,6 @@
import { get, writable, type Writable } from "svelte/store"
import type { Database, Message } from "./storage/database.svelte"
-import { DataBase } from "./storage/database.svelte"
+import { getDatabase } from "./storage/database.svelte"
import { selectedCharID } from "./stores"
import {open} from '@tauri-apps/plugin-dialog'
import { readFile } from "@tauri-apps/plugin-fs"
@@ -17,7 +17,7 @@ export interface Messagec extends Message{
}
export function messageForm(arg:Message[], loadPages:number){
- let db = get(DataBase)
+ let db = getDatabase()
let selectedChar = get(selectedCharID)
function reformatContent(data:string){
return data.trim()
@@ -100,7 +100,7 @@ export async function selectMultipleFile(ext:string[]){
}
export const replacePlaceholders = (msg:string, name:string) => {
- let db = get(DataBase)
+ let db = getDatabase()
let selectedChar = get(selectedCharID)
let currentChar = db.characters[selectedChar]
return msg .replace(/({{char}})|({{Char}})|()|()/gi, currentChar.name)
@@ -110,7 +110,7 @@ export const replacePlaceholders = (msg:string, name:string) => {
function checkPersonaBinded(){
try {
- let db = get(DataBase)
+ let db = getDatabase()
const selectedChar = get(selectedCharID)
const character = db.characters[selectedChar]
const chat = character.chats[character.chatPage]
@@ -129,7 +129,7 @@ export function getUserName(){
if(bindedPersona){
return bindedPersona.name
}
- const db = get(DataBase)
+ const db = getDatabase()
return db.username ?? 'User'
}
@@ -138,7 +138,7 @@ export function getUserIcon(){
if(bindedPersona){
return bindedPersona.icon
}
- const db = get(DataBase)
+ const db = getDatabase()
return db.userIcon ?? ''
}
@@ -147,7 +147,7 @@ export function getPersonaPrompt(){
if(bindedPersona){
return bindedPersona.personaPrompt
}
- const db = get(DataBase)
+ const db = getDatabase()
return db.personaPrompt ?? ''
}
@@ -157,7 +157,7 @@ export function getUserIconProtrait(){
if(bindedPersona){
return bindedPersona.largePortrait
}
- const db = get(DataBase)
+ const db = getDatabase()
return db.personas[db.selectedPersona].largePortrait
} catch (error) {
return false
@@ -172,7 +172,7 @@ export function selectFileByDom(allowedExtensions:string[], multiple:'multiple'|
const fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.multiple = multiple === 'multiple';
- const acceptAll = (get(DataBase).allowAllExtentionFiles || checkIsIos() || allowedExtensions[0] === '*')
+ const acceptAll = (getDatabase().allowAllExtentionFiles || checkIsIos() || allowedExtensions[0] === '*')
if(!acceptAll){
if (allowedExtensions && allowedExtensions.length) {
fileInput.accept = allowedExtensions.map(ext => `.${ext}`).join(',');
@@ -223,7 +223,7 @@ function readFileAsUint8Array(file) {
}
export async function changeFullscreen(){
- const db = get(DataBase)
+ const db = getDatabase()
const isFull = await appWindow.isFullscreen()
if(db.fullScreen && (!isFull)){
await appWindow.setFullscreen(true)
@@ -244,7 +244,7 @@ export async function getCustomBackground(db:string){
}
export function findCharacterbyId(id:string) {
- const db = get(DataBase)
+ const db = getDatabase()
for(const char of db.characters){
if(char.type !== 'group'){
if(char.chaId === id){
@@ -258,7 +258,7 @@ export function findCharacterbyId(id:string) {
}
export function findCharacterIndexbyId(id:string) {
- const db = get(DataBase)
+ const db = getDatabase()
let i=0;
for(const char of db.characters){
if(char.chaId === id){
@@ -270,7 +270,7 @@ export function findCharacterIndexbyId(id:string) {
}
export function getCharacterIndexObject() {
- const db = get(DataBase)
+ const db = getDatabase()
let i=0;
let result:{[key:string]:number} = {}
for(const char of db.characters){
@@ -364,7 +364,7 @@ export async function getEmotion(db:Database,chaEmotion:{[key:string]: [string,
}
export function getAuthorNoteDefaultText(){
- const db = get(DataBase)
+ const db = getDatabase()
const template = db.promptTemplate
if(!template){
return ''