Releases
v0.8.14
Compare
Sorry, something went wrong.
No results found
🐛 修复
strictScope 硬过滤被图召回绕过(#371 ,#17 A3 的图召回分支) :injectCandidates 的硬过滤原本长在 entityRecall 图召回合并之前 ——entityRecall 本身不做 scope 门控,被过滤出局的显式他域行会被图召回重新打上 graphHint 带回候选池,graphInjectHint 开启时作为 [检索线索] 行进入注入块(宿主自动注入与 standalone /context 同受暴露;为 #370 端点做可达性评审时由 CodeRabbit 发现)。修法是把硬过滤移到图召回合并之后、pin 池之前——顺带保证越权行进不了 pin 池;A2 软加权语义(auto / 存量他者保留可见)不受影响。暴露面 = strictScope + entityRecallEnabled(graphInjectHint 决定是否泄入注入文本)多开关同开,默认全关。回归锁配变异检验(还原旧过滤位置测试变红)。
🆕 新增
standalone API GET /context(issue #370 ,#363 承诺) :把宿主注入管线开放为端点——Mneme-Bridge 这类网页端桥接可以删掉自建的 pins 启发式了。GET /context?q&topK&threshold&agent_scope&workspace_scope 返回 injectCandidates 全语义(优先级分层 / 编码门控 / heat / scope 软加权 / hybrid 语义路 / pin 前置)+ 画像 + 规则的结构化聚合 {profile, rules, items, pinnedCount},不含渲染文本(语言 / 时间前缀 / 热记忆是宿主会话概念,调用方自渲染)。与宿主注入的两点 HTTP 面差异:查询向量即时嵌入——首次调用即走语义路,不等异步 prefetch(宿主注入渲染必须同步);不做跨轮轮换(daemon 无会话状态,调用方自管)。threshold 是 importance 阈值(默认 3,与 /search 的相似度 threshold 同名不同义);scope 两参全缺 = 不解析(软加权与 strictScope 硬过滤都不触发,与宿主会话身份取不到时同构),任一给出则缺维按 fail-closed。recall_runs 记账随 injectCandidates 内建(#217 曝光型访问事件,mode='inject' 与检索命中同表分账)——宿主注入同样记,端点自动同口径。/search 顺手补 scope 透传(searchMemories 本就收参、8790 此前没有入口;不传参数行为逐字节不变);createStandaloneApi 新增可选 embedder 注入(宿主与 dsh-mneme-serve 各传 semantic 装配的同一实例),缺省时 /context 降级规则 + BM25 档,嵌入失败同理绝不 500。宿主外部访问与 daemon 同享该路由;测试锁形状(四键)、空 q 规则档、threshold 语义、pin 前置、scope 硬过滤、嵌入接线与失败降级,daemon 侧全链路含 recall_runs 分账锁。
daemon 向量检索(#365 ,#363) :dsh-mneme-serve 的 /search 接入完整语义管线——embedder/reranker 装配与 boot 自动回填从 index.js 纯搬移 至 src/semantic.js(宿主与 daemon 共用同一份,调用时序契约原样;backfillMissingEmbeddings 经 index.js barrel 再出口,测试调用方零改动),daemon 侧新增 createVectorIndex 接线与 --embed 参数:local(默认,自管 runtime/嵌入模型缺失时经 provisionRuntime download 档自动取件,可用 DSH_MNEME_RUNTIME_TARBALL_DIR/DSH_MNEME_RUNTIME_MIRROR 换离线/镜像来源;失败降级关键词并打可操作日志)、ollama、openai(读宿主面板 vector-config)、off。向量轴有注入假 embedder 的回归锁;createServeRuntime 因此转为 async、语义键默认值在 daemonSemanticCfg 逐键锚定 config.js。
独立服务 daemon(dsh-mneme-serve,#363) :mneme 现在能在 DSH 宿主之外常驻——src/serve.js 的 createServeRuntime 用最小装配(store → settings → mirror → service → maintenance → standalone API,每步锚定 index.js 装配行号)把数据面跑成独立进程,第三方集成(网页端桥接等)不必为挂载记忆库而保持 DSH 开机。第一期刻意无 LLM:巩固(autoDream)与蒸馏结构性不在 daemon 内,这是与宿主「单写者」的机械保证,不靠用户自觉。token 与 DSH 面板/CLI 共用同一 kv 凭证,端口/主机解析链与外部访问一致;createStandaloneApi 新增 strictPort 选项——daemon 的配置端口被占即报错退出而非顺延(第三方把 URL 写死,静默换端口等于坏),不传该选项的宿主旁路行为不变。/search 照常落 recall_runs,第三方检索的复用统计不缺数。多进程共存(daemon 与宿主同库互写互读)有专门回归锁;已知限制(双进程去重竞态、镜像双写、版本偏斜)见 docs/DAEMON.md。
heat 注入侧拆独立开关(injectHeatEnabled,opt-in 默认关;issue #218 ) :heat 乘进注入排序在真实年龄混合的库上会饿死老约束(对照实验里 importance-only 排序的注入遵从显著更优,现行量级表现为拟合参数),注入侧因此拆出独立开关:默认关时 heatEnabled 开启后热度字段 / sleep 保护 / 面板投影照常,但注入排序乘数恒 1(与 heat 关闭逐字节一致,平价锁);显式开启恢复「层内乘 heat」的旧序(老用户回滚口)。召回侧时钟(touchLastAccess)与 sleep 降级联判不受本键影响。开关纪律照旧:config schema 与 settings 白名单成对注册,旗标计数锁同步。
🧹 工程
发布准备脚本在 CRLF 检出上不再假成功(scripts/release-prep.mjs) :该脚本用 /^(# Changelog\n\n)/ 匹配 CHANGELOG 文件头,而 Windows 检出是 CRLF——正则命中不了,replace 退化成空操作,脚本却照样打印 ✓ … 占位节 ,git status 里看不出任何异常(CI 跑在 ubuntu 是 LF,所以只有本机发版会中招,v0.8.13 那次即如此、最后靠人工补的占位节)。规则抽成 dsh-mneme/scripts/changelog-prep.mjs 的纯函数:行尾两种都吃、插入内容跟随原文件行尾、带 BOM 也认;匹配不上则如实回报 header-not-found,入口**报错退出(exit 1)**而不是假打印成功。配 6 条回归测试(LF / CRLF / BOM / 幂等 / 回报契约 / detectEol)。
standalone API 的 /status 版本号不再硬编码 :该端点此前返回模块内的字面量常量,发布时不会随 package.json 一起 bump——手上的 0.8.13 实例对外报的是 0.7.12,第三方集成据它判版本会读到假数据。现改为复用 version-check.js 的 PACKAGE_VERSION(运行时读 package.json,宿主侧 /api/dsh-mneme/status 走的就是这条),测试断言同步改成锁 PACKAGE_VERSION 而非字面量——旧断言把常量钉死,正是「发布漏 bump 而 CI 全绿」放行的原因。
You can’t perform that action at this time.