fix: Chat trigger on start (#788)

# PR Checklist
- [ ] Have you checked if it works normally in all models? *Ignore this
if it doesn't use models.*
- [ ] Have you checked if it works normally in all web, local, and node
hosted versions? If it doesn't, have you blocked it in those versions?
- [ ] Have you added type definitions?

# Description
This PR aims to fix the following issues:
1. Fixed an issue where chat array changes caused by the 'start' mode
trigger were not being applied correctly. (This problem occurs in both
block type and Lua type.)
2. Occasionally, there was a problem with scriptstate desync in Lua
triggers, so I've changed to update method on every call.
This commit is contained in:
kwaroran
2025-03-17 15:52:38 +09:00
committed by GitHub
2 changed files with 11 additions and 4 deletions

View File

@@ -1,5 +1,5 @@
import { get, writable } from "svelte/store";
import { type character, type MessageGenerationInfo, type Chat, changeToPreset } from "../storage/database.svelte";
import { type character, type MessageGenerationInfo, type Chat, changeToPreset, setCurrentChat } from "../storage/database.svelte";
import { DBState } from '../stores.svelte';
import { CharEmotion, selectedCharID } from "../stores.svelte";
import { ChatTokenizer, tokenize, tokenizeNum } from "../tokenizer";
@@ -696,6 +696,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{
const triggerResult = await runTrigger(currentChar, 'start', {chat: currentChat})
if(triggerResult){
currentChat = triggerResult.chat
setCurrentChat(currentChat)
ms = currentChat.message
currentTokens += triggerResult.tokens
if(triggerResult.stopSending){

View File

@@ -23,6 +23,8 @@ interface LuaEngineState {
engine: LuaEngine;
mutex: Mutex;
chat: Chat;
setVar: (key:string, value:string) => void,
getVar: (key:string) => string
}
let LuaEngines = new Map<string, LuaEngineState>()
@@ -55,12 +57,16 @@ export async function runLua(code:string, arg:{
code,
engine: await luaFactory.createEngine({injectObjects: true}),
mutex: new Mutex(),
chat
chat,
setVar,
getVar
}
LuaEngines.set(mode, luaEngineState)
wasEmpty = true
} else {
luaEngineState.chat = chat
luaEngineState.setVar = setVar
luaEngineState.getVar = getVar
}
return await luaEngineState.mutex.runExclusive(async () => {
if (wasEmpty || code !== luaEngineState.code) {
@@ -72,13 +78,13 @@ export async function runLua(code:string, arg:{
if(!LuaSafeIds.has(id) && !LuaEditDisplayIds.has(id)){
return
}
setVar(key, value)
luaEngineState.setVar(key, value)
})
luaEngine.global.set('getChatVar', (id:string,key:string) => {
if(!LuaSafeIds.has(id) && !LuaEditDisplayIds.has(id)){
return
}
return getVar(key)
return luaEngineState.getVar(key)
})
luaEngine.global.set('stopChat', (id:string) => {
if(!LuaSafeIds.has(id)){