Skip to content

Releases: xbzbing/dsh-openviking-manager

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 31 Oct 13:30

主要变更

  • 输入框「OpenViking」胶囊可开关显示:胶囊默认不再出现在输入框旁,配置页新增「输入框胶囊」卡片,「隐藏 / 显示」二选一,保存立即生效。隐藏只改界面:每个会话的记忆仍默认开启,要关掉某个会话的读写仍得用胶囊。开关保存在本插件自己的 $DSH_HOME/plugin-data/dsh-openviking-manager/preferences.json,不写进 ovcli.conf。
  • 插件页详情改用精简文档:DSH 插件页的长文不再显示整份 README,改为 docs/details/ 下的中英文 DETAIL 文档——简介、功能列表、仓库地址。语言跟随页面语言,其他语言回落到英文文档。
  • 内部:英文 README 更名 README_EN.md → README.en.md(files 与文档间链接同步);「输入框胶囊」卡片移到「项目记忆隔离」上方,e2e 补一条顺序断言;e2e 夹具一律使用临时 preferences 文件,不会读到本机的真实设置。npm 发布改用 Trusted Publishing(OIDC),发布 workflow 不再读取长期 token。

安装

# 正式版(npm)
dsh plugin --profile web add dsh-openviking-manager@0.5.1

# 同一版本的 GitHub Release 附件
dsh plugin --profile web add https://github.com/xbzbing/dsh-openviking-manager/releases/download/v0.5.1/dsh-openviking-manager-0.5.1.tgz

验证

  • npm run check 全绿:143 单测(142 通过 + 1 个环境跳过)+ 37 个 e2e 用例
  • 胶囊默认隐藏:e2e 断言默认状态下输入框没有该按钮,点「显示」后立即出现、刷新后仍在、再点「隐藏」即消失;夹具里 showInputToggle: true 时按钮照常渲染并可操作——去掉 OpenVikingInputSlot 的可见性判断即转红
  • 详情文档:解包 npm pack 树后 scripts/assert-pack.mjs 通过,docs/details/*.md 随包分发,中英 README 都在;meta.detail 指向不存在的文件时 DSH 判为 invalid 而不是回退 README,因此 files 里漏掉该目录会在装好后才暴露

完整变更记录 v0.5.0...v0.5.1


English

  • The input-box "OpenViking" pill can be switched off: the pill no longer shows next to the input box by default. A new "Composer pill" card on the configuration page offers "Hide / Show", and the saved value applies immediately. Hiding changes only the interface: memory still stays on for every session, and turning one session off still needs the pill itself. The setting lives in this plugin's own $DSH_HOME/plugin-data/dsh-openviking-manager/preferences.json and is never written to ovcli.conf.
  • A short detail page instead of the whole README: the DSH plugin page no longer shows the full README. It reads the Chinese and English DETAIL documents in docs/details/ — a short introduction, the feature list and the repository link. The language follows the page, and other languages fall back to the English document.
  • Internal: the English README was renamed README_EN.md → README.en.md (with files and cross-links updated); the "Composer pill" card moved above "Project memory isolation", with an e2e order assertion; e2e fixtures now always use a temporary preferences file, so they can never read this machine's real settings. npm publishing now uses Trusted Publishing (OIDC), and the release workflow no longer reads a long-lived token.

Install

# Stable (npm)
dsh plugin --profile web add dsh-openviking-manager@0.5.1

# The same version as a GitHub Release asset
dsh plugin --profile web add https://github.com/xbzbing/dsh-openviking-manager/releases/download/v0.5.1/dsh-openviking-manager-0.5.1.tgz

Verification

  • npm run check green: 143 unit tests (142 passing, 1 skipped for the environment) + 37 e2e tests
  • Pill hidden by default: the e2e asserts no pill button renders until "Show" is clicked, that it appears at once, survives a reload, and disappears on "Hide"; a fixture with showInputToggle: true still renders and operates it — removing the visibility check in OpenVikingInputSlot turns it red
  • Detail documents: scripts/assert-pack.mjs passes against the unpacked npm pack tree with docs/details/*.md shipped and both READMEs present; a meta.detail pointing at a missing file fails as invalid rather than falling back to the README, so a dropped files entry only surfaces after installation

Full changelog v0.5.0...v0.5.1

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 17:22

主要变更

  • 按项目隔离记忆:隔离单元从「主题」改成「项目」。同一个项目的多个 agent、多台机器、多个 clone 共用一份记忆;不同项目即使在同一台机器、同一个 agent 上也互相隔离。peer 由官方记忆插件按会话所在工作区的 git 身份推导,不需要再手工维护主题名。
  • 记忆隔离规则:新增一张卡,决定「哪些目录算同一个项目」。默认「仓库优先,其次目录」——同一仓库的 clone 共享,不在 git 里的目录各自独立。这是规则而不是当前会话的设置,每个对话都自动遵循;首次打开配置页就会写入,不必先去配一次。
  • 工作区现状:列出宿主侧边栏里每个工作区解析出的 peer、它与哪些工作区共享记忆、以及该目录自己声明的覆盖项,默认收起。宿主没有工作区注册表时整张卡隐藏,而不是给一个空列表。
  • 仓库配置与风险可见:.openviking/config.json、config.local.json 和 ~/.openviking/workspaces/<slot>.json 的优先级高于本插件能写的任何文件。面板现在列出生效的声明、指出是哪一层赢的,并把「放开跨项目召回」「关掉召回或抓取」「仓库钉死 peer」「目录推导不出 peer」「保存的是 root key」逐条列为风险。这些文件仍然只读,本插件不写。
  • 召回调优:暴露官方已声明的 7 个键——分数阈值、条数上限、查询扩写、排除 URI、事件衰减保护、请求超时、召回搜索超时。分数阈值、查询扩写与请求超时在首次打开时按产品默认写入一次(0.5、关闭、15000 毫秒),文件、工作区或环境变量里的取值仍然优先;留空即回到该键的默认值。
  • 连接验证与重载不再互相打断:验证结果直接显示在按钮右侧,长错误信息会换行而不是压掉按钮。首载重载只锁它自己写的那几个控件,重载有 30 秒上限,超时会明说「可能还没生效」;后台重载结束得比你的操作晚时,也不会再盖掉你刚点出来的结果。
  • 修复:工作区列表一直为空——宿主没有 inject 的服务按属性读取会抛错,错误又被吞掉,于是任何宿主都显示「没有注册的工作区」;「已连接为 /user」(服务端只返回用户、不返回账号时的空账号与多余斜杠);环境变量告警把变量名写死成 OPENVIKING_RECALL_PEER_SCOPE;被仓库层或环境变量覆盖的开关仍可编辑、保存后却不生效;工作区文件里的 min_client_version 从不告警;官方插件 0.5.29 的重载失效(该版本入口会 import 宿主包)。
  • 内部:lib/ 不再入库,由 GitHub Actions 在门禁通过后 npm pack 出一个 tgz,同一份产物既是 Release 附件也发到 npm,因此 dsh plugin add github:xbzbing/dsh-openviking-manager 不再可用(那棵树没有编译产物)。隔离与规则两个选择改用平台自带的 Menu / SegmentedControl,并按平台约定补齐每个选项对应的 tab 面板。

安装

# 正式版(npm)
dsh plugin --profile web add dsh-openviking-manager@0.5.0

# 同一版本的 GitHub Release 附件
dsh plugin --profile web add https://github.com/xbzbing/dsh-openviking-manager/releases/download/v0.5.0/dsh-openviking-manager-0.5.0.tgz

验证

  • npm run check 全绿:133 单测(132 通过 + 1 个环境跳过)+ 36 个 e2e 用例
  • 工作区列表:test/unit/workspace-provider.test.mjs 用真 Cordis 钉住「属性读取必须抛 without inject」,e2e 再断言真实宿主能列出工作区;改回属性访问即转红
  • 后台重载:e2e 把重载挂起到保存动作之后,断言状态行仍是「配置已保存」;去掉代次守卫即转红
  • 官方控件:e2e 解析每个 tab 的 aria-controls,断言对应面板存在且只暴露选中的那个;把面板 id 改错即转红

完整变更记录 v0.4.2...v0.5.0


English

  • Memory isolation per project: the isolation unit is now the project rather than a topic. One project shares a single memory across agents, machines and clones, while a different project stays isolated even on the same machine and agent. The peer is derived by the official memory plugin from the session workspace's git identity, so there is no topic name to maintain by hand.
  • A memory isolation rule: a new card decides which directories count as one project. The default is "repository first, then the directory" — clones of one repository share, directories outside git stay separate. This is a rule, not a per-session setting: every conversation follows it, and it is written on first visit so nothing has to be configured up front.
  • Workspace status: lists every sidebar workspace with the peer it resolves to, the workspaces it shares memories with, and any override the directory declares; folded by default. A host without a workspace registry hides the whole card instead of showing an empty list.
  • Repository configuration and risks are visible: .openviking/config.json, config.local.json and ~/.openviking/workspaces/<slot>.json outrank anything this plugin can write. The panel now lists the declarations that apply, names the layer that won, and calls out each risk — recall widened across projects, recall or capture switched off, a peer pinned by the repository, a directory that derives no peer, a saved root key. Those files stay read-only; this plugin never writes them.
  • Recall tuning: the seven official keys are exposed — score threshold, result limit, query expansion, excluded URIs, event decay protection, request timeout and recall search timeout. Score threshold, query expansion and request timeout are written once with the product defaults (0.5, off, 15000 ms); values from a file, a workspace or the environment still win, and clearing a field restores that key's default.
  • Verifying a connection and reloading the plugin no longer collide: the result renders beside the button that asked, and a long error wraps instead of squeezing the buttons. The first-load reload holds only the controls it writes, has a 30-second budget, and says the setting may not be active yet when it runs out; a background reload that finishes after your action no longer replaces what you just did.
  • Fixes: the workspace list was always empty — a service read as a plain property throws without inject and the error was swallowed, so every host claimed no registered workspaces; "Connected as /user" when the server reports a user but no account (empty account, stray slash); the environment warning hardcoded OPENVIKING_RECALL_PEER_SCOPE; controls overridden by a workspace layer or an environment variable stayed editable and silently did nothing when saved; a workspace file's min_client_version never warned; reloading the official plugin stopped working with 0.5.29, whose entry imports host packages.
  • Internal: lib/ is no longer committed. GitHub Actions runs the gate, then npm pack produces one tarball that ships both as the Release asset and to npm, so dsh plugin add github:xbzbing/dsh-openviking-manager no longer works (that tree has no build output). The isolation and rule choices now use the platform's own Menu / SegmentedControl, with the tab panel each option is expected to own.

Install

# Stable (npm)
dsh plugin --profile web add dsh-openviking-manager@0.5.0

# The same version as a GitHub Release asset
dsh plugin --profile web add https://github.com/xbzbing/dsh-openviking-manager/releases/download/v0.5.0/dsh-openviking-manager-0.5.0.tgz

Verification

  • npm run check green: 133 unit tests (132 passing, 1 skipped for the environment) + 36 e2e tests
  • Workspace list: test/unit/workspace-provider.test.mjs pins "a plain property read throws without inject" against a real Cordis context, and an e2e case asserts the live host lists its workspaces; reverting to a property read turns it red
  • Background reload: the e2e holds the reload open past a save and asserts the status line still reports the save; removing the generation guard turns it red
  • Platform control: the e2e resolves each tab's aria-controls and asserts the panel exists and only the selected one is exposed; pointing the id elsewhere turns it red

Full changelog v0.4.2...v0.5.0

v0.4.2

Choose a tag to compare

@xbzbing xbzbing released this 09 Oct 16:55

主要变更

把 ovcli.conf / ov.conf 的配置文件定位对齐到官方记忆插件。

OpenViking 服务端 v0.5.0(#5551)把 OPENVIKING_CLI_CONFIG_FILE 定为 ov status/ov config 的统一真源。本插件此前硬编码 ~/.openviking/ovcli.conf,当用户设了该变量指向非默认路径时,官方 @openviking/dsh-memory-plugin 读写那个文件、而配置页仍改默认文件,两边静默操作不同文件——违反 AGENTS.md 第一条「ovcli.conf 读写必须保持官方插件兼容」。

  • 新增 src/openviking-paths.ts,按官方 shared/credentials.mjs 的同一套链解析:OPENVIKING_CLI_CONFIG_FILE 选 ovcli.conf、OPENVIKING_CONFIG_FILE 选 ov.conf,各回退 ~/.openviking 下默认文件,并沿用「仅设 OPENVIKING_CONFIG_FILE 且其内容为 ovcli 形状时充当 ovcli.conf」的向后兼容;normalizeConfigPath 镜像 ~、~/、resolve 规则。
  • manager-api.ts 改走该解析:显式注入的 ovcliPath/ovconfPath 仍优先(测试保持 env 隔离),两者都缺省时才按 env 链解析;生产 apply() 不传显式路径,于是自动跟随变量。
  • README 中英文「服务端兼容性」新增 v0.5.0 小节:配置定位跟随、recallExcludeUris 传目录=排除整棵子树(#5627)、Working Memory 默认关闭 / Gateway 等均不触及本插件所写的键或所调端点;项目结构清单补 openviking-paths.ts。

验证

  • 对照官方 loadCredentialFiles 跑 6 组 env 组合,解析结果全部 ALL MATCH。
  • 新增单测 9 条,覆盖默认路径、两变量独立选择、向后兼容触发与跳过、server 形状不冒充 ovcli、空白值回退、normalizeConfigPath 规则;变异检验(让解析器忽略 OPENVIKING_CLI_CONFIG_FILE)如期红 3 条。
  • 单元测试 105 全过、Playwright E2E 28 全过。
  • npm run build 重新生成并提交 lib/,git diff --check 干净。

v0.4.1

Choose a tag to compare

@xbzbing xbzbing released this 09 Oct 16:11

主要变更

修复本插件在 dsh 0.2.x 上被 profile 启动拒绝加载的问题。

dsh 的兼容性预检会把每个 @deepseek-ai/dsh* peer 与运行时版本比对,任一不满足即 deny 整行:包仍装着,但配置页、/plugins/dsh-openviking-manager/api/* 路由、会话级记忆开关与 MCP 工具门禁全部不生效,只在启动日志留下一行 incompatible 警告。v0.4.0 声明的是 <0.2.0,因此在 dsh 0.2.1-alpha.2 上正是这种状态。

  • 5 个 @deepseek-ai/dsh* peer 与 engines.dsh 的上界由 <0.2.0 放宽到 <0.3.0-0:接受 0.2 线的全部 prerelease,同时排除 0.3.0 及其 prerelease。dsh 预检以 includePrerelease 求值,故 0.2.1-alpha.2 被接受。
  • 逐项核对 0.1.6-alpha.2 → 0.2.1-alpha.2 的消费面,确认只放宽区间即可,src/ 无需改动:ui-slots 零改动;ui-renderer 仅内部改动;ui-plugin-manager 的 PluginConfigViewProps 仅新增可选 form,plugins.bundle.config 仍按组合包包名为键、仍以 page 视图渲染;locale.register、WebRoute/webServer.register、agent/pre-step、session/event、turn/end、tools.guard、ToolExecution、window.__ModuleLoader__.load 与 dsh.client.inject 均未变;cordis 4.0.5-alpha.1 仍提供 registry.get/forEach、Fiber.restart、ctx.effect、on(..., { prepend })。
  • 新增 test/unit/dsh-version-range.test.mjs 锁住该回归:声明区间必须覆盖 devDependencies 钉住的版本与整条 0.2 线,且不得越过下一条 minor;内置比较器自校验 semver.org 优先级链,零新增依赖。
  • README 中英文的环境要求同步;src/ 未改动,lib/ 重建后逐字节一致。

验证

  • 用 dsh 自带的 evaluatePluginCompatibility 直接判定:新清单在 0.2.1-alpha.2 与下界 0.1.6-alpha.2 上均返回「兼容」,旧清单在同一运行时复现出与用户日志逐字一致的 deny 列表。
  • 单元测试 96 全过(新增 4 条版本区间用例;变异检验:把区间改回 <0.2.0 时新用例如期失败)。
  • Playwright E2E 28 全过。
  • npm run build 重新生成 lib/(与提交前逐字节一致,无产物漂移),git diff --check 干净。

v0.4.0

Choose a tag to compare

@xbzbing xbzbing released this 28 Sep 14:46

主要变更

召回调优卡片新增两个官方声明的超时键,针对后端 OpenViking search/rerank 卡死时自动召回拖住整个回合的问题:

  • timeoutMs(请求超时,别名 requestTimeoutMs,1000–300000):带产品默认 15000 毫秒(官方 dsh harness 默认 10000),首次打开配置页且文件未定义时自动写入并重载,给单次记忆请求一个明确上限。
  • recallContextTimeoutMs(召回搜索超时,0–600000):官方默认 0(表示按 timeoutMs 与扩写/改写地板派生),不钉产品默认;设正值可把会话感知搜索压到 15s/45s 地板以下,令卡死更快失败。
  • 两键均走既有 config-face 机制:只写 ovcli.conf 的 plugin 段、env 优先、越界拒绝、保存后自动重载官方插件;env 覆盖时字段只读并显示警告;中英文文案与 README 同步。
  • 暴露键从四个扩到六个(AGENTS.md 边界同步更新)。
  • 开发依赖 @playwright/test 升级到 1.63.0(配套 chromium rev 1243)。

验证

  • 单元测试 92 全过(新增两键的解析、层级解析、产品默认、initPatch、越界拒绝用例)。
  • Playwright E2E 28 全过(含两键的写入/清空恢复默认/env 只读/中文渲染)。
  • npm run build 重新生成并提交 lib/,git diff --check 干净。

v0.3.6

Choose a tag to compare

@xbzbing xbzbing released this 25 Sep 14:20

主要变更

  • 会话输入框的 OpenViking 开关在空间不足时自动退化为一个圆点:窄窗口、或侧边栏打开把输入框压窄(DSH composer 行是 size container,用 @container (width<=560px) 判定,窗口尺寸不变也生效)时隐藏「OpenViking」文字,只保留状态点;断点与 DSH 自带的紧凑断点一致,另保留 @media (max-width:560px) 兜底。
  • 按钮文案改为禁止折行,任何挤压下都不会再出现逐字竖排的「O p e n V i k i n g」;空间不够时让整行换行而不是压扁按钮。
  • 退化后仍是原生按钮:状态点绿/灰表示开关状态,hover 提示与 aria-label 保持完整文案,可访问性不受影响。

验证

  • npm run test:unit:92 项单元测试通过。
  • npm run test:e2e:28 项 Playwright 通过(新增 1 项覆盖「窄视口 → 圆点、恢复宽视口 → 文案回来、窄容器(模拟侧边栏挤压)→ 圆点且窗口尺寸不变」往返)。
  • npm run build 重新生成并提交 lib/,与 src/ 同步。

v0.3.5

Choose a tag to compare

@xbzbing xbzbing released this 25 Sep 13:53

主要变更

  • 新增可选的 Actor peer id 配置项(高级,默认留空),写入官方 ovcli.conf 的 plugin.peerId 键。
  • 留空(推荐):官方插件按每个会话所在 workspace 的 git 身份自动推导 peer,多个仓库在同一 DSH 实例下自动分主题隔离、主题内跨会话召回,无需逐仓配置。此时 DSH 中 OpenViking MCP: actor-scoped recall needs an explicit peer id 日志属正常现象,可忽略——它只影响手动 MCP 工具,不影响自动注入的记忆隔离。
  • 填写:进程级钉住单个 peer 并覆盖自动推导,仅适合「一个 DSH 实例只服务单个仓库」或有意让多仓共享同一主题的场景;填写后手动 MCP 工具也会限定到该 peer。
  • UI 明确说明留空与填写的区别,提供「填入当前仓库」按钮(经官方 workspace-peer 推导),并对 OPENVIKING_PEER_ID 环境变量及 ovcli.conf 顶层凭据的覆盖显示只读警告;本插件不编辑顶层凭据键。
  • README 与 README_EN 同步补充上述说明,强调多仓库工作隔离应保持留空并忽略 MCP 日志。

验证

  • npm run test:unit:92 项单元测试通过(含新增 recall-peer 的解析、校验、写入/清空、层级覆盖、restartPending 等 10 项)。
  • npm run test:e2e:27 项 Playwright 通过(含新增 peer-id 的默认空+保存+清空、env 只读警告、中文渲染)。
  • npm run build 重新生成并提交 lib/,与 src/ 同步。

v0.3.4

Choose a tag to compare

@xbzbing xbzbing released this 25 Sep 07:13

主要变更

  • 输入栏开关改为「颜色 + tooltip」:会话级 OpenViking 开关的药丸去掉「开/关」文字,只保留彩色圆点与 OpenViking 名称(绿=开启、灰=关闭,关闭态 hover 也不再被拉回深色);开关状态改由 hover/focus 触发的 tooltip 呈现(data-ovm-tip + CSS ::after),输入栏里出现在按钮上方、独立 E2E 页面在下方,键盘聚焦同样可见。i18n 删除 toggleLabelOff、新增 toggleStateOn/toggleStateOff(中英双字典同步);按钮的可访问名与 aria-pressed/aria-busy 保持不变。
  • 声明截图清单 screenshots.json:仿照 dsh-auth-gateway,在仓库根目录用相对路径列出中英各 4 张截图(awesome-dsh-plugin 约定:1–8 张,换图无需再向列表仓库提 PR);配套 unit test 守护条目数 1–8、路径留在仓库内、且文件真实存在。
  • E2E 拆卸偶发超时修复:fixture close() 在 closeIdleConnections() 之后 500ms 强制 closeAllConnections(),避免仍在传输的连接把 server.close() 挂住直到吃光 30s 测试预算(并行跑 admin.spec 时出现过一次,页面断言其实已全部完成)。

验证

  • npm run test:unit:82/82 通过
  • npm run test:e2e:24/24 通过(npm test 全绿)
  • npm audit:0 个漏洞
  • npm run screenshots 在隔离 DSH 实例重新生成中英各 4 张截图,插件页角标为 v0.3.4
  • 真实 DSH 输入栏人工复核:圆点颜色随状态切换,hover tooltip 在按钮上方完整显示、不被裁剪

v0.3.3

Choose a tag to compare

@xbzbing xbzbing released this 24 Sep 22:58

主要变更

  • 「召回调优」面板默认收起:与「恢复或初始化访问」一样折叠在标题行之后(共用 .ovm-collapse 折叠样式,恢复面板保留自身类名,既有 details.ovm-recovery 选择器不受影响);env 覆盖告警留在折叠之外,关着面板也不会看不到「文件里的值并非生效值」。
  • 移除手动重载按钮:保存或首载初始化后、自动重载进行期间,「重启官方记忆插件」横幅与按钮会一闪而过,实为无用——现整体删除(两张卡片的横幅行、专用 handler、2 个双字典 key、对应样式)。重载结果统一在状态行报告:成功、官方插件未加载、重载失败三条文案原本就在这里。
  • 文档:README 中英与 AGENTS.md 同步上述行为;补充发布顺序约定(先 GitHub Release,后 npm publish)。

验证

  • 81 个 unit tests 通过
  • 23 个 E2E tests 通过——断言改为直接验证新契约:保存后页面无 alert、无该按钮;重载失败从状态行读取;面板折叠时 env 告警仍可达、首载初始化照常执行
  • npm audit:0 个漏洞
  • README 截图复检无漂移(该按钮从未进入截图)

v0.3.2

Choose a tag to compare

@xbzbing xbzbing released this 24 Sep 20:02

主要变更

  • 召回调优卡片:新增官方 ovcli.conf 的 plugin 段中四个召回键的配置面 —— scoreThreshold(召回分数阈值)、recallLimit(单次注入条数上限)、recallQueryExpansion(查询扩写)、recallExcludeUris(排除的 URI 子树)。键名与取值域严格取自官方 config-schema,写入保留一切未知键与凭据;输入按官方取值域校验(0–1 / 1–50 / auto|off / viking:// URI 列表),越界或格式错误返回 400 且不落盘。分层解析镜像官方 loader(env → plugin.dsh → plugin → 官方默认),沿用 recallScoreThreshold 别名并对文件层越界值按官方规则钳制;OPENVIKING_* 环境变量覆盖的字段只读并显示告警。
  • 产品默认:分数阈值 0.5、查询扩写关闭:首次打开配置页且文件未定义该键时自动写入并重载,与记忆隔离默认开启同一机制——写的是官方键,不改官方默认,文件与环境变量的取值仍然优先。隔离与调优的初始化合并为一次写入、一次重载(否则会撞上重启守卫的 409,并让官方插件重载两遍、对打开的会话多做一次提交归档);字段留空回到该键的默认值(钉住的写回产品默认、未钉住的删键恢复官方默认),显式选择「自动」会落盘,以免下次加载被重新钉回。
  • 新增同源受控路由 GET/PUT /recall-tuning(no-store、输入验证、部分更新);重载复用 POST /recall-scope/restart,一次重载同时刷新隔离与调优两份 loaded 快照。
  • UI:新增「召回调优」卡片(数字、下拉、多行 URI 输入,env 覆盖告警,自动重载失败时的手动回退横幅),中英文案同步(新增 18 个双字典 key)。
  • 文档与边界:README 中英「功能 / 安全边界」、AGENTS.md 关键边界同步产品默认与写入语义。

验证

  • 81 个 unit tests 通过
  • 22 个 E2E tests 通过
  • npm audit:0 个漏洞
  • README 截图刷新至 v0.3.2(zh/en 各 4 张,版本徽标与新卡片入镜)