Files
HomeAgent/site
JianFeeeee 631963fdc7 feat(site): 总起页改为「真正的 AgentOS 长这样」+ 修页脚状态栏不可点
## 总起页:从对比改为展示(用户要求)

前几版是对照表(「别人说 X → 我们要做到 Y」)。用户指出重点不是对比,
而是**把自己作为「真正的 AgentOS 样例」展示出来**。改为四张并列卡片,
每条给「机制 + 可测数字」,不做比较。

标题「真正的 AgentOS,长这样」;四题:隔离 / 调度 / 通信 / 资源 ——
操作系统躲不开的四道题,逐题给答案。

## 文案改了第三轮(用户指「读着太难受」)

按「短句、有节奏、不堆从句」重写四段正文。举一例:

  旧:插件不是进程内的一个库,是内核 spawn 的独立进程。崩了就把它的
      工具、钩子、通道一并摘掉,其余照跑。
  新:插件不在内核里,是另一个进程。崩了就把它注册的东西一并摘掉,其余照跑。

## 修页脚「状态」栏不可点(用户报的 bug)

三行原为 `<span class="muted">` 死文本,点不动。改为链接:

- 最新发布:v1.3.x 线   → /releases
- main 在研:1.4.0      → blob/main/internal/meta/meta.go(版本号的实际来源)
- 许可:AGPL-3.0-only   → blob/main/LICENSE

## 一处自查纠正

我一度在卡片里写「插件崩溃 → 恢复 <1s」,那是照抄 README 的旧说法。
查源码 `dynamic_proc.go` 发现退避实为 **1s / 2s / 3s**(`procRestartBackoff=1s`,
5 分钟内崩 3 次 `procMaxRestarts=3` 即停手等人),**<1s 不成立**。
改为如实写明退避序列与停手机上阈值。README 那句待另开一轮核实。

## 验证

- 双主题:4 卡片、控制台错误 0、横向溢出 0
- 一滑一页仍生效(6 次滑动偏差恒为 72px = scroll-padding-top)
- JS 禁用 24/24 可见;reduce 下 snap 自动关闭
- 390/768/1440 溢出均 0
- 页脚 9 个 gitcode 目标逐个对照 origin/main 的树:**全部存在**
  (不只看 HTTP 200 —— gitcode 对错误路径也返回 200,此前踩过)
2026-09-20 10:11:02 +08:00
..

官网(静态站)

单文件、零构建、零依赖的落地页。与仓库 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(仅精确指针)
色条自上而下「灌注」 三层记忆
数据流光带下行 + 节点脉冲 架构图
数字滚动到位 统计卡
文字下划线展开 分节标题

三条硬约束(都吃过亏):

  1. 内容默认可读:初始隐藏只在 .js-fx 下生效,而 .js-fx 只有 JS 真跑起来才加。 JS 被禁用或报错时,页面是完整可读的 —— 早期版本把 opacity:0 写在默认样式里, 实测 30 个元素里 26 个永久不可见。
  2. 尊重 prefers-reduced-motion:此时不加 .js-fx、不启粒子、不画进度条, 所有元素直接可见。
  3. 装饰不得产生滚动条canvas 按 documentElement.clientWidth 定尺寸 (用 window.innerWidth 会含滚动条宽度,实测多出 15px 撑出横向滚动); body 再加 overflow-x: clip 兜底。

所有 listener 走 requestAnimationFrame 节流;标签页隐藏时暂停粒子。

为什么最终没有图

试过放看板娘立绘,失败,最后决定不放。过程留在这里,免得下次重复踩:

原图 mascot-xiaozhai.webp不透明 WebP无 alpha白底 + 蓝紫渐变外框。 直接用 = 深色页面上一个刺眼的白色方块;抠图又不可行:

python3 -c "
from PIL import Image
im = Image.open('assets/branding/mascot-xiaozhai.webp')
print(im.mode)  # RGB —— 没有 alpha 通道
"

背景连通域分析显示白底与角色的白裙子、白围裙同色flood-fill 会顺着轮廓 渗进去,让约 42% 的身体变成透明(发丝高光先死)。曾退而求其次做成 「圆角卡面 + 发光边框 + 底部渐隐」,视觉上能接受,但本质上是在方形图上盖装饰, 而非让图融入页面。

结论:这类素材要么重新出一张带透明通道的图,要么就不放。 现在 Hero 是单栏文字,版面反而更稳。

插件卡片

「开箱可用的插件」一节里,每个徽章都是按钮

  • 点一下展开该插件卡(名称 / 版本 / 用途),再点收起
  • 可同时展开多个
  • 末尾「展开全部 N 个」一次全开

数据来自各插件的 plugin.json,不是手写的:

cd /home/newqqagent/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」是加载总数 16 内置 + 20 外部),不是"外部插件数" —— 早期版本写成「36 外部插件」是错的, 已更正。改动前建议重新取一遍:

# 在跑插件(以日志里实际 loaded 的为准,比数目录可靠)
grep -h '\[plugin\] loaded:' $(ls -t /home/newqqagent/log/homed_*.log | head -1) \
  | sed 's/.*loaded: //' | sort -u | wc -l

# 工具数(同上,日志里注册后的真实值)
grep -ohE '[0-9]+ tools' $(ls -t /home/newqqagent/log/homed_*.log | head -1) | tail -1

# Go 代码行(排除第三方与鸿蒙工程)
find . -name '*.go' -not -path './.git/*' -not -path './.go/*' \
  -not -path './third_party/*' -not -path './cmd/ohos/*' | xargs cat | wc -l

# LLM 适配器(注意 server.lua 是网关脚本,不是厂商适配器,故为 9
ls internal/lua/adapters/*.lua | xargs -n1 basename