feat: Tauri SQLite 事件持久化 + 讲述点追问补全(缺失检测→模板追问→沉默即数据)

This commit is contained in:
Jayway Liu
2026-10-03 12:55:00 +08:00
parent 6117ef894f
commit ba50cf3928
18 changed files with 1360 additions and 34 deletions
+3 -1
View File
@@ -2,6 +2,7 @@ import { useMemo, useState } from 'react';
import './App.css';
import { StoryEngine } from './engine/engine';
import { LocalStorageEventStore } from './engine/eventStore';
import { SqliteEventStore, isTauriRuntime } from './engine/sqliteEventStore';
import type { Chapter } from './engine/types';
import { getJevClient } from './services/jev';
import { StoryPlayer } from './ui/StoryPlayer';
@@ -15,8 +16,9 @@ const chapters = [chapter1, chapter2, chapter3] as Chapter[];
export default function App() {
const [screen, setScreen] = useState<'story' | 'report'>('story');
// 引擎与存储整个会话只建一次;重玩走 engine.replay()(新 sessionId,旧事件保留)
// 运行时选择:Tauri 原生端用 SQLite,浏览器 dev 用 localStorage(同一 append-only 接口)
const { engine, store, jev } = useMemo(() => {
const store = new LocalStorageEventStore();
const store = isTauriRuntime() ? new SqliteEventStore() : new LocalStorageEventStore();
const jev = getJevClient();
return { engine: new StoryEngine(chapters, store, jev), store, jev };
}, []);