diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 156a3af7..5b5503bb 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -29,7 +29,7 @@ }, "productName": "RisuAI", "mainBinaryName": "RisuAI", - "version": "150.1.0", + "version": "150.2.0", "identifier": "co.aiclient.risu", "plugins": { "updater": { diff --git a/src/lang/en.ts b/src/lang/en.ts index f33b3572..f02fdb6c 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -375,6 +375,12 @@ export const languageEnglish = { v2SetRequestStateRoleDesc: "Set Request Data Role at {{index}} to {{value}}", v2GetRequestStateLength: "Get Request Data Length", v2GetRequestStateLengthDesc: "Get Request Data Length => {{outputVar}}", + v2IfAdvanced: "If (Advanced)", + v2IfAdvancedDesc: "If {{source}} {{condition}} {{target}}", + v2QuickSearchChat: "Quick Search Chat", + v2QuickSearchChatDesc: "Search {{value}} {{condition}} at depth {{depth}} => {{outputVar}}", + v2StopPromptSending: "Stop Prompt Sending", + v2StopPromptSendingDesc: "Stop Prompt Sending", }, confirm: "Confirm", @@ -1045,4 +1051,9 @@ export const languageEnglish = { }, bulkEnabling: "Lorebook Bulk Enabling", showTranslationLoading: "Show Translation Loading", + showDeprecatedTriggerV1: "Show Deprecated Trigger V1", + triggerV1Warning: "Trigger V1 is deprecated. it might be removed in the future.", + copy: "Copy", + paste: "Paste", + depth: "Depth", } diff --git a/src/lang/ko.ts b/src/lang/ko.ts index ca0ee54e..93891ae5 100644 --- a/src/lang/ko.ts +++ b/src/lang/ko.ts @@ -234,7 +234,7 @@ export const languageKorean = { "v2ShowAlert": "알림 표시", "v2ShowAlertDesc": "{{value}}로 알림 표시", "v2ExtractRegex": "정규식 추출", - "v2ExtractRegexDesc": "{{value}}에서 정규식 {{regexType}} {{regex}} 및 플래그 {{flagsType}} {{flags}}를 사용하여 텍스트 추출, 결과를 {{resultType}} {{result}}로 저장 => {{outputVar}}", + "v2ExtractRegexDesc": "{{value}}에서 정규식 {{regex}} 및 플래그 {{flags}}를 사용하여 텍스트 추출, 결과를 {{result}}로 저장 => {{outputVar}}", "v2GetLastMessage": "마지막 메시지 가져오기", "v2GetLastMessageDesc": "마지막 메시지 가져오기 => {{outputVar}}", "v2GetMessageAtIndex": "인덱스에서 메시지 가져오기", @@ -327,6 +327,12 @@ export const languageKorean = { "v2SetRequestStateRoleDesc": "{{index}}에 있는 리퀘스트 데이터 역할을 {{value}}로 설정", "v2GetRequestStateLength": "리퀘스트 데이터 길이 가져오기", "v2GetRequestStateLengthDesc": "리퀘스트 데이터 길이 가져오기 => {{outputVar}}", + "v2IfAdvanced": "만약 ~이라면 (고급)", + "v2IfAdvancedDesc": "만약 {{source}} {{condition}} {{target}} 이라면", + "v2QuickSearchChat": "빠른 채팅 검색", + "v2QuickSearchChatDesc": "{{value}}를 {{depth}} 깊이에서 {{condition}} 방식으로 검색 => {{outputVar}}", + "v2StopPromptSending": "프롬프트 전송 중단", + "v2StopPromptSendingDesc": "프롬프트 전송 중단", }, "confirm": "확인", "goback": "뒤로", @@ -967,4 +973,9 @@ export const languageKorean = { }, "bulkEnabling": "한번에 로어북 활성화 버튼", "showTranslationLoading": "번역 로딩 보이기", + "showDeprecatedTriggerV1": "비권장 트리거 V1 보이기", + "triggerV1Warning": "트리거 V1은 비권장입니다. 추후에 제거될 수 있습니다.", + "copy": "복사", + "paste": "붙여넣기", + "depth": "깊이", } diff --git a/src/lib/Setting/Pages/AdvancedSettings.svelte b/src/lib/Setting/Pages/AdvancedSettings.svelte index d92579b8..9ce9ec75 100644 --- a/src/lib/Setting/Pages/AdvancedSettings.svelte +++ b/src/lib/Setting/Pages/AdvancedSettings.svelte @@ -214,6 +214,9 @@
+
+ +
{/if} diff --git a/src/lib/SideBars/Scripts/TriggerList.svelte b/src/lib/SideBars/Scripts/TriggerList.svelte index 8348472c..8d3b8abb 100644 --- a/src/lib/SideBars/Scripts/TriggerList.svelte +++ b/src/lib/SideBars/Scripts/TriggerList.svelte @@ -13,6 +13,7 @@ import { hubURL } from "src/ts/characterCards"; import { PlusIcon } from "lucide-svelte"; import TriggerV2List from "./TriggerList2.svelte"; + import { DBState } from "src/ts/stores.svelte"; interface Props { value?: triggerscript[]; lowLevelAble?: boolean; @@ -22,6 +23,7 @@ let stb: Sortable = null let ele: HTMLDivElement = $state() let sorted = $state(0) + let v1Enabled = $derived(value?.[0]?.effect?.[0]?.type !== 'triggercode' && value?.[0]?.effect?.[0]?.type !== 'triggerlua' && value?.[0]?.effect?.[0]?.type !== 'v2Header') let opened = 0 const createStb = () => { if (!ele) { @@ -77,17 +79,14 @@
- {#if value?.[0]?.effect?.[0]?.type !== 'triggercode' && value?.[0]?.effect?.[0]?.type !== 'triggerlua' && value?.[0]?.effect?.[0]?.type !== 'v2Header' } -
+{#if v1Enabled} + {language.triggerV1Warning} +{/if} {#if value?.[0]?.effect?.[0]?.type === 'triggerlua'} + {/if} + + {#if (selectedEffectIndex !== -1 && value[selectedIndex].effect[selectedEffectIndex].type !== 'v2EndIndent') || selectMode === 0} + + {/if} + + + + {#if (selectedEffectIndex !== -1 && value[selectedIndex].effect[selectedEffectIndex].type !== 'v2EndIndent') || selectMode === 0} + + {/if} + + {/if} +
{#if menuMode === 0}
@@ -882,7 +1090,17 @@ @@ -906,7 +1124,10 @@
-
+
{ + selectMode = 1 + selectedEffectIndex = -1 + }}>
{language.name} { @@ -938,38 +1159,34 @@
{#each value[selectedIndex].effect as effect, i} - {#if effect.type === 'v2EndIndent'} - - {:else} - - {/if} + {/if} + {/each} @@ -1019,27 +1243,56 @@ {language.var} - {:else if editTrigger.type === 'v2If'} + {:else if editTrigger.type === 'v2If' || editTrigger.type === 'v2IfAdvanced'} {language.varName} + {#if editTrigger.type === 'v2IfAdvanced'} + + {language.value} + {language.var} + + {/if} {language.condition} - + { + if(e.currentTarget.value === '≡'){ + const trg = editTrigger as triggerV2IfAdvanced + trg.condition = '≡' + trg.target = 'true' + trg.targetType = 'value' + } + }}> = {">"} {"<"} {"≥"} {"≤"} + {#if editTrigger.type === 'v2IfAdvanced'} + + + + + + + {/if} {language.value} - - {language.value} - {language.var} - - + {#if editTrigger.condition === '≡'} + + true + false + null + + {:else} + + {language.value} + {language.var} + + + {/if} {:else if editTrigger.type === 'v2RunTrigger'} @@ -1633,6 +1886,31 @@ {:else if editTrigger.type === 'v2GetRequestStateLength'} {language.outputVar} + {:else if editTrigger.type === 'v2QuickSearchChat'} + {language.value} + + {language.value} + {language.var} + + + + {language.condition} + + loose + strict + regex + + + {language.depth} + + {language.value} + {language.var} + + + + {language.outputVar} + + {:else} {language.noConfig} {/if} @@ -1641,7 +1919,7 @@ if(selectedEffectIndex === -1){ value[selectedIndex].effect.push(editTrigger) - if(editTrigger.type === 'v2If' || editTrigger.type === 'v2Loop' || editTrigger.type === 'v2Else' || editTrigger.type === 'v2LoopNTimes'){ + if(editTrigger.type === 'v2If' || editTrigger.type === 'v2IfAdvanced' || editTrigger.type === 'v2Loop' || editTrigger.type === 'v2Else' || editTrigger.type === 'v2LoopNTimes'){ value[selectedIndex].effect.push({ type: 'v2EndIndent', indent: editTrigger.indent + 1, @@ -1662,7 +1940,7 @@ } else if(menuMode === 2){ editTrigger.indent = (value[selectedIndex].effect[selectedEffectIndex] as triggerEffectV2).indent - if(editTrigger.type === 'v2If' || editTrigger.type === 'v2Loop' || editTrigger.type === 'v2LoopNTimes' || editTrigger.type === 'v2Else'){ + if(editTrigger.type === 'v2If' || editTrigger.type === 'v2IfAdvanced' || editTrigger.type === 'v2Loop' || editTrigger.type === 'v2LoopNTimes' || editTrigger.type === 'v2Else'){ if(addElse){ value[selectedIndex].effect.splice(selectedEffectIndex, 0, { type: 'v2Else', diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts index 87f46090..50f304ff 100644 --- a/src/ts/parser.svelte.ts +++ b/src/ts/parser.svelte.ts @@ -303,7 +303,6 @@ async function replaceAsync(string, regexp, replacerFunction) { } async function getAssetSrc(assetArr: string[][], name: string, assetPaths: {[key: string]:{path: string, ext?: string}}) { - name = name.toLocaleLowerCase() for (const asset of assetArr) { if (trimmer(asset[0].toLocaleLowerCase()) !== trimmer(name)) continue const assetPath = await getFileSrc(asset[1]) @@ -341,6 +340,7 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c let needsSourceAccess = false data = await replaceAsync(data, assetRegex, async (full:string, type:string, name:string) => { + name = name.toLocaleLowerCase() const moduleAssets = getModuleAssets() if (char.additionalAssets) { await getAssetSrc(char.additionalAssets, name, assetPaths) diff --git a/src/ts/process/modules.ts b/src/ts/process/modules.ts index 73a9b80d..8b870f6e 100644 --- a/src/ts/process/modules.ts +++ b/src/ts/process/modules.ts @@ -268,7 +268,10 @@ function getModuleByIds(ids:string[]){ modules.push(module) } } - return deduplicateModuleById(modules) + if(db.moduleIntergration){ + modules = deduplicateModuleById(modules) + } + return modules } function deduplicateModuleById(modules:RisuModule[]){ diff --git a/src/ts/process/triggers.ts b/src/ts/process/triggers.ts index fff25062..14f314b5 100644 --- a/src/ts/process/triggers.ts +++ b/src/ts/process/triggers.ts @@ -38,7 +38,8 @@ export type triggerEffectV2 = triggerV2Header|triggerV2IfVar|triggerV2Else|tri triggerV2PushArrayVar|triggerV2PopArrayVar|triggerV2ShiftArrayVar|triggerV2UnshiftArrayVar|triggerV2SpliceArrayVar|triggerV2GetFirstMessage| triggerV2SliceArrayVar|triggerV2GetIndexOfValueInArrayVar|triggerV2RemoveIndexFromArrayVar|triggerV2ConcatString|triggerV2GetLastUserMessage| triggerV2GetLastCharMessage|triggerV2GetAlertInput|triggerV2GetDisplayState|triggerV2SetDisplayState|triggerV2UpdateGUI|triggerV2Wait| - triggerV2GetRequestState|triggerV2SetRequestState|triggerV2GetRequestStateRole|triggerV2SetRequestStateRole|triggerV2GetReuqestStateLength + triggerV2GetRequestState|triggerV2SetRequestState|triggerV2GetRequestStateRole|triggerV2SetRequestStateRole|triggerV2GetReuqestStateLength|triggerV2IfAdvanced| + triggerV2QuickSearchChat|triggerV2StopPromptSending export type triggerConditionsVar = { type:'var'|'value' @@ -173,7 +174,7 @@ export type triggerV2Header = { export type triggerV2IfVar = { type: 'v2If', - condition: '='|'!='|'>'|'<'|'>='|'<='|'null'|'true'|'false', + condition: '='|'!='|'>'|'<'|'>='|'<=', targetType: 'var'|'value', target: string, source: string, @@ -678,9 +679,36 @@ export type triggerV2Wait = { indent: number } +export type triggerV2IfAdvanced = { + type: 'v2IfAdvanced', + condition: '='|'!='|'>'|'<'|'>='|'<='|'≒'|'∋'|'∈'|'∌'|'∉'|'≡' + targetType: 'var'|'value', + target: string, + sourceType: 'var'|'value', + source: string, + indent: number +} + +export type triggerV2QuickSearchChat = { + type: 'v2QuickSearchChat', + value: string, + valueType: 'var'|'value', + condition: 'loose'|'strict'|'regex', + depth: string, + depthType: 'var'|'value', + outputVar: string, + indent: number +} + +export type triggerV2StopPromptSending = { + type: 'v2StopPromptSending', + indent: number +} + const safeSubset = [ 'v2SetVar', 'v2If', + 'v2IfAdvanced', 'v2Else', 'v2EndIndent', 'v2LoopNTimes', @@ -1169,8 +1197,9 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{ setVar(varKey, resultValue) break } - case 'v2If':{ - const sourceValue = getVar(risuChatParser(effect.source,{chara:char})) + case 'v2If': + case 'v2IfAdvanced':{ + const sourceValue = (effect.type === 'v2If' || effect.sourceType === 'var') ? getVar(risuChatParser(effect.source,{chara:char})) : risuChatParser(effect.source,{chara:char}) const targetValue = effect.targetType === 'value' ? risuChatParser(effect.target,{chara:char}) : getVar(risuChatParser(effect.target,{chara:char})) let pass = false switch(effect.condition){ @@ -1208,6 +1237,60 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{ pass = Number(sourceValue) <= Number(targetValue) break } + case '∈':{ + try { + pass = JSON.parse(targetValue).includes(sourceValue) + } catch (error) { + pass = false + } + break + } + case '∋':{ + try { + pass = JSON.parse(sourceValue).includes(targetValue) + } catch (error) { + pass = false + } + break + } + case '∉':{ + try { + pass = !JSON.parse(targetValue).includes(sourceValue) + } catch (error) { + pass = true + } + break + } + case '∌':{ + try { + pass = !JSON.parse(sourceValue).includes(targetValue) + } catch (error) { + pass = true + } + break + } + case '≒':{ + const num1 = Number(sourceValue) + const num2 = Number(targetValue) + if(Number.isNaN(num1) || Number.isNaN(num2)){ + pass = sourceValue.toLocaleLowerCase().replace(/ /g,'') === targetValue.toLocaleLowerCase().replace(/ /g,'') + } + else{ + pass = Math.abs(num1 - num2) < 0.0001 + } + break + } + case '≡':{ + if(targetValue === 'true'){ + pass = sourceValue === 'true' || sourceValue === '1' + } + else if(targetValue === 'false'){ + pass = !(sourceValue === 'true' || sourceValue === '1') + } + else{ + pass = sourceValue === targetValue + } + } } @@ -1814,6 +1897,29 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{ setVar(effect.outputVar, json.length.toString()) break } + case 'v2QuickSearchChat':{ + const value = effect.valueType === 'value' ? risuChatParser(effect.value,{chara:char}) : getVar(risuChatParser(effect.value,{chara:char})) + const depth = effect.depthType === 'value' ? Number(risuChatParser(effect.depth,{chara:char})) : Number(getVar(risuChatParser(effect.depth,{chara:char}))) + const condition = effect.condition + + if(isNaN(depth)){ + setVar(effect.outputVar, '0') + break + } + let pass = false + let da = chat.message.slice(0-depth).map((v)=>v.data).join(' ') + if(condition === 'strict'){ + pass = da.split(' ').includes(value) + } + else if(condition === 'loose'){ + pass = da.toLowerCase().includes(value.toLowerCase()) + } + else if(condition === 'regex'){ + pass = new RegExp(value).test(da) + } + setVar(effect.outputVar, pass ? '1' : '0') + break + } } } } diff --git a/src/ts/storage/database.svelte.ts b/src/ts/storage/database.svelte.ts index eca4fa38..0d8eb46c 100644 --- a/src/ts/storage/database.svelte.ts +++ b/src/ts/storage/database.svelte.ts @@ -12,7 +12,7 @@ import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme'; import type { PromptItem, PromptSettings } from '../process/prompt'; import type { OobaChatCompletionRequestParams } from '../model/ooba'; -export let appVer = "150.1.0" +export let appVer = "150.2.0" export let webAppSubVer = '' @@ -902,6 +902,7 @@ export interface Database{ reasoningEffort:number bulkEnabling:boolean showTranslationLoading: boolean + showDeprecatedTriggerV1:boolean } interface SeparateParameters{ diff --git a/version.json b/version.json index f906a9a4..571d9169 100644 --- a/version.json +++ b/version.json @@ -1 +1 @@ -{"version":"150.1.0"} \ No newline at end of file +{"version":"150.2.0"} \ No newline at end of file