From 7587bd82d8f516f6b0c2955823e85ce61a2a1d08 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 21 Sep 2026 10:23:06 +0800 Subject: [PATCH] =?UTF-8?q?site:=20=E6=AD=A3=E5=90=8D=E3=80=8C=E9=A9=BB?= =?UTF-8?q?=E7=95=99=E5=AD=90=20agent=E3=80=8D+=20=E5=88=A0=E5=87=80?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=B0=8F=E5=AD=97=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户两点意见: 1. 那个东西不叫「分诊助手」,叫**驻留子 agent** 2. 页面上加的小字注解全是废话,全删 ## ① 正名:分诊助手 → 驻留子 agent 「分诊」只是 offload.go 里对**职责**的描述(triage), `resident.go` 顶注给的正式名是「驻留子」,`docs/zh/resident-subagent-design.md` 也把它列为独立概念(根 agent / 驻留子 / 工作式轻量子三类)。 7 处全部改正,含图内 SVG 文字、`aria-label`、架构流程图、FAQ 正文: | 位置 | 原 | 现 | |---|---|---| | 图 5 框标题 | 分诊助手 | 驻留子 agent | | 图 5 框内第二行 | 临时驻留子 | (删,与标题重复) | | 图 5 的 aria-label | 转投给分诊助手 | 转投给驻留子 agent | | 正文 | 转给一个临时驻留的**分诊助手** | 转给一个**驻留子 agent** | | 架构图转投分支 | → 转投临时分诊助手 | → 转投驻留子 agent | | FAQ | 这正是「分诊助手」的用途 | 这正是驻留子 agent 的用途 | | CSS 注释 | 分诊助手接到消息 | 驻留子 agent 接到消息 | ## ② 删掉 11 处注解小字 原则:**复述图上已画出来的、或标题已说过的** → 删; **承载数据**(插件版本 / 源码路径 / SVG 图内必要标签)→ 留。 - `.duty-note` ×6:架构图里 6 个阶段下面那行灰字 (「构建消息与工具表 · 插件可在此短路」等)—— 阶段名本身已经说清, 而这 6 行会把循环框右半边撑空 - `.flow-note`:重复解释 `on_input` / `before_output` 跑在什么时候 - `.dv-caps` ×3:图 4 的「任何中断都能插它前面」「被打断的现场压入中断栈」、 图 5 的「不必干等」—— 图上插队动线和回执 chip 已经把它们画出来了 - `.dv-note` ×2:图 2「实测:statically linked,无动态依赖」、 图 3「实测整段写入+读回 3.5µs」—— 数字重复 - `.dv5-tnote`:「默认关闭,需部署方打开」—— FAQ 里有完整说明(含理由) - `.duty-ev` ×4 + `.sm` ×4:证据行/注释行,数字并回正文 (「实测整段写入 + 读回 3.5µs。」等) ## ③ 删小字的连带修正 - **11 处死 CSS 全部清掉**(`.duty-ev` / `.flow-note` / `.dv-caps` / `.dv-note` / `.dv5-tnote` / `.sm`),单文件不留无人引用的规则 - 循环框删掉 6 行灰字后**右半边空了一大块** → 改为 `fit-content` 收窄居中 ## 自己踩到并改掉的坑 - 循环框收得太窄(16rem),回边徽标「有工具调用则回到 ①」**压住** `after_toolcall` → 加 `min-width` 并加大底部 padding - 想让循环框占满宽度,试过**阶段项排两列** → 截图发现编号被 grid 按行填充排成 `1/3/5 · 2/4/6`,线性流程顺序全乱。已回退单列, 并把这条教训写进 CSS 注释(免得后人再试一次) - 图 5 触发条件框删掉小字后留白偏大 → 高度 56→42 ## 验证 - 三档宽度(1440/768/390):无横向溢出、回边徽标与阶段项**零重叠**、 文字未被截断 - 深浅双主题 / JS 禁用 / reduce 回归全绿;控制台零错误 - 死 CSS 计数全部归零;「分诊」全站残留 0 - CSS 括号平衡,文件 141,847 字节(原 143,960,净减 2.1KB) --- site/index.html | 116 +++++++++++++++--------------------------------- 1 file changed, 35 insertions(+), 81 deletions(-) diff --git a/site/index.html b/site/index.html index 6471b05..4631937 100644 --- a/site/index.html +++ b/site/index.html @@ -426,16 +426,6 @@ color: var(--text-dim); } .duty p strong { color: var(--brand-cyan); font-weight: 700; } - .duty-ev { - display: inline-block; - font-family: var(--font-mono); - font-size: 0.72rem; - line-height: 1.5; - color: var(--text-muted); - padding-top: 0.7rem; - border-top: 1px solid var(--border); - width: 100%; - } @media (max-width: 860px) { .duties { grid-template-columns: 1fr; gap: 0.8rem; } } @@ -538,15 +528,6 @@ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E"); } .alt-visual svg { position: relative; z-index: 1; width: 100%; height: auto; display: block; } - .dv-note { - position: relative; - z-index: 1; - margin: 0.55rem 0 0; - text-align: center; - font-size: 0.74rem; - color: var(--text-muted); - font-family: var(--font-mono); - } @media (max-width: 860px) { .alt { grid-template-columns: 1fr; gap: 1.6rem; margin-top: 2.6rem; } /* 窄屏位移收小:单列时左右各 42px 会让内容显得跳,也更容易探出视口 */ @@ -738,7 +719,6 @@ .dv5-trigger { fill: none; stroke: var(--brand-gold); stroke-width: 1.2; stroke-dasharray: 5 4; opacity: .6; } .dv5-tcap { fill: var(--brand-gold); font-size: 9.6px; text-anchor: middle; font-weight: 600; letter-spacing: .04em; } .dv5-tval { fill: var(--text-dim); font-size: 9.6px; text-anchor: middle; } - .dv5-tnote { fill: var(--text-muted); font-size: 8.6px; text-anchor: middle; } /* 积压条被逐条取走 */ .js-fx .dv5-pile rect { animation: queueTake 3.6s ease-in-out infinite; } .js-fx .dv5-pile rect:nth-of-type(1) { animation-delay: 0s; } @@ -801,7 +781,7 @@ } .js-fx .dv-sweep { animation: shmSweep 2.8s cubic-bezier(.4,0,.2,1) infinite; } - /* 收货闪光(图 5):分诊助手接到消息时亮一下 */ + /* 收货闪光(图 5):驻留子 agent 接到消息时亮一下 */ .dv-recv { fill: none; stroke: var(--brand-cyan); @@ -914,7 +894,6 @@ /* 两列标题 */ .dv-colcap { fill: var(--text-dim); font-size: 10px; text-anchor: middle; letter-spacing: 0.04em; } .dv-colcap-dim { fill: var(--text-muted); } - .dv-caps { fill: var(--text-muted); font-size: 8.8px; text-anchor: middle; } @media (prefers-reduced-motion: no-preference) { /* 只呼吸透明度,不动 r。 为何:.dv-pkdot 现在兼做「沿链路行进的数据包」(靠 SMIL 的 @@ -1096,9 +1075,10 @@ .loop { position: relative; z-index: 1; - max-width: 34rem; + width: fit-content; + min-width: 21rem; margin: 0.5rem auto 0; - padding: 1.7rem 1rem 1.9rem; + padding: 1.7rem 1.6rem 2.4rem; border: 1px dashed rgba(6, 182, 212, 0.4); border-radius: var(--radius-md); background: rgba(6, 182, 212, 0.045); @@ -1114,6 +1094,8 @@ border: 1px solid rgba(6, 182, 212, 0.4); border-radius: var(--radius-pill); } + /* 单列。曾试过两列填满宽度,但 grid 按行填充会把编号排成 + 1/3/5 · 2/4/6 —— 这是线性流程,顺序不能乱。 */ .seq { list-style: none; margin: 0; @@ -1171,24 +1153,12 @@ line-height: 1; } - .flow-note { - position: relative; - z-index: 1; - margin: 1.1rem auto 0; - max-width: 34rem; - text-align: center; - font-size: 0.76rem; - color: var(--text-muted); - line-height: 1.6; - } - .flow-note code { font-size: 0.74rem; } - /* 窄屏:中轴线收边,节点撑满 */ @media (max-width: 620px) { .flow { padding: 1.2rem 1rem 1.1rem; } .flow::before { display: none; } .n { width: auto; max-width: none; } - .br, .flow-note { max-width: none; } + .br { max-width: none; } .loop { max-width: none; padding: 2.2rem 0.8rem 2.4rem; } .lnk { height: 1.6rem; } } @@ -2068,29 +2038,25 @@
隔离

崩一个,不赔上全部

-

插件不在内核里,是另一个进程。崩了就把它注册的东西一并摘掉,其余照跑。

- 退避重启 1s / 2s / 3s;5 分钟内第 4 次崩溃即停下等人 +

插件不在内核里,是另一个进程。崩了就把它注册的东西一并摘掉,其余照跑。重启退避 1s / 2s / 3s,5 分钟内第 4 次崩溃则停下等人。

调度

拦得住,也接得回

-

输入分能等与不能等。不能等的可抢占,被打断的现场压栈,稍后原样恢复

- L4 内核独占;外部插件声明 L4 会被夹到 L3 +

输入分能等与不能等。不能等的可抢占,被打断的现场压栈,稍后原样恢复。L4 内核独占,外部插件声明 L4 会被夹到 L3。

通信

三条道,各走各的

-

控制走 stdio,数据走共享内存,通知走事件环。变长内容只传偏移,两边映射到不同地址也能读。

- 整段写入 + 读回 3.5µs(实测) +

控制走 stdio,数据走共享内存,通知走事件环。变长内容只传偏移,两边映射到不同地址也能读。实测整段写入 + 读回 3.5µs。

资源

记忆不会越用越肿

-

上下文按相关性取舍,最近 10 条恒受保护。低分下沉成文档,冷文档再蒸馏成三元组。

- 有效工作区间上限 60 万 token +

上下文按相关性取舍,最近 10 条恒受保护。低分下沉成文档,冷文档再蒸馏成三元组。有效工作区间上限 60 万 token。

@@ -2280,7 +2246,6 @@ 都不需要 -

实测:statically linked,无动态依赖

@@ -2371,7 +2336,6 @@ 零拷贝:不序列化、不复制 -

实测整段写入+读回 3.5µs

@@ -2438,7 +2402,7 @@ 先到先处理 - 任何中断都能插它前面 + @@ -2448,7 +2412,7 @@ 正在跑的任务 同一时刻只一个 - 被打断的现场压入中断栈,稍后原样恢复 + @@ -2508,10 +2472,10 @@ - - 触发条件 - 忙超 5 分钟 · 积压 ≥ 3 条 - 默认关闭,需部署方打开 + + 触发条件 + 忙超 5 分钟 · 积压 ≥ 3 条 + @@ -2523,12 +2487,11 @@ 积压消息 ×2 - + - 分诊助手 - 临时驻留子 - 当场办 / 立刻答 + 驻留子 agent + 当场办 / 立刻答 @@ -2553,7 +2516,7 @@ 用户 - 不必干等 + @@ -2670,7 +2633,7 @@
  • 同级不抢占 → 入队列排队
  • 更高级别抢占,现场压入中断栈,稍后恢复
  • -
  • 忙得太久转投临时分诊助手
  • +
  • 忙得太久转投驻留子 agent
@@ -2687,33 +2650,27 @@
  1. 1 -
    pre_action - 构建消息与工具表 · 插件可在此短路
    +
    pre_action
  2. 2 -
    LLM 调用 - provider 回退 + 瞬时错误重试 · 流式累积
    +
    LLM 调用
  3. 3 -
    post_action - 插件可改写最终文本
    +
    post_action
  4. 4 -
    before_toolcall - 逐个工具执行前 · 可拒
    +
    before_toolcall
  5. 5 -
    执行工具 - 临界区:副作用不可回滚
    +
    执行工具
  6. 6 -
    after_toolcall - 上下文裁剪 · 相关记忆召回 · 结果入消息
    +
    after_toolcall
-

- on_input 在进管道之前跑;before_output / after_output 在全部轮次结束后跑一次。 -

@@ -2760,10 +2714,10 @@
-
36
在跑插件
16 内置 + 20 外部
-
340
可用工具
实测注册数
-
109k
Go 代码行
不含第三方
-
9
LLM 适配器
另有 1 个网关脚本
+
36
在跑插件
+
340
可用工具
+
109k
Go 代码行
+
9
LLM 适配器
@@ -2966,7 +2920,7 @@ echo "你好,记住我喜欢喝咖啡" | ./build/waiter
长任务会不会让用户等很久?

- 这正是「分诊助手」的用途。主 agent 忙超阈值(默认 5 分钟)且积压够多(默认 3 条) + 这正是驻留子 agent 的用途。主 agent 忙超阈值(默认 5 分钟)且积压够多(默认 3 条) 时,内核可拉起临时驻留子接手:能办的直接办,需要主 agent 的立刻回「忙碌中,请稍候」。 这个自动转投默认关闭,由部署方显式打开 —— 它属于「内核替父做决策」,与 「显式才是特权」同一条理由。