diff --git a/site/README.md b/site/README.md index 6906bff..07f0a68 100644 --- a/site/README.md +++ b/site/README.md @@ -8,8 +8,7 @@ site/ ├── index.html 单文件站点(内联 CSS/JS) └── assets/ - ├── logo.svg logo(来自 assets/branding/logo-h-he.svg) - └── mascot.webp 看板娘立绘(来自 assets/branding/mascot-xiaozhai.webp) + └── logo.svg logo(来自 assets/branding/logo-h-he.svg) ``` 资源是**复制**而非引用上级目录,因此 `site/` 可整体拷走独立部署。 @@ -39,15 +38,75 @@ server { - **配色取自品牌指南**:蓝 `#3b82f6` / 青 `#06b6d4` / 金 `#f59e0b`, 正好对应三层记忆 Context / Document / Graph,因此三层记忆那节直接用了这三色做色条。 -- **立绘按「有意的圆角卡面」呈现**,不做抠图:原图是白底 + 蓝紫渐变外框, - 抠图会连带毁掉白裙子与发丝高光(实测背景连通域分析:白底与裙子同色, - flood-fill 会让 42% 的身体变成透明)。改为圆角 + 发光边框 + 底部渐隐, - 让方形图与深色页面自然衔接。 +- **不放置立绘**。曾试过放看板娘,但原图是白底 + 蓝紫渐变外框的方形图, + 与页面几乎无法自然衔接(详见下文「为什么最终没有图」)。 - **淡入动画是渐进增强**:内容默认可见,仅当 JS 真的跑起来才加 `.js-reveal` 接管。 早期版本把 `opacity:0` 写在默认样式里,结果 JS 未执行时整页永久空白 (实测 30 个元素里 26 个停在不可见)——现在禁用 JS 也完整可读。 - 尊重 `prefers-reduced-motion`;架构图的 `
` 在窄屏横向滚动,避免整页撑宽。
 
+## 深浅双主题
+
+跟随系统偏好;导航栏右上角的按钮可手动切换,选择存入 `localStorage`(键 `ha-theme`)。
+
+实现要点:
+
+- 在 `` 里**首绘前**就定好 `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),白底 + 蓝紫渐变外框。
+直接用 = 深色页面上一个刺眼的白色方块;抠图又不可行:
+
+```bash
+python3 -c "
+from PIL import Image
+im = Image.open('assets/branding/mascot-xiaozhai.webp')
+print(im.mode)  # RGB —— 没有 alpha 通道
+"
+```
+
+背景连通域分析显示**白底与角色的白裙子、白围裙同色**,flood-fill 会顺着轮廓
+渗进去,让约 42% 的身体变成透明(发丝高光先死)。曾退而求其次做成
+「圆角卡面 + 发光边框 + 底部渐隐」,视觉上能接受,但本质上是在方形图上盖装饰,
+而非让图融入页面。
+
+结论:**这类素材要么重新出一张带透明通道的图,要么就不放**。
+现在 Hero 是单栏文字,版面反而更稳。
+
 ## 改内容前请核对事实
 
 页面上的数字(外部插件数、工具数、代码行数、适配器数)都是**实测值**,
diff --git a/site/assets/mascot.webp b/site/assets/mascot.webp
deleted file mode 100644
index 9c00640..0000000
Binary files a/site/assets/mascot.webp and /dev/null differ
diff --git a/site/index.html b/site/index.html
index 14a6001..062a23a 100644
--- a/site/index.html
+++ b/site/index.html
@@ -9,8 +9,24 @@
     
     
     
+    
     
   
   
+    
+ +
@@ -469,36 +837,33 @@
-
- 常驻型个人 Agent 框架 -

一个不会忘记
也不会被一条长任务卡死的管家

-

+

+ 常驻型个人 Agent 框架 +

一个不会忘记
也不会被一条长任务卡死的管家

+

HomeAgent 是内核 + 插件的双层 Agent 框架。内核只管 LLM 编排、记忆与调度;所有外部能力(消息、文件、网络、设备) 都是可独立安装、崩溃不牵连内核的插件。

- -
- 看板娘 小宅 -
-

四个不那么常见的设计决定

-

+

四个不那么常见的设计决定

+

大多数框架先写功能再补边界。HomeAgent 反过来:先把 边界和调度定死,再往上加能力。

-
+
◇

内核零 IO

@@ -508,7 +873,7 @@

-
+
◈

插件是独立进程

@@ -518,7 +883,7 @@

-
+
◉

输入是有级别的

@@ -528,7 +893,7 @@

-
+
◆

忙时有人顶班

@@ -544,8 +909,8 @@

-

三层记忆:从「刚才说了什么」到「三年前说过什么」

-

+

三层记忆:从「刚才说了什么」到「三年前说过什么」

+

不是一个向量库包打天下,而是三层各司其职、逐层衰减与整合。 品牌的蓝 / 青 / 金三色,对应的就是这三层。

@@ -586,21 +951,21 @@
-
+

媒体也是一等节点

图片/音频不是附件,而是三层里的一类节点:内容寻址存储(相同字节只存一份)、 引用计数 GC(有引用绝不删)。

-
+

描述才是持久语义

视觉模型生成的描述以 [mime digest] 描述 写进纯文本记忆并参与检索; blob 只是可被淘汰的缓存。所以几个月后“那张三色图”仍能搜到。

-
+

统一多模态空间

文本与图像落在同一向量空间(默认 Chinese-CLIP), @@ -614,12 +979,12 @@

-

一条消息进来之后

-

+

一条消息进来之后

+

输入先过调度器,再进处理管道;管道有 7 个阶段钩子,插件可在此改写或短路。

-
+
   外部输入(QQ / WebUI / CLI / 邮件 / 设备 …)
         │
@@ -640,7 +1005,7 @@
           

核心组件

-
+
homed常驻内核进程:LLM 编排、记忆管理、输入调度、插件生命周期
PluginSDK四通道:注册工具 / 挂阶段钩子 / 订阅事件 / 声明输出通道
inputch最基本的输入路由单位,可划给某个 agent(含驻留子)
@@ -661,13 +1026,13 @@
-

跑起来

-

+

跑起来

+

依赖 Go 1.25+ 与 CGo(sqlite3)。内核需 Linux —— Windows 上 homed 跑在 WSL2 里,只构建 waiter.exe。

-
# 构建守护进程 + CLI +
# 构建守护进程 + CLI make build build-cli # 启动内核(数据目录自定) @@ -677,12 +1042,12 @@ make build build-cli ./build/waiter echo "你好,记住我喜欢喝咖啡" | ./build/waiter
-

+

WebUI 与 API 密钥在 http://localhost:8080 配置,持久化在 SQLite。

开箱可用的插件

-

外部插件经 hmapdev 构建为独立二进制,可单独安装、卸载、热重载。

+

外部插件经 hmapdev 构建为独立二进制,可单独安装、卸载、热重载。

qq wechat @@ -714,10 +1079,10 @@ echo "你好,记住我喜欢喝咖啡" | ./build/waiter
-

常见问题

-

这些是设计上最容易引起误解的地方。

+

常见问题

+

这些是设计上最容易引起误解的地方。

-
+
「内核零 IO」是不是意味着内核很简单?

@@ -827,35 +1192,231 @@ echo "你好,记住我喜欢喝咖啡" | ./build/waiter