🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

酒馆 SQLite 存档 huajiao1998/dsh-tavern-sqlite-v2

DeepSeek Harness
huajiao199812 天前有提交已提供中文文档扫描:含敏感能力

DSH 酒馆会话 SQLite 接管插件服务端计算代

42/100
综合分
13
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add huajiao1998/dsh-tavern-sqlite-v2
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · chat
装得上吗
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/21) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-tavern-sqlite-v2(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 06:41:23

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 97 处,展示前 70 条)
  • 读取本地文件
    index.js:47
    const entry = hostModuleBases.map((base) => path.join(base, segment)).find((candidate) => existsSync(candidate))
  • 读取本地文件
    index.js:334
    entries = readdirSync(this.root)
  • 写入本地文件
    index.js:428
    mkdirSync(path.dirname(file), { recursive: true })
  • 删除本地文件
    index.js:515
    for (const suffix of ['', '-wal', '-shm']) rmSync(file + suffix, { force: true })
  • 写入本地文件
    lib/worldbook-recall-store.js:14
    const root=resolve(dataRoot);mkdirSync(root,{recursive:true});const db=new DatabaseSync(join(root,'worldbook-recalls.db'))
  • 写入本地文件
    lib/rollback-global-variables.js:34
    const root=resolve(dataRoot);mkdirSync(root,{recursive:true});const db=new DatabaseSync(join(root,databaseName))
  • 读取本地文件
    lib/db-save-exchange.js:15
    const files = readdirSync(dir)
  • 删除本地文件
    lib/db-save-exchange.js:18
    rmSync(path.join(dir, name), { force: true })
  • 删除本地文件
    lib/db-save-exchange.js:20
    rmdirSync(dir)
  • 读取本地文件
    lib/db-save-exchange.js:93
    return { id, tables: inspected.tables, data: readFileSync(file) }
  • 读取本地文件
    lib/db-save-exchange.js:104
    const buffer = encodeDbSave({ manifest, archive: readFileSync(path.join(dir, 'chat.db')), sessions: native.map(({ id, data }) => ({ id, data })), reso
  • 写入本地文件
    lib/db-save-exchange.js:125
    const file = path.join(dir, 'chat.db'); writeFileSync(file, save.archive, { flag: 'wx' })
  • 写入本地文件
    lib/db-save-exchange.js:131
    const target = path.join(dir, 'native-' + index + '.db'); writeFileSync(target, item.data, { flag: 'wx' })
  • 写入本地文件
    lib/db-save-exchange.js:149
    mkdirSync(path.dirname(archiveTarget), { recursive: true })
  • 读取本地文件
    lib/db-save-exchange.js:172
    try { if (existsSync(path.dirname(archiveTarget)) && readdirSync(path.dirname(archiveTarget)).length === 0) rmdirSync(path.dirname(archiveTarget)) } c
  • 删除本地文件
    lib/db-save-exchange.js:172
    try { if (existsSync(path.dirname(archiveTarget)) && readdirSync(path.dirname(archiveTarget)).length === 0) rmdirSync(path.dirname(archiveTarget)) } c
  • 读取本地文件
    lib/db-save-exchange.js:172
    try { if (existsSync(path.dirname(archiveTarget)) && readdirSync(path.dirname(archiveTarget)).length === 0) rmdirSync(path.dirname(archiveTarget)) } c
  • 读取本地文件
    chat-sqlite-store.js:67
    try { return JSON.parse(await readFile(target, 'utf8')) } catch (error) { if (error?.code === 'ENOENT') return undefined; throw error }
  • 读取本地文件
    chat-sqlite-store.js:282
    return 'sqlite:gen:' + (generations.get(id) || 0) + ((exists === undefined ? existsSync(dbFile(id)) : exists) ? '' : ':empty')
  • 读取本地文件
    chat-sqlite-store.js:302
    if (!existsSync(file)) throw Error('首版DB-only:本局没有权威SQL存档')
  • 读取本地文件
    chat-sqlite-store.js:310
    if (hasLegacyArtifact(id) || existsSync(path.join(chatsRoot, id))) throw Error('DB导入Chat新身份已存在,拒绝覆盖')
  • 读取本地文件
    chat-sqlite-store.js:316
    if (existsSync(path.join(chatsRoot, id + '.json'))) return true
  • 读取本地文件
    chat-sqlite-store.js:318
    if (!existsSync(dir)) return false
  • 写入本地文件
    chat-sqlite-store.js:575
    if (create) mkdirSync(path.dirname(file), { recursive: true })
  • 删除本地文件
    chat-sqlite-store.js:1163
    try { rmSync(dbFile(chatId) + suffix, { force: true }) } catch { }
  • 删除本地文件
    chat-sqlite-store.js:2176
    rmSync(dbFile(id), { force: true })
  • 删除本地文件
    chat-sqlite-store.js:2177
    for (const suffix of ['-wal', '-shm']) rmSync(dbFile(id) + suffix, { force: true })
  • 读取本地文件
    variable-sqlite-store.js:45
    if (!create && !existsSync(file)) return null
  • 写入本地文件
    variable-sqlite-store.js:52
    if (create) mkdirSync(path.dirname(file), { recursive: true })
  • 删除本地文件
    variable-sqlite-store.js:232
    try { rmSync(file + suffix, { force: true }) } catch { }
  • 发起网络请求
    client.js:446
    ? await view.request('rollbackTurn', { expectedTurn: ft }, owner)
  • 发起网络请求
    client.js:447
    : await view.request('rollbackTurn', { expectedTurn: Number(turn), failureTarget: ft }, owner)
  • 读取本地文件
    lib/legacy-bindings.js:34
    const info = statSync(target, { bigint: true })
  • 读取本地文件
    lib/legacy-bindings.js:60
    if (!existsSync(file)) {
  • 读取本地文件
    lib/legacy-bindings.js:94
    if (!path.isAbsolute(artifactPath) || !existsSync(artifactPath)) throw new Error('原档绑定必须指向现存绝对路径')
  • 写入本地文件
    lib/legacy-bindings.js:96
    mkdirSync(path.dirname(file), { recursive: true })
  • 写入本地文件
    lib/legacy-fork-records.js:90
    mkdirSync(path.dirname(file), { recursive: true })
  • 读取本地文件
    lib/legacy-fork-records.js:113
    if (!existsSync(file)) return undefined
  • 读取本地文件
    lib/tavern-chat-state.js:12
    const manifest = JSON.parse(readFileSync(path.join(home, 'profiles', 'tavern', 'package.json'), 'utf8'))
  • 读取本地文件
    lib/tavern-chat-state.js:33
    const info = statSync(file, { bigint: true })
  • 读取本地文件
    lib/tavern-chat-state.js:46
    const raw = JSON.parse(readFileSync(file, 'utf8'))
  • 读取本地文件
    lib/tavern-chat-state.js:75
    return chatId !== '' && !hasLegacyArtifact(chatId, root) && existsSync(path.join(root, 'chats', chatId, 'archive.db'))
  • 读取本地文件
    lib/tavern-chat-state.js:82
    if (existsSync(path.join(root, 'chats', chatId, 'head.json'))) return true
  • 读取本地文件
    lib/tavern-chat-state.js:83
    if (existsSync(path.join(root, 'chats', chatId + '.json'))) return true
  • 读取本地文件
    lib/standard-host.js:208
    return JSON.parse(readFileSync(file, 'utf8'))
  • 读取本地文件
    lib/legacy-session-reader.js:18
    const identity = statSync(path, { bigint: true })
  • 读取本地文件
    store.js:345
    return existsSync(this.pathOf(id))
  • 读取本地文件
    store.js:350
    return statSync(this.pathOf(id)).size
  • 写入本地文件
    store.js:374
    mkdirSync(this.root, { recursive: true })
  • 读取本地文件
    lib/db-save-codec.js:217
    if (existsSync(output)) throw Error('DB导入拒绝覆盖已存在目标')
  • 删除本地文件
    lib/db-save-codec.js:237
    for (const suffix of ['', '-wal', '-shm', '-journal']) rmSync(output + suffix, { force: true })
  • 读取本地文件
    lib/db-save-codec.js:255
    const stat = statSync(file, { bigint: true })
  • 读取本地文件
    lib/db-save-codec.js:266
    const stat = statSync(item.file, { bigint: true })
  • 读取本地文件
    lib/domain/host-session-patch.js:36
    const text = await readFile(path, 'utf8')
  • 读取本地文件
    lib/domain/host-session-patch.js:68
    const pkg = JSON.parse(await readFile(require.resolve('@deepseek-ai/dsh-session/package.json'), 'utf8'))
  • 读取本地文件
    lib/domain/host-session-patch.js:265
    assert.equal(await readFile(path, 'utf8'), text)
  • 读取本地文件
    lib/domain/host-session-patch.js:404
    try { text = readFileSync(workerPath, 'utf8') } catch (error) { say('读取失败,跳过:' + (error?.message || error)); return undefined }
  • 读取本地文件
    lib/domain/host-session-patch.js:423
    if (existsSync(target)) say('副本已存在(复用): ' + target)
  • 写入本地文件
    lib/domain/host-session-patch.js:424
    else { writeFileSync(target, patched, 'utf8'); say('已写出副本: ' + target) }
  • 读取本地文件
    lib/domain/host-session-patch.js:510
    hostVersion = JSON.parse(readFileSync(require.resolve('@deepseek-ai/dsh-session/package.json'), 'utf8')).version || ''
  • 读取本地文件
    migrate.js:40
    projectDirs = readdirSync(root, { withFileTypes: true })
  • 读取本地文件
    migrate.js:50
    files = readdirSync(sessionDir)
  • 读取本地文件
    migrate.js:73
    const raw = readFileSync(path)
  • 执行外部命令来自配置/变量
    deploy/bootstrap.mjs:230
    const child = spawn(process.execPath, argv, { stdio: 'inherit', detached: process.platform !== 'win32', windowsHide: true })
  • 读取本地文件
    deploy/client-seams.mjs:28
    const fsread=rel=>readFileSync(path.join(appDir,rel),'utf8'),read=sourceReader??fsread,writes=new Map(),main=read(source+'main.js')
  • 读取本地文件
    deploy/client-seams.mjs:39
    for(const rel of ['turn-error-controls.js','features/play-controls.js','features/turn-history.js','ui/error-center.js','helper-resources.js','runtime/
  • 读取本地文件
    deploy/core-rollback-transform.mjs:449
    const source = readFileSync(path.resolve(file), 'utf8')
  • 执行外部命令来自配置/变量
    deploy/repair-residual.mjs:9
    const result = spawnSync(process.execPath, [entry, 'uninstall', ...args], { stdio: 'inherit', windowsHide: true })
  • 读取本地文件
    deploy/standard-seam-transforms.mjs:154
    write.set(DOMAIN + 'storage-failure-state.js', readFileSync(new URL('./storage-failure-state.shim.js', import.meta.url), 'utf8'))
  • 读取本地文件
    deploy/standard-seam-transforms.mjs:198
    write.set(DOMAIN + 'chat-sqlite-store.js', readFileSync(new URL('./chat-sqlite-store.shim.js', import.meta.url), 'utf8'))
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/dsh-session@deepseek-ai/dsh-session-persistence@deepseek-ai/dsh-session-persistence-jsonl@deepseek-ai/dsh-session-query
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 接管会话SQLite存储
  • 服务端计算代理

README

由 DeepSeek 最新模型翻译生成
DSH Tavern SQLite V2 · stable 这是 SQLite V2 的 stable 源码线,0.4.20 起面向酒馆稳定版维护;main / DSH 0.2 适配另行开发,本包不自动跟进。公开源码不带本地作者夹具、临时目录或依赖树。 - 上游只跟踪 stable,本轮核到 9603eca4f854b55980b632a691a0d8aec900a49a(Tavern 2.7.0),不自动跟 main/DSH 0.2。 - 运行时包名仍为 dsh-tavern-sqlite-v2,已有装配、接缝与数据目录保持兼容;这是替换同一插件的另一源码线,不可与原V2同时安装。 - 当前版本为 0.4.24 stable:修复正文重新生成的步骤接续、替换后结算、注入累计及失败同步重试;188用户试用反馈正常后正式发布。 - 发布测试:只跑一次全量(1211 tests,首轮22失败含1文件加载失败),修复后仅29条原失败及直接受影响叶定向通过,零跳过/取消,未重跑全量。补丁不增加无谓校验/分类/名单;覆盖及页面/MVU边界见 交付说明。 始终启用酒馆服务端计算、SQLite 增量存档、历史按需读取,以及正文和状态一起回退。 这是面向 DSH Tavern 的存储与服务端计算接线插件。
展开完整文档(README 剩余 1 节)
DSH Tavern SQLite V2 · stable

这是 SQLite V2 的 stable 源码线,0.4.20 起面向酒馆稳定版维护;main / DSH 0.2 适配另行开发,本包不自动跟进。公开源码不带本地作者夹具、临时目录或依赖树。

- 上游只跟踪 stable,本轮核到 9603eca4f854b55980b632a691a0d8aec900a49a(Tavern 2.7.0),不自动跟 main/DSH 0.2。
- 运行时包名仍为 dsh-tavern-sqlite-v2,已有装配、接缝与数据目录保持兼容;这是替换同一插件的另一源码线,不可与原V2同时安装。
- 当前版本为 0.4.24 stable:修复正文重新生成的步骤接续、替换后结算、注入累计及失败同步重试;188用户试用反馈正常后正式发布。
- 发布测试:只跑一次全量(1211 tests,首轮22失败含1文件加载失败),修复后仅29条原失败及直接受影响叶定向通过,零跳过/取消,未重跑全量。补丁不增加无谓校验/分类/名单;覆盖及页面/MVU边界见 交付说明。

始终启用酒馆服务端计算、SQLite 增量存档、历史按需读取,以及正文和状态一起回退。

这是面向 DSH Tavern 的存储与服务端计算接线插件。保留酒馆界面,把聊天、会话事件和 MVU 变量历史交给 SQLite 管理;计算调用酒馆自身的服务端执行链,浏览器只保留界面职责。插件不自带 MVU、卡脚本、Helper 或 VM 实现。

下载最新版 · 一键安装 · 原档继续使用 · 详细安装说明 · 更新日志

功能亮点

| 特点 | 为你解决什么问题 |
| 始终使用酒馆服务端计算 | MVU 结算、卡脚本与 Helper 计算统一调用酒馆自身的服务端执行链;插件不自带计算引擎,也不把页面作为备用执行端。服务端不可用时保留并明确失败/等待,不回落客户端。 |
| SQLite 增量存档 | 聊天头字段、消息楼层分开存储,局部更新只处理变化部分,避免为了追加或修改一楼反复重写全部历史。会话事件由 SQLite 事务与 WAL 管理。 |
| 历史按需读取 | 消息窗口、指定楼层、结算检查点按范围读取;显示、后台配置与场景各取所需字段,不为取少量信息先复制整档。 |
| MVU 变量历史瘦身 | 正文与变量归档使用同库、同连接事务;旧变量树先归档再退出热状态,近期楼层保留热窗口,查看旧楼按楼层和 swipe 补回并复用缓存。 |
| 真正的物理尾部回退 | 不是隐藏气泡:截断被撤销的事件尾部,回拨运行轮次和写句柄,重建内存投影并清理对应派生状态。 |
| 错误提示与失败轮次干净清理 | 失败轮有明确提示和清理入口。清理时恢复到该轮开始前的正文、变量与进度,并清掉对应的事件和运行状态;只处理当前最新失败轮,保留此前成功内容。 |
| 前后台同步恢复 | 同步受影响会话的状态、队列与任务基线,隔离旧任务、旧租约和迟到写入,避免撤销内容被重新写回。 |
| 原档保留,独立分叉继续玩 | 原档保持只读;用户主动创建新的聊天与原生会话身份,在 SQLite 新分叉中继续,源档及源链接保留。 |
| 一键安装,也能安全卸载 | Windows 解压后运行菜单,Linux 复制一条命令,默认自动识别酒馆。卸载按现场完整注释区块撤除本包注入(半截区块、归属不明、双源一律明确拒绝),保留原档与 SQLite 数据库,不把数据库档转回 JSON。 |

为什么不只是“换个数据库”?

- 少写:头字段与楼层分别更新,只提交最终变化部分,减少无意义的全档比较和序列化。
- 少读、少复制:按消费者需要投影数据,旧楼变量补数走有界缓存;不是把上下文砍短来换速度。
- 变量与正文一起提交:同库同事务,归档失败整笔回滚,避免正文已经保存、变量却没跟上的半态。
- 回退到一致状态:同时处理本档剧情、变量、进度与被撤销轮的运行数据;资源库原件和独立手工编辑不跟着剧情回退撤销。

以上是已实现的机制,不是“所有场景快几倍”的性能保证;冷读、新 revision 或显式全量读取仍可能处理较多历史,页面体验以实际环境为准。

一键安装

版本 0.4.24 stable:面向 Tavern 2.7.0 / DSH 0.1.5-rc.2代(peer <0.2.0),目标上游 stable 9603eca,本次重生成接缝另用 a390af17 作者程序副本精确验证;不是 main 3.0 / DSH 0.2 兼容版。 支持最新一次发送的统一撤销:不论该次发送本身成功、报错、被中断、只留下部分产物,也不论上一轮是成功、失败、未完成还是未知形态,都由你主动回退到发送前状态;回合形态不构成回退资格。 目标适配版本以对应 Releases 更新说明为准;其他未适配版本可能运行报错,请更新到标注的酒馆版本或自行适配插件。安装检查通过不代表运行期功能兼容。

已有兼容酒馆即可使用,主命令无需填写版本或目录。

Windows 桌面版

1. 从 Releases 下载 -win.zip,解压到酒馆目录内。
2. 从托盘完全退出酒馆,进入解压出的插件文件夹,双击 run-install.cmd,选择安装。
3. 完成后重新启动酒馆。

更新、卸载、只读检查都在同一个菜单中;使用最新版安装器处理旧代。独立桌面包未额外安装 Node 时,安装器可复用它自带的运行时。
0.3.0 也适配「先装 DSH Desktop,再装酒馆」的形态:还是同一套安装器,用 -TavernHome 和 -DesktopApp 指明 home 和宿主安装根目录;维护需要 PATH 或既有工具缓存里的 Node,建议用 Node.js 24。菜单和进度实时显示,启动器不会因为日志缺失就重复执行。这个形态已做源码和隔离验证,实机启动和页面仍待使用者确认;预检与安装用法。

Linux CLI

curl -fsSL https://github.com/huajiao1998/dsh-tavern-sqlite-v2/releases/latest/download/install.sh | sh -s -- install

默认从 DSH_TAVERN_CLI_HOME、DSH_HOME、当前工作目录和 ~/.dsh-tavern 里已有的 profile 自动识别酒馆。找到唯一实例就直接继续,只有没找到或有多个实例才提示人工选择;正常安装不必手填路径,也不是全盘搜索任意自定义目录。

非默认位置可从酒馆 home 工作目录执行;systemd 启动参数准备、多实例选择和离线用法放在详细安装说明,不混进主命令。

读缓存控制

DSH_TAVERN_SQLITE_CACHE_MAX_MB(默认64MiB)和DSH_TAVERN_SQLITE_MAX_CACHED_CHATS(默认8)控制完整态和 timeline 行缓存的软预算与档数。任一设为 0 就关闭这些读缓存和投影缓存;非法值回落默认。单个超大档可以独占一个缓存槽,保住长历史档的热读收益,所以软预算不是整个进程 RSS 的硬上限;完整态、投影和行缓存分别记账,连接行缓存不会同时保留多个超预算档。连接关闭、删档或 dispose 时释放对应行缓存。

本 store 写入仍按实际写集精确失效;另一连接提交后,通过 SQLite 的data_version清理本档旧读取状态,避免新 revision 配旧 timeline。用多个 store 或连接读同一档时也遵守这条规则。

原档怎么继续使用?

1. 安装后打开旧存档,以只读方式查看。
2. 由用户点击面板里的数据库分叉动作,生成新的 chatId 和原生 sessionId。
3. 在 SQLite 新分叉里继续对话和回退,原档不会被自动迁移或覆盖。

人物卡、世界书资源库原件和独立用户配置不因为剧情回退撤销。

卸载与更新

Linux 一键卸载:

curl -fsSL https://github.com/huajiao1998/dsh-tavern-sqlite-v2/releases/latest/download/install.sh | sh -s -- uninstall

Windows 用新包菜单的卸载/更新功能。卸载保留原档和 SQLite 数据库,不把数据库档偷偷转回 JSON,也不代表原版可直接游玩插件的新分叉档。

现行卸载口径:按现场完整注释区块撤除本包注入(依据 BEGIN/END 和 owner/id 归属),保留块外用户与作者的修改,写入失败就恢复本次快照;半截区块、归属不明或双源装配一律明确拒绝,不从历史官方源码覆盖、不删除酒馆目录和存档数据库。不承诺「坏旧包/半装残留」自动兜底:这类现场会被拒绝并给出处理提示,不做猜测性清理(旧 residual 兜底分支当前未接入维护入口)。

程序依赖已随包提供,完整性和恢复材料随发行包一起交付;不用为四个解析器另补 npm 依赖。

兼容与使用须知

- 当前版本 0.4.24 stable:Tavern 2.7.0 / DSH 0.1.5-rc.2代,上游 stable 9603eca,本次重生成另有 a390af17 接缝定向证据;未冒称最新整树或真实页面验收,适配范围以对应 Release 为准。Linux / WSL2 定位目录、一次命中全部必需接缝后直接注入和复制插件,不做隔离预演、文件一致性、宿主版本/解析/VM 或原启动参数检查;原运行恢复、原停止保持,不改原 unit/argv/cwd/env。Windows/macOS 保留各自维护流程。不要求源码匹配 runtime manifest 或冻结作者树;原代码现场只加一层注释,块外用户修改保留。标准维护保留用户其他配置,仅管理本包确切启动行,用户显式配置冲突仍零写拒绝;同包重接可补齐确切缺失入口。标准目录维护不调用包管理器装卸本包。详见安装说明。
- Windows 支持桌面版和原生 Windows CLI;隔离装配与维护证据不代替实际宿主、页面及玩法验收。
- V1 / V2 不可在同一实例共装,V2 是服务端计算版本线。
- UI 脚本仍保留浏览器职责;不承诺所有 DOM 脚本、所有卡或所有 SillyTavern API 都兼容。
- 这是对作者存储与执行链的修改版,升级作者程序需要核适配;未知布局不无条件覆盖。
- 自动化、源码检查与基础健康不替代现场页面、连续回退或 Linux 实机全链验收。
- 始终调用酒馆服务端计算,插件不自建计算引擎:本包不提供 MVU / 卡脚本 / Helper / VM 实现,只接入酒馆自身的服务端执行链。插件取消页面优先级和客户端回落路径,让酒馆服务端成为唯一计算端;卡脚本由酒馆的 server-script-worker 及其 jsdom 子进程执行,结果经酒馆 Host 事务草稿与 effect/CAS 落入本包 SQLite。服务端进程不可用、容量不足或任务失败时,任务保留并明确失败/等待,不转交浏览器、不切旧引擎。这里的「始终启用」指执行策略不回落客户端,不代表服务端进程永远在线。本包不宣称也不提供对不可信代码的安全隔离——jsdom 与 Node 子进程仍与宿主同机同用户权限,请只运行你信任的人物卡与脚本。
公开导出(package.json 的 exports,46 项)的兼容与退役策略见 PUBLIC-API-COMPATIBILITY.md:默认保留,标注 deprecated 只做注记,不改运行时行为;例外是计算重构按用户明确授权彻底删除的自有计算导出(./sandbox-policy、./mvu-card-runtime、./mvu-script-sandbox、./mvu-update-core、./card-script-dispatch-store、./server-execution、./server-dependencies、./opening-server-init、./esm-module-loader、./tavern-helper-api、./tavern-regex-api),不留垫片,不留兼容分支。

源码与构建

node scripts/build-release.mjs --out ./dist --repository huajiao1998/dsh-tavern-sqlite-v2

生成完整 TGZ、Windows ZIP、固定版本安装 SH 与摘要文件,不自动发布,也不操作服务。构建、安装参数及报错日志位置详见安装说明。

构建输出的 dist/install.sh 才是公开发布使用的安装入口(固定版本 URL/SHA,Release 资产与公网根副本同源);源码树 install.sh 与 deploy/install.sh 是本地 wrapper(只读当前 package.json 与 deploy/bootstrap.mjs,不固定版本/地址,可离线装卸),包内二入口由同一渲染器生成(带具体版本,URL/SHA 保持占位,避免内嵌本次 tgz 摘要自引用)。

来源与许可证

基于 DSH Tavern 适配,保留原来源声明与 GNU AGPL v3 许可。本项目是独立修改版,不是上游官方发行;随包官方恢复字节的许可及对应源码入口也保留。
预览分享卡片长什么样 ↓huajiao1998/dsh-tavern-sqlite-v2
分享 · DeepSeek Harness Hub
huajiao1998/dsh-tavern-sqlite-v2

DSH 酒馆会话 SQLite 接管插件服务端计算代

回到顶部