fix(webui): 知识库不再把二进制当文本存 + 接上分类/媒体/删除 + 实时计数

后端(handler_memory.go 重写 handleKnowledge):
- ★ multipart 分支原来无条件 file.Read → string(buf[:n]) → 当 Markdown 存进
  content.md:传一张 PNG 得到的是一份乱码文本知识,还在 .index.json 占一份
  preview,且**没有任何迹象**表明出了问题。
  现在按 http.DetectContentType 探测的**真实类型**分流(不信客户端声明的
  Content-Type——谎报 text/plain 的 PNG 在测试里是真实场景):
  媒体入 CAS 按 digest 挂条目 / 文本校验 UTF-8 后存正文 / 都不是则 400 明确
  拒绝并回传 rejected 清单。
- 状态码语义修正:此前 POST/GET 一律 500、DELETE 一律 404,把「名称非法」
  这类调用方能自己纠正的错报成服务器故障。现按 errors.Is 分流
  400/404/503。
- 搜索支持 category 与 limit;返回 knowledgeView(不泄露服务端绝对路径,
  不回传几百 KB 的 Dense 浮点数组)。
- 列表端点补 dense 状态(前端据此提示多模态是否就绪)。
- 媒体存储未接线时上传图片返回 503,而非退化成把二进制当文本存。

前端(dashboard.js):
- 搜索结果从 <pre>{JSON}</pre> 改为结构化渲染(名称/体积/预览/媒体标记
  + 每条删除按钮)。此前前端根本没有删除入口。
- 新增分类输入框(走 category 参数)、多文件上传。
- 计数改实时:原先读 state.kernel 快照,知识条目经工具/上传增删后不会变
  (实测创建完仍显示 "-")。切到知识面板时拉 /knowledge 的真实 names.length。
- 顶部输入框变多文件;显示多模态就绪状态(ready/total)。
This commit is contained in:
JianFeeeee
2026-09-26 11:37:13 +08:00
parent 144564f5c2
commit 8842d76aff
4 changed files with 952 additions and 79 deletions

View File

@ -100,6 +100,7 @@ type Handler struct {
status sdk.StatusAPI
term sdk.TerminalAPI
llm sdk.LLMAPI
mediaStore sdk.MediaAPI
// hostPort 是 webui 实际监听的 ":port"(用于推导服务入口链接)。
hostPort string
@ -161,6 +162,7 @@ func NewHandler(s *sdk.PluginSDK) *Handler {
st sdk.StatusAPI
term sdk.TerminalAPI
llm sdk.LLMAPI
ms sdk.MediaAPI
)
if s != nil {
sup, mem, idx = s.Supervisor(), s.Memory(), s.Indexer()
@ -169,6 +171,7 @@ func NewHandler(s *sdk.PluginSDK) *Handler {
se, pm = s.Settings(), s.PluginMgr()
st, llm = s.Status(), s.LLM()
term = s.Terminal()
ms = s.Media()
}
h := &Handler{
sdk: s,
@ -186,6 +189,7 @@ func NewHandler(s *sdk.PluginSDK) *Handler {
status: st,
term: term,
llm: llm,
mediaStore: ms,
sessions: make(map[string]time.Time),
loginLimiter: newLoginLimiter(loginMaxFails, loginWindow),
pendingIdx: -1,