StoryMoss 领域参考
每条都是“在本项目怎么用/为什么”,不是通用教材。
Tauri 2.4 IPC(Command + Event + State)
- Command:Rust
#[tauri::command] async fn foo(state: State<'_, DbPool>, ...) -> Result<T, AppError>;handlers.rs的generate_handler![]宏集中注册;前端services/api/core.ts的loggedInvoke<T>调用(参数脱敏 + 耗时 + 统一错误)。 - Event:Rust
state_sync/events.rs的SyncEvent(#[derive(TS)]自动生成 TS 到src-frontend/src/generated/);前端hooks/useSyncStore.ts监听sync-event精确失效 TanStack Query 缓存。16+ 种事件。 - State:Tauri
app.manage(x)注入,state::<T>()读取。陷阱:读取未 manage 的 state 会启动 panic(Issue #4 / v0.23.6);注入顺序敏感。
TipTap / ProseMirror(幕前编辑器)
- 幽灵文本(Ghost Text):
generatedTextstate 驱动shouldShowGhostTree(仅!!generatedText渲染,避免空幽灵容器残留——v0.26.13)。 - 竞态:TipTap DOM 滞后于 React
contentprop;用latestContentRef(React 同步快照)作重复检测基准而非editorRef.getText()(v0.26.9)。 - 自动保存 2s debounce + onChange 200ms IPC 节流;
appendText后立即getHTML()同步 store(v0.26.11)。 RichTextEditorRef暴露getHTML()/appendText()。
rusqlite + r2d2(SQLite 连接池)
DbPool= r2d2 池。必须.connection_timeout(5s)(v0.23.19 教训:默认无限阻塞 → 600s)。- 高频 DB 写入走
spawn_blockingfire-and-forget,不阻塞 tokio worker(record_llm_call模式)。 MigrationRunner(自定义,因 rusqlite 0.39 未用 refinery 默认特性):扫描V###__*.sql,按 version 排序,schema_migrations表追踪,每迁移独立事务,幂等跳过duplicate column/already exists。
LanceDB + SQLite 向量兜底
- 向量存储:
LanceVectorStore+ SQLitekg_entities.embeddingBLOB 持久化。 - LanceDB 持久化 blocked:Arrow 依赖与当前工具链冲突;当前 SQLite 兜底。
- CJK Bigram Tokenizer:中文二元组分词,BM25 + 向量余弦 + RRF 融合(
score = Σ 1/(k+rank),k=60)。
Zustand + TanStack Query
stores/appStore.ts(Zustand):currentStory/stories[]/UI 状态。useSyncStore.ts:监听 Rustsync-event,按事件类型精确 invalidate TanStack Query 缓存。App.tsx:currentStory变化时cancelQueries+invalidateQueries。backendActivityStore:后台活动计数;订阅去抖(v0.25.1);isAnyBackendActive决定输入框是否禁用。
ts-rs 类型生成
- Rust enum 加
#[derive(TS)]→ 编译时生成src-frontend/src/generated/*.ts。 - 前端
assertUnreachable(x: never): never在 switch default 兜底;新增 variant 编译失败 → 强制穷尽匹配。
KMP 最长 border(自重复检测)
trim_self_repetition(Rustutils/text.rs)/trimSelfRepetition(TSutils/):归一化后做 KMP 最长 border 检测,保守阈值(重复长度 ≥30 字且 ≥ 全文 8%)裁掉尾部重复前缀;段落级先检测“后半段==前半段”/“末段==首段”。- 跨层一致:
tests/fixtures/trim_golden.json7 用例 Rust + TS 双跑。
艾宾浩斯遗忘曲线(记忆保留)
R(t) = R₀·e^(-λt) + Σ强化奖励;λ 架构级 0.01 / 默认 0.05 / 瞬态 0.1。- 五级优先级 Critical(>0.8)/High(0.6-0.8)/Medium(0.4-0.6)/Low(0.2-0.4)/Forgotten(<0.2)。
MemoryOrchestrator三层预算:Working 50% / Episodic 30% / Semantic 20%(write 任务)。注:CONTEXT.md标注MemoryOrchestrator已实现但「Pending: wiring StoryContextBuilder to call QueryPipeline + MemoryOrchestrator for Full mode」——即预算定义在代码中,尚未完全接入 Full 生成路径,当前行为可能未充分体现该预算。
合同驱动(Story System v6.0.0)
- 四级合同
MASTER_SETTING → Volume → Chapter → Review;SCENE_COMMIT写后真源(state/entity/events/projection_status JSON)。 - 5 Projection Writer:State/Index/Summary/Memory/Vector;
ContractTree/RuntimeContract动态合并上层合同 → 运行时约束。 - 防幻觉三定律:合同即法律、设定即物理、发明需识别。
分时介入三时间线(v0.13.0)
- 热路径
WriteTimeBundle(红线 + 角色核心 + 场景大纲 + 题材反模式)直连 LLM <15s。 - 温路径
AuditExecutor7 维 Inspector 后台 30-90s,inline 标注(ai_audit类型,severity 红黄蓝)回流。 - 冷路径
InsightExecutor每 5 段深度报告 → 叙事分析页。 DebtIndicator顶栏实时未处理标注数。
ContextPrioritizer(v0.25.0)
ContextChunk按 Critical/High/Normal/Background 排序;Critical 在开头 + 结尾轻量摘要双重锚定,缓解 "Lost in the Middle"。
何时 NOT 用本技能
- 具体怎么改/能不能改 →
sf-architecture-contract。 - 失败模式 →
sf-debugging-playbook。 - 配置开关 →
sf-config-and-flags。
出处与维护
- 重验证命令:
rg -n 'connection_timeout|spawn_blocking' src-tauri/src/llm src-tauri/src/db | headrg -n '#\[derive\(TS\)\]' src-tauri/src | headls src-tauri/src/db/migrations/ | head(迁移命名)rg -n 'latestContentRef|shouldShowGhostTree' src-frontend/src | head
- 易漂移项:依赖版本、阈值常量、IPC 事件清单。
- 最后核对:2026-07-07,v0.26.23。