## 小标题:格言改成陈述 原站的小标题全是这个调子: ``` 崩一个,不赔上全部 拦得住,也接得回 三条道,各走各的 数据如水,随流,随改,随走 轻重缓急,各归其位 忙时,有人替你接住 部署,从未如此便捷 ``` 这是「句子很响,但读者看完不知道这节讲什么」。正文其实写得很扎实 (有退避 1s/2s/3s、L4 被夹到 L3、60 万 token 上限这些实测值), 只有标题在唱口号。 改成陈述式,读者扫一眼就知道这节讲什么: ``` 插件崩溃不影响内核 中断可以抢占,也能恢复现场 三条通信通道各管一类数据 大块数据走共享内存,不序列化 输入分两类,中断分四级 积压的消息由驻留子 agent 接手 部署是拷一个文件 ``` 另外两处本来就重复:「三条道,各走各的」和「数据如水,随流,随改,随走」 讲的是同一件事(都讲共享内存)。前者改成只讲三通道分工,后者保留细节。 ## 21 个 404 链接 「可用插件」里每个插件的源码链接都指向 `github.com/JianFeeeee/hologramagentsdk/blob/main/example/<name>`, 而 `example/` 下的 26 个目录已迁走并删除,**全部 404**。 改为 `github.com/HologramAgent/<name>`,逐仓 `git ls-remote` 验证过都存在。 徽章右侧的可见文字也从 `SDK / example/qq` 改成 `GitHub / HologramAgent/qq`。 ## 统计数字虚高 按 `site/README.md` 自己的核对流程实测(生产日志 `homed_2026-10-31_10-05-16.log`): | 页面项 | 原值 | 实测 | |---|---|---| | 在跑插件 | 36 | **30** | | 可用工具 | 340 | **285** | | Go 代码行 | 109k | **240k** | | LLM 适配器 | 9 | 9 ✓ | Go 行数是**反向错**的:核对命令没排除 `build/`,而 `build/` 里打包了 SDK 副本, 不排除会得到 516549 行,排除后 240056 行。已把该排除项写进 `site/README.md` 的核对命令,避免下次再算错。 数字校正清单也写进 `site/README.md`,标注核对日期与日志文件。 ## 验证 - HTML 标签配对:div / article / a 全部为 0 差 - 行数未变(3417),改动集中在标题与链接
7.5 KiB
官网(静态站)
单文件、零构建、零依赖的落地页。与仓库 WebUI 的做法一致(原生 HTML/CSS/JS,无打包步骤)。
文件
site/
├── index.html 单文件站点(内联 CSS/JS)
└── assets/
└── logo.svg logo(来自 assets/branding/logo-h-he.svg)
资源是复制而非引用上级目录,因此 site/ 可整体拷走独立部署。
本地预览
cd site && python3 -m http.server 8799
# 打开 http://127.0.0.1:8799/
部署
纯静态,任意 web 服务器指向 site/ 即可:
server {
listen 80;
server_name your.domain;
root /path/to/TrueAgent/site;
index index.html;
location / { try_files $uri $uri/ =404; }
}
设计说明
- 配色取自品牌指南:蓝
#3b82f6/ 青#06b6d4/ 金#f59e0b, 正好对应三层记忆 Context / Document / Graph,因此三层记忆那节直接用了这三色做色条。 - 不放置立绘。曾试过放看板娘,但原图是白底 + 蓝紫渐变外框的方形图, 与页面几乎无法自然衔接(详见下文「为什么最终没有图」)。
- 淡入动画是渐进增强:内容默认可见,仅当 JS 真的跑起来才加
.js-reveal接管。 早期版本把opacity:0写在默认样式里,结果 JS 未执行时整页永久空白 (实测 30 个元素里 26 个停在不可见)——现在禁用 JS 也完整可读。 - 尊重
prefers-reduced-motion;架构图的<pre>在窄屏横向滚动,避免整页撑宽。
深浅双主题
跟随系统偏好;导航栏右上角的按钮可手动切换,选择存入 localStorage(键 ha-theme)。
实现要点:
- 在
<head>里首绘前就定好data-theme,避免先渲染深色再跳浅色的闪白。 - 语义色全部走 CSS 变量(
--bg/--text/--border/--code-bg/--hover…),:root[data-theme="light"]只覆盖取值,不重复选择器。 - 品牌三色(蓝/青/金)两主题共用,因为它对应三层记忆,换主题不该换语义。
动效层
| 效果 | 位置 |
|---|---|
| 四团极光漂移 + 细网格 | 背景(position: fixed, z-index: -2) |
| 粒子网络(近邻连线) | #fx canvas,密度按视口面积自适应,上限 72 |
| 三色滚动进度条 | 顶部 |
| 标题渐变流动 | h1 .grad |
| 分块上浮入场(错落延迟) | 各 section |
| 卡片聚光 + 3D 微倾 | .card / .stat(仅精确指针) |
| 色条自上而下「灌注」 | 三层记忆 |
| 数据流光带下行 + 节点脉冲 | 架构图 |
| 数字滚动到位 | 统计卡 |
| 文字下划线展开 | 分节标题 |
三条硬约束(都吃过亏):
- 内容默认可读:初始隐藏只在
.js-fx下生效,而.js-fx只有 JS 真跑起来才加。 JS 被禁用或报错时,页面是完整可读的 —— 早期版本把opacity:0写在默认样式里, 实测 30 个元素里 26 个永久不可见。 - 尊重
prefers-reduced-motion:此时不加.js-fx、不启粒子、不画进度条, 所有元素直接可见。 - 装饰不得产生滚动条:canvas 按
documentElement.clientWidth定尺寸 (用window.innerWidth会含滚动条宽度,实测多出 15px 撑出横向滚动);body再加overflow-x: clip兜底。
所有 listener 走 requestAnimationFrame 节流;标签页隐藏时暂停粒子。
看板娘素材:从「没法用」到「能用了」
结论先写在这:素材侧的问题已经解决(现役
mascot-xiaozhai.webp自带真 alpha, 1024×1024)。下面保留当年的失败记录,因为「为什么当时不行」这件事本身 仍是有用约束——它解释了为什么不能拿一张白底图硬塞进深色版面。
当年为什么不行
试过放看板娘立绘,失败,最后决定不放。
原图(旧版)是不透明 WebP(无 alpha),白底 + 蓝紫渐变外框。 直接用 = 深色页面上一个刺眼的白色方块;抠图又不可行:
python3 -c "
from PIL import Image
im = Image.open('assets/branding/mascot-xiaozhai.webp')
print(im.mode) # 旧版是 RGB —— 没有 alpha 通道
"
背景连通域分析显示白底与角色的白裙子、白围裙同色,flood-fill 会顺着轮廓 渗进去,让约 42% 的身体变成透明(发丝高光先死)。曾退而求其次做成 「圆角卡面 + 发光边框 + 底部渐隐」,视觉上能接受,但本质上是在方形图上盖装饰, 而非让图融入页面。
现在为什么能了
新版素材走的是另一条路:出图时背景就是棋盘格提示,再按「背格连通域 +
中性灰判据」抠成真 alpha,落盘为带 ALPH chunk 的 WebP。
python3 -c "
from PIL import Image
im = Image.open('assets/branding/mascot-xiaozhai.webp')
print(im.mode) # RGBA
"
同一件事在代码里也有判据钉住:internal/plugins/webui/mascot_asset_test.go
直接读 WebP 容器头,断言 VP8X 的 Alpha 标志位与 ALPH chunk 同时存在——
防止日后有人把一张「看起来透明」的棋盘格 JPEG 换进来。
但版面仍未放图
素材不再是阻碍,但这不等于 Hero 就该放图。现版面是单栏文字,加图会改变 信息密度与首屏节奏,属于设计取舍而非素材问题——所以这一步没有动。 要放的话,素材已经就绪。
插件卡片
「开箱可用的插件」一节里,每个徽章都是按钮:
- 点一下展开该插件卡(名称 / 版本 / 用途),再点收起
- 可同时展开多个
- 末尾「展开全部 N 个」一次全开
数据来自各插件的 plugin.json,不是手写的:
cd ${HA_DATA}/plugins
for d in */; do [ -f "$d/plugin.json" ] && python3 -c "
import json;d=json.load(open('$d/plugin.json'))
print(d.get('name'), d.get('version'), d.get('description','')[:60])"; done
改内容前请核对事实
页面上的数字都是实测值,不是估算。「在跑插件」是加载总数,不是外部插件数 —— 早期版本写成「36 外部插件」是错的。
2026-10-31 重新核对(生产日志 homed_2026-10-31_10-05-16.log):
| 页面项 | 原值 | 实测 | 说明 |
|---|---|---|---|
| 在跑插件 | 36 | 30 | 插件迁移到 org 后外部插件减少 |
| 可用工具 | 340 | 285 | |
| Go 代码行 | 109k | 240k | 原核对命令漏排除 build/,反而少算了 |
| LLM 适配器 | 9 | 9 ✓ | server.lua 是网关脚本不算厂商适配器 |
改动前建议重新取一遍:
# 在跑插件(以日志里实际 loaded 的为准,比数目录可靠)
grep -h '\[plugin\] loaded:' $(ls -t ${HA_DATA}/log/homed_*.log | head -1) \
| sed 's/.*loaded: //' | sort -u | wc -l
# 工具数(同上,日志里注册后的真实值)
grep -ohE '[0-9]+ tools' $(ls -t ${HA_DATA}/log/homed_*.log | head -1) | tail -1
# Go 代码行(排除第三方、鸿蒙工程、以及 build/dist 里的打包副本)
# ★ 必须排除 build/ 与 dist/:那里有打包进去的 SDK 副本,会把数字翻倍
# (实测不排除时 516549 行,排除后 240056 行)
find . -name '*.go' -not -path './.git/*' -not -path './.go/*' \
-not -path './third_party/*' -not -path './cmd/ohos/*' \
-not -path './build/*' -not -path './dist/*' -not -path './site_build/*' \
-not -path './package/*' | xargs cat | wc -l
# LLM 适配器(注意 server.lua 是网关脚本,不是厂商适配器,故为 9)
ls internal/lua/adapters/*.lua | xargs -n1 basename