mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-15 12:15:16 +00:00
feat(webui): 星图切到块体系数据源 + 全部标名/灰调/读写反馈/三种变化动画
## 根因:记忆系统已迁移,前端没跟上
`GraphData()` 同时返回两套数据,而前端**只读旧的**:
nodes/edges ← 旧表 entities/relations(2026-10-04 停写)
memory_blocks/block_edges ← 块/边体系(真实活跃的记忆)
生产实测:`entities` 停更在 2026-10-03(1294 条),而 `memory_blocks`
同期从 1294 涨到 3187。写入函数 `upsertEntity` 已成**全仓零调用的孤儿**。
⇒ 星图结构性看不到任何新记忆。
(另修的同类问题:`starmapDirty` 只写不读且未声明,赋值成隐式全局 ⇒
即使后端发事件,新块也永远不会出现在图上。见下「判据」。)
## 数据源切换
新增 `smAdaptGraph()` 把块/边归一化为星图节点/边(字段与旧格式一致,
下游建图/布局/图例/脉冲无需各自判源):
- `mention_count` 回填为**度数**(块表无此列,而它驱动节点大小/标签优先级)
- 只画 `status` 为 active/空 的边(deleted/merged 的边留着会让失效关系看着还在)
- 端点缺失的边丢弃(画不出,且会让度数统计偏大)
## 视觉(按「全部标名 + 灰调 + 悬浮提亮 + 查询提亮 + 三种变化动画」)
**全部节点名**:新增标签覆盖层 —— **一个** 2D canvas 画全部名字,而非
每节点一张 CanvasTexture(原实现 1151 张 ≈ 72MB 显存,也是它当初被删的原因)。
三级可读性:活动/悬浮=实色+底块,其余=低透明当底纹;**同屏文本去重**
(3178 块里大量同文本块,不去重会叠成十几层同样的字)。
仅在相机或脉冲集合变化时重绘。
**灰色调**:`smGreyFor()` 全图灰阶,**亮度按度数**(亮处即记忆稠密处)。
原按类型上色对真实数据只用得上一种颜色(99% 同一类型)。
**悬浮提亮**:发光 +1.4 + 放大 1.25×(只放大不亮在淡底上不明显,只亮不放大
又看不出是哪颗)。
**查询提亮**:`memory_access` → `starmapPulseByIDs()`,按**真实块 ID** 精确命中。
**三种变化动画**(三种是**排他状态机**,不与可叠加的活动 pulse 混用):
| 动画 | 曲线 | 时长 |
|---|---|---|
| 插入生长 | easeOutBack 过冲(从 0.05 起,从 0 起看不出「长」) | 1800ms |
| 删除消散 | 收缩 + 变暗 + 球面均匀粒子飞散(减速淡出) | 1200ms |
| 合入 | 源消散 → **停顿 120ms** → 目标重生 | 1200+120+900ms |
合入刻意分两段且中间停顿:同时放会读成「一个变小一个变大」,
先看不到源、再看到目标冒出,「合入」的因果才成立。
粒子用**单个** Points 承载(上限 600),而非每粒子一个 mesh ——
批量删除(Purge 上百块)时后者会瞬间建上千对象。
消散完成必须真 `scene.remove()`,否则 scale=0 的不可见 mesh 仍可被鼠标拾中。
**顺带**:
- 补选中详情面板(`starmapSelected` 此前**只赋值、无人读取**,点击节点
没有任何信息反馈 —— 「可读性差」的核心成因之一)
- 布局半径按 √n 自适应 + 相机初始距离自适应(3178 节点挤在旧的固定
15–80 环带里会糊成一片)
- 图例改为说明**视觉编码**(大小/亮度/活动/三种动画),不再列不存在的类型色
- `starmapDirty` 消费点加 30s 节流(`/memory/graph` 实测 3.3MB,
密集写入时每 10s 重拉是纯浪费)
## 判据
- `graph_source_test.go`:钉住后端**必须下发 memory_blocks**
(前端星图的真实数据源),防未来又切回停写的 nodes
- `TestDashboardJS_NoWriteOnlyGlobals`(新增静态判据):**只写不读的全局布尔标志**
⇒ 这类「置了标志无人消费」是静默失效,真跑 node 也抓不到(隐式全局赋值合法)。
该判据写出来就当场抓到 `starmapDirty`,并经变异验证有效
(删掉消费点 → 判据点名报错)
- `node --check` + webui 全部判据绿
This commit is contained in:
@ -2091,6 +2091,63 @@
|
||||
#sm-container-home canvas {
|
||||
display: block;
|
||||
}
|
||||
/* 节点名覆盖层:盖在 WebGL canvas 上,不吃鼠标事件(否则星图不能拖拽)。*/
|
||||
#sm-labels {
|
||||
pointer-events: none;
|
||||
z-index: 4;
|
||||
}
|
||||
/* 选中详情面板:点击节点后的信息反馈。
|
||||
★ 补它的原因:`starmapSelected` 此前只被赋值、无人读取,
|
||||
点击节点在界面上没有任何信息反馈——“可读性差”的核心成因之一。*/
|
||||
#sm-detail {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 10px;
|
||||
display: none;
|
||||
width: 232px;
|
||||
max-height: 62%;
|
||||
overflow-y: auto;
|
||||
padding: 10px 12px;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
color: var(--text-primary);
|
||||
background: rgba(10, 10, 20, 0.88);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: var(--radius-sm);
|
||||
z-index: 6;
|
||||
/* 面板本身要能滚动,但不该把滚轮事件漏给下面的星图。*/
|
||||
pointer-events: auto;
|
||||
}
|
||||
#sm-detail .sm-detail-title {
|
||||
font-weight: 600;
|
||||
margin-bottom: 2px;
|
||||
word-break: break-all;
|
||||
}
|
||||
#sm-detail .sm-detail-meta,
|
||||
#sm-detail .sm-detail-id {
|
||||
color: var(--text-muted);
|
||||
font-size: 11px;
|
||||
margin-bottom: 4px;
|
||||
word-break: break-all;
|
||||
}
|
||||
#sm-detail .sm-detail-rel {
|
||||
margin-top: 6px;
|
||||
padding-top: 6px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
color: var(--text-secondary);
|
||||
font-size: 11px;
|
||||
}
|
||||
#sm-detail .sm-detail-relrow {
|
||||
margin-bottom: 2px;
|
||||
word-break: break-all;
|
||||
}
|
||||
#sm-detail .sm-detail-arrow {
|
||||
color: var(--accent, #7fb5ad);
|
||||
margin-right: 3px;
|
||||
}
|
||||
#sm-detail .sm-detail-nb {
|
||||
color: var(--text-primary);
|
||||
}
|
||||
/* hover 角标:取代原先每节点一张 256x64 CanvasTexture
|
||||
(1151 张贴图 ≈ 72MB 显存)。DOM 文字更清晰且零 GPU 开销。*/
|
||||
#sm-label {
|
||||
|
||||
Reference in New Issue
Block a user