# HDS-Interlude
**Repository Path**: MomoiCore/hds-interlude
## Basic Information
- **Project Name**: HDS-Interlude
- **Description**: Hyperrealistic Dialogue System Interlude(幕间系统)是一个叙事驱动的一对一超拟真对话框架。它第一次将角色设定、世界观、记忆、关系与事件统一为持续推进的生活剧本,让对话对象在消息之外继续生活,并使回复、沉默、延迟与主动行动成为剧情自然发展的结果。探索一种不同于传统 RP Bot 的超拟真交流实现。
- **Primary Language**: TypeScript
- **License**: AGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 25
- **Forks**: 3
- **Created**: 2026-08-29
- **Last Updated**: 2026-09-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# HDS Interlude / 幕间系统
> 聊天在幕前发生,生活在幕间继续。
交流群:421430402,群主24小时解答,欢迎来玩!
HDS Interlude 是一个面向 Koishi 一对一与多参与者场景的持续叙事聊天框架。它让用户消息、角色的沉默、延迟回复、主动联系和自动推进,都成为同一段生活剧本中自然可见的部分,并由一次主叙事写作连贯地决定。
当前版本:`0.1.4`。提供宿主时间轴、持续生活剧本、结构化投递、Schedule Preplan、群聊意愿、多提供商模型连接与可选聊天动作。
## 文档导航
- 第一次安装和测试:[BEGINNER_GUIDE.md](BEGINNER_GUIDE.md)
- 从零部署 QQ 角色:[DEPLOYMENT_GUIDE.md](DEPLOYMENT_GUIDE.md)
- 逐项配置说明:[CONFIGURATION_GUIDE.md](CONFIGURATION_GUIDE.md)
- 管理员命令:[command.md](command.md)
- 当前架构:[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
- Alter System 设计与运行规则:[docs/ALTER_SYSTEM.md](docs/ALTER_SYSTEM.md)
- Agency Window 设计与运行规则:[docs/AGENCY_WINDOW.md](docs/AGENCY_WINDOW.md)
- Schedule Preplan 近期日程层:[docs/SCHEDULE_PREPLAN.md](docs/SCHEDULE_PREPLAN.md)
- 版本记录:[docs/CHANGELOG.md](docs/CHANGELOG.md)
- 安全与依赖说明:[docs/SECURITY.md](docs/SECURITY.md)
- 历史分析、失败版本与调试资料:[docs/README.md](docs/README.md)
## 它解决什么问题
HDSI 以主角为中心维护持续剧情状态:角色拥有日程、关系、待办、情绪、配角和未完成事件;用户消息作为进入这段现实的一项事件,参与角色当下的判断与后续生活。
这套框架让角色从既有生活出发,自然决定何时看见消息、是否愿意回复、如何回应,以及这件事会给后续生活留下怎样的影响。
## 核心结构
### 一个主剧本,多位参与者
一个机器人账号维护一个 Canonical Story(主剧本)。多个已授权用户可以进入同一主剧本,但每位参与者保留独立的资料、初始关系、关系演化和近期互动状态。
这样,角色可以在不同账号之间安排注意力、兑现约定,或自然地表达自己正被其他事情占用;所有互动都汇入同一个稳定的人格与生活轨迹。
### 活跃场景是短期连续性的来源
每次主叙事写作都会读取当前活跃场景中最近发生的真实条目:用户 / 群聊事件、已成功投递的角色消息、剧本段落与必要的场景摘要。它保留原始对话的语义、说话顺序和时间信息,同时通过字符预算控制上下文规模。
当前用户事件在本轮以“当前事件”身份出现一次;自动推进则以纯粹的生活推进展开。这个边界让旧消息保持历史位置,也让尚未投递的角色台词始终停留在“未说出口”的状态。
### 固定阶段,连续生活
HDSI 不以时间间隔切换写作尺度,而是按当前事件进入四种明确阶段:用户消息、对话后续、到期意图与独立生活推进。每一轮都从故事游标补写已经经过的时间,并以当前 `nowLocal` 结束;调度间隔只决定何时唤醒写作,不会预设剧情的密度、情绪或篇幅。
这让同一段生活能自然容纳即时对话、被打断的输入、承诺到期、安静的对话余波和较长的自动推进。未来内容始终以意图、计划或延迟动作保存,已经送达的私聊则同时保留在剧本与结构化投递记录中。
每次主请求都会同时发送 UTC 与故事本地时间,并将 `nowLocal` 的日期、时分秒、星期、时段和日照预期作为权威端点。重载或长间隔后的 continuity 用于衔接上次状态,当前时钟则为新一轮剧情提供准确锚点;例如 `Asia/Shanghai` 的 16:00 会按仍有日光的下午处理。
## 一次消息如何变成剧情
```mermaid
flowchart TD
U[用户消息 / 图片 / 群聊事件] --> D[短时合并与过期请求取消]
D --> C[读取活跃场景与当前状态]
C --> M[主叙事模型:一次持续写作]
M --> S[补写已发生的剧本]
M --> R[决定看见、回复、沉默或延迟]
M --> K[提取记忆、Overlay 候选与剧情余波]
S --> P[保存场景和剧本进度]
R --> P
K --> P
P --> T{存在可见消息?}
T -->|即时| I[投递角色消息]
T -->|延迟| Q[保存到期意图并等待]
T -->|暂不回复| A[继续角色生活与自动调度]
Q --> I
I --> A
```
```text
用户发送消息 / 图片
↓
2 秒短时合并(连续消息合成同一轮)
↓
读取活跃场景、当前状态、关系、记忆、待办与剧情引子
↓
主叙事模型一次写作:补写已发生时间 + 处理当前事件 + 决定可见行为
↓
保存剧本、场景进度、记忆候选、关系变化与未来意图
↓
按即时 / 延迟 / 不回复投递角色消息
```
新消息遵循“首条回复提交”边界:主模型尚未提交第一条消息时,新输入会接管本轮,并与旧消息批次合并后重新写作;第一条已经提交后,新输入会截断尚未发送的 `` 后续气泡。被截断的文字会作为“主角本来想发送,但还没打完字,新消息就到了”的未完成意图交给替代写作,清晰地区分已说出口的对话与被打断的念头。
## 主叙事模型的职责
主模型是核心写作者,在一次调用中完成“补写故事、判断是否回复、写出回复”等连续工作。每次调用会同时生成:
1. 当前时间段内已经发生的剧本;
2. 对当前用户事件、到期意图或自动推进的处理;
3. 是否已看见、回复模式、消息内容及计划发送时间;
4. 长期事实、状态变化、Overlay 候选、剧情余波和未来意图。
结构化输出中的互动决策形如:
```json
{
"seen": true,
"reply": {
"mode": "immediate",
"content": "怎么了"
}
}
```
模型输出可使用 `` 拆分消息。插件会按下一段文字长度模拟短暂输入时间;用户在等待期间继续发言时,旧分段计划会被取消并重新写作。
`typingJitterRatio` 默认是 `0.3`:同样长度的后续气泡会在理论延迟上下约 30% 随机浮动,减少机械感;填写 `0` 可恢复固定延迟。
### 实验性流式首条回复
`model.mainStreamingMode=experimental` 可让支持 OpenAI Chat Completions SSE 的模型在输出完整私聊 `interaction.reply` 后,先发送这条首泡,再继续接收后面的 `script`。默认关闭;它只在 `mainResponseFormat=json-object` 下生效,群聊仍等待完整结果。
| 支持层级 | 模型/接口 |
| --- | --- |
| 已有 SSE 接收路径 | `zhipu-official` 的 GLM 官方模型,例如 GLM-5.3-Flash。开启实验开关后可尝试首条提前投递。 |
| 实验性通用路径 | OpenAI 官方、DeepSeek 官方、Moonshot、百炼、硅基流动、OpenRouter、Gemini OpenAI 兼容模式,以及任意 `openai-compatible` 服务;前提是端点同时支持 `stream:true`、标准 `choices[].delta.content` 和 JSON 对象输出。 |
| 不适用 | `prompt-only`、不支持 SSE 的模型/中转站、只返回思维链但没有可见 `delta.content` 的接口。 |
未知中转站请先保持关闭;手动开启后观察日志中的“实验性流式首条回复已提前投递”。一旦首条已发送,若后续 JSON 断流或无效,插件保留已发送内容、记录 `stream-finalization-failed`,且不会自动 failover 重发第二条可见回复;后续只会以无 transport 的短恢复任务补写缺失剧本。
### 主叙事 payload 顺序与前缀缓存
`model.mainPayloadOrder=cache-first` 会把用户 payload 的对话历史与低频记忆层前置、每轮变化字段(当前事件、时钟、状态)后置。对支持自动前缀缓存的服务商(DeepSeek、GLM、Kimi 等),连续对话轮可以命中长长的稳定前缀,输入成本与 prefill 延迟显著下降;payload 末尾附带 `recentExchange` 最近交换块,把最后几条交互重新锚定在生成点旁,维持语境显著性。默认 `legacy` 保持历史顺序。开启后建议先在沙盒观察若干轮回复质量与 `回复模式` 分布,不适配可随时切回。
自动推进不把 cache-first 当作世界时间来源:插件会先复用压缩模型生成当前时间窗口内的事件账本,再让主叙事渲染。`recentExchange` 只含真实收发消息,不复制上一段剧本文字,因此缓存优化不会导致自动 prose 自我复读或越过当前时钟。
## 自动推进与剧情余波
对话结束后,系统可以按配置在约 10 分钟、20 分钟进行短期后续补写,之后按常规间隔继续生活推进;休息时间段可改用更长间隔。
自动推进没有实时用户消息,但仍会读取:
- 尚未结束的场景和近期已投递对话;
- 已安排的提醒、延迟回复、约定与未完成事项;
- 由对话留下的“剧情余波”;
- 角色自身正在进行的生活、配角和世界状态。
因此,用户说过的重要话、请求的提醒,以及影响角色的事件,都会在后续自动推进中持续留下线索。主模型可在角色具备具体动机时发起主动联系;每次候选动作都携带 `willingness`(意愿值)和原因,插件会在阈值、目标合法性与数量边界内完成投递。
Schedule Preplan 在后台空闲整理时维护近期稳定日程:每天最多复用压缩模型进行一次独立轻量审查,参考既有计划后才补写周规律、阶段或日期例外。`stable / contextual / granular` 变化颗粒度控制如何保留已证实的变化;granular 的少量候选安排先以半透明可用性显示,临近后才揭示,且不会自行成为生活事件。主叙事只读取从当前时刻起未来约 12 小时的计划,不会接收整周日历;计划只约束合理性,真实剧情始终优先。固定日程边界还可成为自动推进锚点,减少随机推进跨过上课、到校或离校等节点。
## 记忆与设定演化
HDSI 按用途分层组织信息,让每次请求获得恰当的连续性,同时保持上下文的清晰与节制。
| 层级 | 用途 |
| --- | --- |
| Canon | 初始角色、世界、配角与参与者关系,是剧情起点。 |
| 活跃场景 | 当前连续剧情的原始条目与摘要,是短期连贯性的主要依据。 |
| 剧情引子 / 近期事实 | 正在处理的事、最近生活细节、关系余波和下一步线索。 |
| 长期事实 | 承诺、重要事件、稳定世界事实和未解决事项。 |
| Overlay | 角色性格、世界状态、关系等在长期剧情中渐进形成的非破坏性变化。 |
| Perspective | 主角独立于 Canon 的个体价值观 / 看待世界的方式;其 overlay 只在相关情境中细微影响判断。 |
| 意图 | 延迟回复、提醒、主动联系或后续处理计划。 |
| Schedule Preplan | 近期计划中的生活结构;后台保存多日,主叙事只读取未来约半天。 |
较早的场景和 Overlay 会在后台分档压缩:保留因果、承诺、大事件与关系变化,减少重复性叙述。压缩以异步整理的方式运行,与用户回合的主叙事调用保持轻量协作。
近期上下文同时使用条目下限与时间窗口:默认至少保留 50 条,并保护最近 60 分钟的真实收发消息。长期事实检索分别为最近已完成事件和未完成承诺保留位置;承诺兑现后可显式关闭旧 fact,并促使 continuity 提前刷新。Continuity 不再保存容易过期的自由文本未来计划,未来安排由 intent 与 Schedule Preplan 提供。
### 修改设定时的建议
小幅修改 Canon(例如补充兴趣、修正措辞)通常可直接保留现有数据。若修改会明显改变角色身份、核心性格、世界规则或某位参与者的初始关系,建议在 Console 修改后按需清除对应 Overlay:
```text
interlude.overlay.clear character
interlude.overlay.clear perspective
interlude.overlay.clear relationship
interlude.overlay.clear world
```
指令会在聊天中要求 `y/n` 确认,并精确作用于选定的演化层,保留其余剧本与记忆。详见 [管理员指令集](command.md)。
## 主体行动窗口(Agency Window)
Agency Window 让主动联系先来自主角自己的生活,再经过现实条件判断。它沉淀当前日程负荷、隐私空间和设备可用性三类行动条件,并与 Alter 的情绪氛围层保持清晰分工。
自动生活回合完成剧本后,主模型可以提出一个由真实剧本、承诺、实际安排或关系后续支撑的联系候选:
```text
生活产生理由 → 检查日程/隐私/设备 → 立即联系 / 稍后重查 / 自然放下
```
忙碌或缺少隐私时,系统会创建 `proactive-check` 意图,在合适时间结合新的生活重新判断。每个候选都引用真实剧本条目,使主动联系始终拥有可追溯的生活理由。
Agency Window 复用 `StoryState` 和现有 intent 表,以轻量结构接入当前架构。后台获得参与者的名称、资料和关系摘要,并继续以摘要形式保持私聊上下文的边界。
## 情绪偏移追踪系统(Alter System)
Alter System 是一个动态氛围响应机制,用于解决长期对话中角色说话风格趋同、情绪表达固定化的问题。
### 工作原理
每次成功生成剧本时,主模型会输出一个整数 `alter`(-5 到 +5),表示本轮新事件相对上一轮让整体氛围发生的净变化:
- **正值**:对话氛围变得更严肃、正式、谨慎或紧张
- **负值**:对话氛围变得更轻松、随意、活跃或开玩笑
系统会累积这些 alter 值。当累积值超过动态阈值时,会调用侧端模型生成一段简短的"情绪偏移描述"(1-2 句话),并将其注入到后续主提示词中作为氛围参考。
这段描述会带有动态权重:
- **同向对话**:权重逐渐增加,氛围持续强化
- **反向对话**:权重逐渐减少,氛围自然消退
- **权重过低**:自动清除,避免过时的氛围影响新剧情
### 关键特性
- **低侵入性**:在 `recentScript + continuitySnapshot` 的连续性核心旁加入一层临时氛围参考
- **动态阈值**:根据对话密度自动调整触发频率,密集对话时更敏感,长间隔对话时更宽容
- **轻量级**:在达到触发条件时调用侧端模型,将额外请求集中在真正需要的节点
- **顺序协作**:达到阈值后先完成本轮持久化与消息投递,再在故事串行队列中执行侧端分析
- **自然衰减**:情绪偏移会随对话方向变化而自然消退,以临时氛围参考的方式陪伴剧情
### 配置参数
在 Console 的"情绪偏移追踪系统(Alter System)"配置项中可调整:
| 参数 | 默认值 | 说明 |
| --- | --- | --- |
| enabled | true | 启用 / 禁用系统 |
| baseThreshold | 10 | 基础触发阈值,值越小越敏感 |
| sameDirectionBoost | 0.05 | 同向增强系数,控制权重增长速度 |
| oppositeDecay | 0.15 | 反向衰减系数,控制权重消退速度 |
| minWeight | 0.2 | 最小权重阈值,低于此值自动清除 |
| maxIntensity | 2.0 | 最大强度上限,防止过度极端 |
| densityFactor | 0.3 | 对话密度影响因子,密集对话时降低阈值 |
侧端分析模型由模型中心中勾选“用作 Alter 侧端分析模型”的连接提供;温度、输出长度、超时和附加提示词在 Alter 设置内单独调整。侧模型遇到失败时,系统会保留累计轨迹并在后续条件合适时重试。
### 使用建议
- 默认配置适合大多数场景,不建议频繁调整
- 如果觉得角色情绪变化太慢,可以降低 `baseThreshold`(如改为 7-8)
- 如果觉得情绪变化太快或太极端,可以提高 `baseThreshold`(如改为 12-15)
- `sameDirectionBoost` 和 `oppositeDecay` 控制情绪的"惯性"和"恢复力",建议保持默认比例
## OneBot / NapCat 与群聊
OneBot 模式采用显式白名单:启用后,绑定的机器人 QQ 账号和用户 QQ 白名单中的账号即可进入 HDSI。空白名单会保持私聊入口关闭,便于管理员从明确授权的参与者开始配置。
每位白名单用户可单独填写:
- 用户背景 / 角色眼中的身份;
- 初始关系;
- 是否参与共享主剧本;
- 需要时的独立备注。
群聊与私聊分开配置。群聊需要单独列入群白名单并填写群用途、主角在群中的身份和发言模式;符合白名单和调度条件的群聊消息直接进入主叙事模型,不再额外调用快速判断模型。群聊请求开始后,后续群消息会进入下一批,不会作废已经生成的群回复;私聊仍保留首条消息提交前的新消息替代写作机制。
对 `responseMode=always` 的活跃群,可按群开启纯算法 `willingness`:本地意愿分数会随消息、关键词和引用累积,按半衰期衰减,并在超过阈值后以概率决定是否值得调用主模型。@ 机器人始终可以立即通过,主角成功发言后会消耗意愿。这个层只减少不必要的群聊主模型调用,不参与私聊、Alter 或 Agency。
## 图片与网页观察
### 图片理解
开启 `vision.enabled` 后,可在 `vision.mode` 选择两种方式。`native` 适合支持图片输入的主叙事模型:图片作为 `image_url` 内容块和当前用户文本一起发送。`sidecar` 适合纯文本主模型:选择一条勾选 `useForVision` 的视觉连接,插件先生成当前图片的事实观察,再把该观察与用户文字交给主叙事。支持 OneBot CQ 图片码、URL、`file`、`cache_url` 与机器人 `get_image` 路径,兼容电脑端 JPG 和常见手机端图片来源。
动态 GIF、动态 WebP 与 APNG 可在 Puppeteer 可用时抽取代表帧后发送;安全读取条件不足时会跳过该图片。图片二进制与 sidecar 观察都保持在剧本、记忆与数据库之外;侧端识图失败时,插件继续处理当前文字而不猜测图片内容。
### QQ 语音转写(SnowLuma)
开启 `onebot.voiceTranscription.enabled` 后,SnowLuma 的私聊 `record` 语音会先通过 `fetch_ptt_text` 转为文字,再与同一条消息中的文字、图片合并为一个用户事件。转写失败、语音未进入 SnowLuma 缓存或当前 OneBot 实现不支持该动作时,插件仍会记录“收到未转写语音”的事实并继续处理;音频二进制与转写请求不会写入 HDSI 数据库。
### 网页观察
可选 Puppeteer 服务允许角色在剧情确有需要时请求有限的网页观察。插件通过协议、页面数量、内容长度与超时边界,提取公开页面文本作为本轮写作参考;网页观察聚焦于安全、有限的公开信息读取。
## 安装
### 从 npm 安装
发布到 npm 后,可在 Koishi 项目根目录执行:
```bash
npm install koishi-plugin-hds-interlude@beta
```
稳定版发布后可省略 `@beta`。然后在 Koishi Console 添加 `hds-interlude` 插件并完成配置。
### 本地 tgz 安装
使用本地预发布包时,可在 Koishi 实例目录执行:
```bash
npm install /absolute/path/to/koishi-plugin-hds-interlude-0.1.4.tgz
```
Windows 示例:
```powershell
npm install C:\dev\HDS-Interlude\plugins\hds-interlude\release\koishi-plugin-hds-interlude-0.1.4.tgz
```
Koishi Desktop 的实例使用 Yarn 4。请在实例目录执行以下命令,并在完成后重载插件或重启 Desktop:
```powershell
corepack yarn add "koishi-plugin-hds-interlude@file:C:/dev/HDS-Interlude/plugins/hds-interlude/release/koishi-plugin-hds-interlude-0.1.4.tgz" --exact
```
安装后重新加载 Koishi,再在 Console 启用插件。
### 开发实例
仓库根目录包含开发用 Koishi 实例。安装依赖后:
```bash
cd C:\dev\HDS-Interlude
npm install
npm run dev
```
OneBot / NapCat 未启动时可能出现 `ECONNREFUSED`,表示适配器正在等待本地反向 WebSocket;可通过构建与插件加载日志分别确认 HDSI 的编译和加载状态。
## Console 配置顺序
建议按以下顺序配置,以更快建立可验证的互动闭环:
1. **失明模式**:首次配置保持关闭;稳定运行后可开启以获得无命令、极少 HDSI 日志的沉浸式对话。
2. **基础设定**:主角、世界、配角、叙事风格、默认关系。
3. **模型中心**:先确认图片理解方式;每个模型连接只填一次地址、密钥和模型名,再勾选它承担主叙事、压缩、Alter、Embedding、表情包描述或侧端识图的用途;下方分别调整各任务的采样与输出。
使用 GLM‑5.3‑Flash 时,可在对应模型连接行选择 `mode=zhipu-official`:仅填写智谱 API Key、模型名与推理强度,插件会使用官方 endpoint 和流式请求策略;同一配置内的其它模型行仍可使用普通 OpenAI-compatible 模式。
4. **平台控制**:启用 OneBot 后填写机器人 QQ、私聊用户白名单;如需群聊,再添加群白名单。
5. **剧情节奏**:连续消息合并、自动推进、休息时段、延迟消息和主动联系意愿阈值。
6. **Schedule Preplan**:近期日程覆盖天数、每日空闲审查时间和自动推进锚点。
7. **Agency Window**:日程负荷、隐私、设备和主动联系重查边界。
8. **记忆与上下文**:场景预算、压缩阈值、长期事实、Embedding 与 Overlay 整理策略。
9. **Alter System**:先使用默认动态阈值和权重;需要时单独选择低成本分析模型。
10. **可选能力**:视觉、Puppeteer、网页观察、日志级别和日志内容开关。
所有字段的解释、默认值和调整建议见 [配置说明](CONFIGURATION_GUIDE.md)。首次测试可直接跟随 [新手引导](BEGINNER_GUIDE.md)。
## 常用管理员指令
以下指令默认使用 `interlude` 主命令;危险操作会在当前会话中要求 `y/n` 确认。
| 指令 | 作用 |
| --- | --- |
| `interlude.status` | 查看当前故事、调度、模型与运行状态。 |
| `interlude.context` | 查看运行上下文摘要:场景、关系、Overlay 与长期事实。 |
| `interlude.schedule` | 查看 Schedule Preplan 和未来约半天的计划。 |
| `interlude.schedule.refresh` | 重新审查日程,保留旧计划作稳定参考。 |
| `interlude.timeline [limit]` | 查看当前账号可见的近期时间线。 |
| `interlude.script [limit]` | 查看近期剧本条目。 |
| `interlude.advance` | 手动推进一次剧本。 |
| `interlude.memory [limit]` | 查看记忆摘要。 |
| `interlude.memory.add ` | 手动写入长期事实。 |
| `interlude.memory.intents [limit]` | 查看延迟回复、提醒等待处理意图。 |
| `interlude.overlay.status` | 查看 Overlay 与候选状态。 |
| `interlude.overlay.compact` | 手动整理 Overlay。 |
| `interlude.overlay.clear ` | 清除指定 Overlay 层。 |
| `interlude.purge.range ` | 删除指定时间段的剧本与相关数据。 |
| `interlude.purge.platform ` | 删除指定平台的数据,例如 `sandbox` 或 `onebot`。 |
| `interlude.purge.all` | 删除全部 HDSI 剧本和记忆。 |
范围删除使用 ISO-8601 时间,例如:
```text
interlude.purge.range 2026-08-18T13:00:00+08:00 2026-08-19T02:00:00+08:00
```
完整参数、确认流程与恢复建议见 [command.md](command.md)。
## 日志与排查
### 失明模式
`blindMode.enabled=true` 会关闭 HDSI 管理指令、静默拦截当前 Koishi 实例中已解析的命令,并隐藏 HDSI 的普通运行日志与错误详情;系统只按 `blindMode.healthReportMinutes` 输出不含故事或账号内容的健康心跳。它适合希望对话保持高度沉浸、且模型与账号配置已经稳定正常的场景。失明模式只收束 HDSI 自身日志;其它插件仍遵循各自的日志配置。需要恢复管理时,请在 Console 关闭该开关并重载插件。
默认 `layered` 日志使用阶段标题、固定颜文字和树形字段展示一次任务的进展。`logging.colorTheme=dark` 使用深色界面适配的柔亮蓝绿、粉紫和暖金;`light` 使用白底清晰的深蓝、墨绿、深紫和赭金。Koishi Console 的主题由用户选择,因此可在插件中手动匹配;`logging.colors` 与 `logging.kaomoji` 也可按运维偏好切换。
```text
[用户消息] 水濑 (*^▽^*) 收到参与者私聊消息
├─ (•̀ᴗ•́)و 模型调用开始
├─ (ノ´ヮ`)ノ*: ・゚ 模型调用完成
└─ (・ω・)ノ 消息投递开始
[情绪追踪] 水濑 (๑•̀ㅂ•́)و✧ Alter 累积触发
├─ 数值: +12
├─ 阈值: 10.30
└─ 方向: 严肃
```
插件提供摘要、标准和诊断三个信息密度。标准档呈现用户回合、模型、投递、实际推进、记忆与 Alter;诊断档进一步展开周期扫描、队列、计时器、游标和 SQLite 临时重试。
建议排查顺序:
1. 首次启动前使用 `interlude.doctor` 确认 Console 档案、白名单和模型是否已经就绪;关闭自动创建时再执行 `interlude.story.start`。
2. 使用 `interlude.context` 核对场景摘要、参与者状态与长期事实是否正确。
3. 查看模型调用日志,确认调用的提供商、模型预设和结构化输出是否成功。
4. 发生 SQLite `disk I/O error` 时,先确认 Koishi 数据库文件未被同步软件、备份软件、杀毒扫描或第二个 Koishi 进程占用;插件会对短暂失败进行串行化和退避重试,但无法修复外部文件锁或磁盘问题。
## 使用边界
- HDSI 依赖模型的写作与结构化输出能力。较小或不稳定的模型更容易出现格式失败、过度重复或关系跳跃。
- 自动推进基于已记录状态补写角色生活,适合叙事陪伴与角色互动;医疗、紧急救助、法律及其他高风险场景应使用相应的专业服务。
- 主动联系需要显式开启,并始终受白名单、参与者资料、意愿阈值与单轮数量限制。
- 清空数据库、删除范围剧本和清除 Overlay 均可能不可逆;执行前请先导出 Koishi 数据库。
## 开发与验证
```bash
cd C:\dev\HDS-Interlude
npm run typecheck
npm run build
npm test
```
构建产物位于 `plugins/hds-interlude/lib`。发布前建议运行构建、测试和 `npm pack --dry-run`,确认包内包含 `lib` 与需要分发的文档。