Repository navigation
Releases
Crepuscule 0.7.2 — fix diary sync regression
修复 0.7.1 引入的日记同步断链回归。
Fixed
- 0.7.1 改用
tempfile.mkstemp后新建日记文件权限被硬编码为0600(仅 owner 可读)。日记由另一个用户跑的同步 watcher 读取(插件容器内以 root 写、watcher 以宿主机用户读),0600致 watchercp报Permission denied、同步静默断链(文件写成功却推不上远端)。现于os.replace前显式os.chmod(tmp, 0o644),恢复 0.7.0(write_text+ umask 022)的组/其他可读权限。新增回归测试。日记隐私仍由工具层 owner 门控保障,不依赖文件权限位。
验证
pytest 175 passed(+1 Windows skip);实机五判据全绿(含权限位 644 与 fresh pushed、无 Permission denied)。
Full Changelog: Crepuscule-0.7.1...Crepuscule-0.7.2
Crepuscule 0.7.1 — harden diary write I/O
epk_diary_write 写入内部三项加固,借鉴 devkit 文件栈的经验、落到日记场景。
Changed
- 编码安全读:追加前读已有日记改用
utf-8-sig(吞 Windows 编辑器常留的 BOM);原文非合法 UTF-8(GBK / UTF-16 等)时拒绝追加并明确告知,绝不用errors="replace"静默腐蚀她亲手写的原文。同时修复此前encoding="utf-8"硬读抛UnicodeDecodeError不被except OSError接住、直接打崩工具调用的隐患。 - 原子写换
tempfile.mkstemp:同目录唯一临时名 + 安全创建,多消除一层并发撞名风险;newline=""统一只写\n,跨平台一致。临时名不匹配同步 glob,os.replace后不残留。
Added
- 写入审计日志:每次调用记一行
logger.info(正文长度 + 结果),绝不记正文本身。
验证
pytest 175 passed(新增 BOM / GBK-拒绝 / LF 三用例);ruff 干净;实机四判据全绿。
Full Changelog: Crepuscule-0.7.0...Crepuscule-0.7.1
Crepuscule 0.7.0 — epk_diary_write(人格亲手续写日记)
Crepuscule 0.7.0
新增:epk_diary_write LLM 工具 —— 让人格亲手续写自己的日记
与 epk_diary(读)对称,补齐「读 + 写」闭环。人格被触动时可经此工具把内容追加进当天日记,而非依赖通用文件工具插件。
从工具层根治两个历史坑(非靠 skill 文字劝导):
- 写错目录 → 目录写死
diary_dir、文件名机器构造YYYY-MM-DD.md,模型无法选路径或用后缀名。 - 覆盖丢内容 → 结构上只追加(create-then-append),不存在覆盖分支;通用
safe_write曾在「文件已存在」时把overwrite=true递给模型、被误选而丢内容。
实现要点: 纯标准库;tempfile + os.replace 原子落盘(临时名不匹配同步 glob);严格 YYYY-MM-DD 校验 + 路径容器校验;可选 ## HH:MM 时间戳分隔小节。
门控: 隐私铁律与 epk_diary 对称(需 diary_dir + diary_owner_id 且为 owner 本人私聊,群聊/非本人拒)+ 独立写开关 diary_enable_write(默认关)。新增 diary_write_timestamp_sep(默认开)。
测试: 11 例新增(创建/追加不覆盖/时间戳分隔/非法日期与空内容拒绝/无临时文件残留/写后可检索);全量 172 通过,ruff 净。
版本号自 0.7.0 起统一为 Crepuscule X.Y.Z 格式。
Crepuscule 0.6.0 — epk_diary 让人格翻查自己的日记
新增
epk_diary工具:让人格翻查自己写过的历史日记(可选生态集成,默认关闭)。与「文件工具插件 + 全局 Skill + 宿主机同步」组合,人格在对话中自主写下的日记可被她主动检索回顾,形成叙事连续性。三种检索模式:传日期回看某天 / 关键词全文搜 / 留空看最近几天。- 隐私铁律:需配置
diary_dir+diary_owner_id;仅 owner 本人私聊可读,群聊 / 非本人一律拒绝,杜绝跨用户泄露。新增 4 个配置项。 - 文档
docs/autonomous-diary.md:可复现的「让人格自主写日记」集成范式(架构 / 同步脚本 / systemd 部署 / 隐私要点),全占位符去敏。
修正
- 补齐
main.py落后的注册版本号。
兼容性
纯增量特性,diary_dir 默认空即完全关闭,对现有部署零影响。全量 162 测试通过。
v0.5.2 — overall_impression 改一段话 (synthesis)
Changed
- 整体印象合成优化:
core/synthesis.py的overall_impression从强制一句话
改为允许一段话(二三句)——之前一句话过于简略抽象,放宽为一段后能更自然地
抓住性格底色与关系基调,同时保持紧凑(≤80字上限不变)。同步去掉_clean()的
只取首行截断,改为多行合并成段。6 条单测更新通过,插件全量 130 测试无回归。
v0.5.1 — fix group misattribution (user: ownership tag)
Fixes worsening group-chat misattribution (张冠李戴 / 认错人·串记忆).
Root cause (confirmed from a live reasoning trace): the persona's identity-anchoring rule (§11) only accepts injected memory entries tagged user: <id> matching the current speaker; the ReadingSteiner_Memory block carried no user: tag, so the model fell back to guessing ownership — and as §11 grew stricter, the mismatch surfaced more often.
Fix: the plugin only ever injects the current user's own memory (search is scoped to user_id=ident.user_id), so the whole block belongs to the current speaker. It now emits a user: <id> ownership header as the block's first line, which §11 adopts with confidence. Gated by inject_user_attribution (default on); applies to both auto-injection and the epk_recall tool path.
See CHANGELOG.md.
v0.5.0 — EverOS 1.1.0 alignment
EverOS 1.1.0 alignment. All plugin changes are version-tolerant and safe on EverOS 1.0.x (features light up once the server is on 1.1.0).
Added
/epk reflect(admin) — trigger EverOS'sreflect_episodesstrategy to consolidate fragmented episodes / fight over-granularity; soft-archives originals (recoverable). Needs EverOS ≥ 1.1.0; otherwise a friendly 'needs ≥1.1.0' hint.log_archive_success(default on) — INFO logs on successful add/flush, so you can eyeball that memory was stored.
Changed
- EverOS client is now 1.1.0-aware — parses the typed
error.codeenvelope, distinguishes retryable (503EXTERNAL_SERVICE_UNAVAILABLE/ transport timeout) from permanent errors, and does bounded retry (everos_retry_retryable, default 1). EverOS errors now log a graded WARNING instead of an ERROR stack. Fully backward-compatible with EverOS 1.0.x.
See CHANGELOG.md for details.
v0.4.0 — 记忆遗忘(抑制) + 群聊按发送者隔离
新增
- 记忆遗忘(抑制):管理员命令
/epk forget,在注入/召回读路径上抑制匹配到的记忆——数据仍在 EverOS、只是不再被注入/召回,可逆。两种粒度:按内容短语/epk forget <描述>与整用户/epk forget all(opt-out);/epk forget clear撤销。受 EverOS v1 无删除端点所限,这是「遗忘(抑制)」而非磁盘擦除。
修复
- 群聊跨用户记忆串线:群聊中所有成员此前共用同一引擎会话键,多人对话被合并、按发送者抽取时把他人/助手的内容混入某用户画像(认错人、张冠李戴、把助手人设当成用户)。现群聊会话键按发送者拆分(追加
#<user_id>),每个成员独立会话,从源头杜绝跨用户混合。私聊不受影响。 - 相关情景记忆注入半句截断:注入的【相关情景记忆】此前可能在句中被截断。现改用完整
content按句末标点收束(中英双语:中文句末标点 + 后接空白/引号的英文.!?),完整句注入、绝不留半截。
文档
- 新增
ROADMAP.md(插件 / EverAlgo / EverOS 三层待办与方向)。 - 致谢 Amadeus / 牧濑红莉栖;补正 EverOS 仓库链接。
完整变更记录见 CHANGELOG.md。
v0.3.1 — 永恒铭契 + 记忆假死根治
Added
- 永恒铭契(ETERNAL_COVENANT):新增配置项
eternal_covenant,可为指定用户锁定一段
人工定调的不变核心设定,作为独立的【永恒铭契】块注入,置于 EverOS 演进画像之上。
解决 EverOS 每次 flush 用 LLM 重写整个 profile(含 summary)会把人工写定的核心设定
冲淡的问题——铭契由插件配置锁定,永不被 flush 覆盖;而 summary/显式/隐式信息不受影响、
继续交由 LLM 演进。含私密内容时群聊默认不注入(受group_public_only约束)。
Fixed
- 记忆功能「假死」(热重载竞态):
on_astrbot_loaded在插件热重载竞态下可能不触发,
而client/flush_policy旧版仅在该钩子中构造,导致其永为None,注入与归档两个钩子
双双静默早退——机器人对话正常但完全失忆,且无报错、无自愈。现将二者移入__init__
同步构造,确立「实例存在即记忆能力就绪」不变量,该失败模式被结构性消除。
Changed
request_timeout默认值 30→90 秒:flush 触发的提取较慢,避免误判为失败。
Docs
- 补充项目中文名「记忆探知之魔眼 (ReadingSteiner)」。
v0.3.0 — LLM 记忆工具 + 静默吞错修复
新增
LLM 记忆工具(function-calling) — 让模型在对话中主动读写记忆,与被动的自动注入/归档互补:
epk_recall(query):检索当前用户的持久画像与历史情景。epk_remember(content):把一条关于当前用户的事实写入长期记忆。- 身份只从消息事件解析(
get_sender_id),模型只能传query/content,绝不能指定user_id—— 从源头杜绝跨用户记忆串线。 - 由新配置项
enable_llm_tools控制(默认关闭,避免与自动注入重复消耗)。
修复
新用户首条消息被静默吞掉 — 工具实现此前在空结果/降级路径返回 None,而 AstrBot 将工具返回 None 视为「已直接回复用户」,会触发 WARN 并可能静默结束本轮,导致新用户的第一条消息得不到任何回复。现在两个工具实现在所有路径都返回非空状态字符串,模型据此正常应答。
测试
新增 tests/test_tools.py(8 例),覆盖身份隔离铁律、空记忆路径与全部降级路径。全量 62 例通过。
完整变更见 CHANGELOG.md。