feat(shm): 文档/知识正文入共享内存 + 协议版本 bump 到 2(§13.13)

## 数据面补齐

- doc.insert / doc.insertWithMedia:新增 doc_ref / attachments_ref,
  模板序列化后 putValueInArena
- knowledge.add:新增 content_ref(内容是 JSON 字符串,读出后再解一层)
- 抽出通用 resolveJSONRef(resolveBlocks 也改用它),三处共用一套
  “共享优先、内联回退”逻辑

## 协议版本 bump:让错配显式失败,而不是静默坏

这是本轮更重要的部分。§13.6/§13.13 改了内核→插件 payload 的承载方式,
两种错配都不会报错、只会静默失效:

- v1 插件只读内联 args(tool/cleaner/output)→ 遇到 v2 内核拿到空参数
- v2 插件发 blocks_ref → v1 内核反序列化时静默忽略(旧内核
  io.setToolBlocks 还是桩实现)

现场表现为“输出变空 / 图注入没反应”,极难定位。所以把 ProtocolVersion
与模板 procProtocolVersion 一起 bump 到 2:双方都是等值校验,v1 插件遇上
v2 内核会在建链时明确报“协议版本不匹配…请用配套 plugindev 重编”。

测试里把“错误必须带出重编指令”也断言上了——生产上碰到它的现场就是
“只更新了内核没重编插件”,光报“不匹配”定位不到行动。

testdata 8 个插件的 protocol 同步更新(badprotoplugin 仍用 999 验证拒绝)。
工具链已重建并安装(协议 2,内嵌 blocks_ref/doc_ref/content_ref),
回滚副本 plugindev.bak-20260910-232544。

验证:-race 全绿。新增 KnowledgeAddViaArena(12000B 正文)、
KnowledgeAddInline、DocInsertViaArena、SetToolBlocks 三例 +
真实模板 e2e + 协议不匹配断言强化。

§13.13 第 5 条(反向大结果)范围更大——需把内核→插件的应答路径整体改成
“大结果写段 + 返回 ref”,涉及 callCore 的返回处理与 doc.query/llm.chat 等
所有读大结果的 method。已在 plan.md 标注未做,不冒充完成。
This commit is contained in:
JianFeeeee
2026-09-10 23:26:16 +08:00
parent 15d912ef34
commit 50ba4a64cb
13 changed files with 252 additions and 37 deletions

34
plan.md
View File

@ -1407,19 +1407,35 @@ settings.*、lifecycle.*、arena.alloc/free 自身)不属于此列:它们不
2. ~~`io.injectMedia` / `injectMediaSync` / `injectInterruptMedia`~~ ——
同上共用 `mediaArgsOwned`)。注意同步调用不能在应答返回前释放槽
否则内核读到的是已释放的内存
3. **`doc.insert` / `doc.insertWithMedia`**——文档全文内联 `doc` 是可被
插件回调改写的内容
4. **`knowledge.add(name, content)`**——知识正文内联同上
3. ~~`doc.insert` / `doc.insertWithMedia`~~ —— 已修新增 `doc_ref` /
`attachments_ref`模板序列化后 `putValueInArena`
4. ~~`knowledge.add(name, content)`~~ —— 已修新增 `content_ref`
内容是 JSON 字符串读出后需再解一层)。
5. **反向结果**插件反向调内核读大结果时仍内联正向已有 `ResultRef`)。
这条范围比前四条大需要把整个内核插件的 Rust 应答路径改成
大结果写段 + 返回 ref”,涉及 `callCore` 的返回处理与所有读大结果的
method`doc.query` / `llm.chat` )。未做
**协议版本已 bump 到 2**(§13.613.13 payload 承载变更)。
不再靠文档提醒而是让错配在握手上**显式失败**
- 内核 `proc.ProtocolVersion = 2`模板 `procProtocolVersion = 2`
- 双方都是等值校验 v1 插件遇上 v2 内核会在建链时报
协议版本不匹配请用配套 plugindev 重编”(带修复指令
- 没有这个 bump 的话v1 插件只读内联 args遇到 v2 内核会拿到**空参数**
v2 插件发 blocks_refv1 内核反序列化时**静默忽略**旧内核
`io.setToolBlocks` 还是桩)。两种都是静默失效现场极难定位
**验证**
- [x] `TestCoreHandler_SetToolBlocksViaArena`9000 字节 base64 图经 `blocks_ref`
送达内容一致`TestCoreHandler_SetToolBlocksInline` 保内联回退
`TestCoreHandler_SetToolBlocksEmptyRejected` 防空块静默成功
- [x] `TestCoreHandler_SetToolBlocksViaArena` / `Inline` / `EmptyRejected`
- [x] `TestCoreHandler_KnowledgeAddViaArena` / `Inline`12000 字节正文经
`content_ref` 送达内容一致
- [x] `TestCoreHandler_DocInsertViaArena`正文经 `doc_ref` 送达
- [x] `TestE2E_RealTemplateSetToolBlocksViaArena`**真实 SDK 模板**编译的
插件生产插件走的就是模板模板不走 blocks_ref 则内核实现了也收不到
- [x] 工具链已同步`/usr/local/bin/plugindev` 重建为新协议内嵌 blocks_ref
回滚副本 `plugindev.bak-20260910-224255`
- [ ] 文档/知识正文走共享内存
- [x] `TestProcess_ProtocolMismatchRejected` 加断言错误必须含重编指令
- [x] 工具链已同步`/usr/local/bin/plugindev` = 协议 2内嵌 blocks_ref /
doc_ref / content_ref回滚副本 `plugindev.bak-20260910-232544`
- [ ] 反向结果入内存 5
- [ ] git commit -m "feat(shm): remaining data-plane payloads via shared refs"