Skip to content

State 2.0 变量回滚机制导致第三方插件定义的变量在重roll/删除楼层时丢失 #41

@hajimi-kun

Description

@hajimi-kun

Description / 问题描述

在开启 LittleWhiteBox (小白X) 的 State 2.0 (状态层) 模式后,插件会自动记录每一楼层的变量快照。然而,当用户执行 “重抽 (Regenerate)” 或 “删除楼层” 操作触发回滚时,小白X 会强制将整个酒馆变量池恢复到旧快照状态。

这种“全量覆盖”的回滚逻辑会导致在此期间由其他插件(如 JS-Slash-Runner)动态创建或修改的变量被直接抹除,无法在变量池中保留。

Steps to Reproduce / 复现步骤

开启小白X的变量管理,并启用 State 2.0 模式。
使用其他方式(如 JS-Slash-Runner 脚本或手动在控制台)定义一个变量 third_party_data。
进行几轮对话,确保该变量在当前上下文中存在。
对其中某一楼层点击 “重抽 (Regenerate)” 或直接 删除 最近的一条消息。
检查变量池:发现 third_party_data 丢失,或者回退到了小白X记录该楼层快照时的旧值,导致数据丢失。

Expected Behavior / 预期行为

变量回滚应该是“智能”或“可选”的。小白X 应该只负责回滚由其自身管理或标记过的变量,或者提供一种机制(如变量名前缀过滤)来保护第三方插件的数据不被回滚覆盖。

Actual Behavior / 实际行为

小白X 执行了全量覆盖(Overwrite)操作,将酒馆的 local variables 强制同步回快照状态,导致所有不在快照内或快照后更新的第三方变量被清空。

Technical Analysis / 技术分析

State 2.0 的快照机制(Snapshot)目前似乎是捕获了整个 extension_settings.variables 的状态。在回滚时,它通过劫持的 API 或直接操作变量池进行还原。

由于回滚逻辑没有区分“小白X 业务变量”和“系统/第三方通用变量”,导致了这种破坏性的覆盖。

Suggested Solutions / 建议解决方案

增量回滚 (Selective Rollback):仅回滚特定前缀(如 lwb_)的变量。
合并策略 (Merge Strategy):在回滚时,将快照数据与当前变量池进行合并(Merge),而不是完全覆盖(Overwrite)。
排除列表 (Exclusion List):允许用户在设置中指定哪些变量不参与 State 2.0 的回滚保护。
手动开关:提供一个选项,允许用户关闭“删除/重抽时自动触发回滚”的功能。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions