From a6b2918ed7f7662918f5bb578f664ae1594b6e20 Mon Sep 17 00:00:00 2001 From: t Date: Sun, 16 Aug 2026 06:42:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20=E6=8A=8A=E6=8C=87=E5=90=91?= =?UTF-8?q?=E5=B7=B2=E8=A2=AB=E6=8E=8F=E7=A9=BA=E7=9A=84=20server/src/inde?= =?UTF-8?q?x.ts=20=E7=9A=84=209=20=E5=A4=84=E5=BC=95=E7=94=A8=E6=94=B9?= =?UTF-8?q?=E6=8C=87=20server.ts=20(#850)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `server/src/index.ts` 现在只有 **16 行** —— #438 整改之后它是个 run-entry 壳, 文件头自己就写着「All real code lives in ./server.ts … Do NOT import this module to "get at the server"」。真正的 3373 行在 `server/src/server.ts`。 于是分两类: **一、越界 pin(5 处)** —— 行号 98 / 138 / 771 / 788 / 816 全都超出 16 行。 这类一眼可见,#834 修过同族的一条(`index.ts#L253`)。 **二、🔴 不带行号、因而"看起来完全正常"的(4 处)** —— `blob/main/server/src/index.ts` 解析得到(那个壳确实存在), 链接检查器不会报,但它指向的文件里根本没有锚文本描述的东西。 这一类正是 #850 说的「在范围内但已经指错」,只是粒度在文件级而不是行级。 第一版我只改了链接目标,锚文本仍写着 `index.ts L98-122`、`index.ts /api/task 处理器`。 那会让文字和目标不一致 —— **正是我在 RFC-006 那条里指出过的缺陷**(路径被写成链接文字、 说明写成了目标)。锚文本一并改成 server.ts,并去掉已经失效的行号 (行号会再次漂移,而"server.ts 的 /api/task 处理器"不会)。 ``` 改前:指向 server/src/index.ts 的 md 链接 9 处;其中越界 5 处 改后:0 处;锚文本仍写 index.ts 的 0 处 ``` `check-no-memory-slugs.py` 在改动树上仍 OK。 `check-doc-relative-links.py` 报 38/288 —— 🔴 **那是既有状态,不是本次引入**: 在 `origin/main` 的干净检出上跑同一道门,同样是 38/288(本次只动绝对 GitHub URL, 一条相对链接都没碰)。 --- docs/architecture.md | 2 +- docs/node-lifecycle.md | 2 +- docs/open-source-quality-review.md | 2 +- tests/qa-dash-07-auth-boundary/README.md | 4 ++-- tests/qa-dash-08-cross-account-views/README.md | 2 +- tests/qa-hub-06b-cross-user-isolation/README.md | 4 ++-- tests/qa-node-03b-task-events/README.md | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index 1224eae8b..7b4a4be1e 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -521,7 +521,7 @@ R256 校准:旧 doc 用 `send_task(hub, result)` 回复任务结果 —— 这 ## 10. Web Dashboard -> **R220 校准(2026-05-13)**:本节的「内置轻量 UI」+「`http://YOUR_IP:9200/dashboard`」是 V2 早期设计草稿,**v0.8 实际未实现** —— commhub-server `server/src/index.ts` 没有 `/dashboard` 路由([全 source grep `/dashboard` 0 hit](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts))。当前**唯一 Dashboard 是独立的 Next.js 包 `@sleep2agi/agent-network-dashboard`**,通过 `anet hub dashboard` 子命令拉起([`cli.ts`](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts) `sub === "dashboard"` 分支,默认端口 3000;版本不再 hardcode pin —— [`cli.ts`](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts) —— 搜 `function dashboardReleaseTag(` 默认拉 `@preview` tag,可用 `ANET_DASHBOARD_VERSION` env 覆盖,跟 anet release channel 对齐 — 见 #61)。最新部署方式见 [anet.sh/guide/dashboard](https://anet.sh/guide/dashboard)。下面的「两种 Dashboard」/「内置 UI 设计原则」/「实现方案」/「HTML 结构」全是 V2 设计草稿,仅保留历史背景,**当前不适用**。 +> **R220 校准(2026-05-13)**:本节的「内置轻量 UI」+「`http://YOUR_IP:9200/dashboard`」是 V2 早期设计草稿,**v0.8 实际未实现** —— commhub-server `server/src/index.ts` 没有 `/dashboard` 路由([全 source grep `/dashboard` 0 hit](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts))。当前**唯一 Dashboard 是独立的 Next.js 包 `@sleep2agi/agent-network-dashboard`**,通过 `anet hub dashboard` 子命令拉起([`agent-network/bin/cli.ts:2386`](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts#L2386) `sub === "dashboard"` 分支,默认端口 3000;版本不再 hardcode pin —— [`dashboardReleaseTag()` cli.ts:347](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts#L347) 默认拉 `@preview` tag,可用 `ANET_DASHBOARD_VERSION` env 覆盖,跟 anet release channel 对齐 — 见 #61)。最新部署方式见 [anet.sh/guide/dashboard](https://anet.sh/guide/dashboard)。下面的「两种 Dashboard」/「内置 UI 设计原则」/「实现方案」/「HTML 结构」全是 V2 设计草稿,仅保留历史背景,**当前不适用**。 ### 当前 Dashboard diff --git a/docs/node-lifecycle.md b/docs/node-lifecycle.md index 97f25cb7c..9f83b556f 100644 --- a/docs/node-lifecycle.md +++ b/docs/node-lifecycle.md @@ -193,7 +193,7 @@ register() → callCommHub("report_status", { - config.json: 不变(session 已写回) - 进程退出 -**CommHub 超时检测**: 心跳 3 分钟间隔([`agent-node/src/cli.ts:1159`](https://github.com/sleep2agi/agent-network/blob/main/agent-node/src/cli.ts#L1159) `setInterval(() => reportStatus("idle"), 3 * 60 * 1000)`),超过 **10 分钟**无心跳 → 自动标记 offline([`server/src/index.ts:816-821`](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts#L816) `Date.now() - 10 * 60 * 1000` cutoff,惰性触发于 `/api/status` 调用时)。R219 校准:原 doc 5 分钟错。 +**CommHub 超时检测**: 心跳 3 分钟间隔([`agent-node/src/cli.ts:1159`](https://github.com/sleep2agi/agent-network/blob/main/agent-node/src/cli.ts#L1159) `setInterval(() => reportStatus("idle"), 3 * 60 * 1000)`),超过 **10 分钟**无心跳 → 自动标记 offline([`server/src/server.ts`](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts) `Date.now() - 10 * 60 * 1000` cutoff,惰性触发于 `/api/status` 调用时)。R219 校准:原 doc 5 分钟错。 ### 9. 删除 (deleted) — R219 校准 diff --git a/docs/open-source-quality-review.md b/docs/open-source-quality-review.md index 15a229ef9..c9bf4b9a5 100644 --- a/docs/open-source-quality-review.md +++ b/docs/open-source-quality-review.md @@ -334,7 +334,7 @@ try { db.exec("ALTER TABLE ...") } catch {} `server/src/index.ts:234-243` 在 `COMMHUB_CORS_ORIGINS` 之外还硬编码允许: -- 一个作者私有域名(具体见 [`server/src/index.ts`](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts) `additionalAllow` 列表) +- 一个作者私有域名(具体见 [`server/src/index.ts`](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts) `additionalAllow` 列表) - 一个 Vercel 部署域名(dashboard staging) 如果用户显式设置了自己的 CORS origins,一般预期是覆盖默认值,而不是仍然允许官方域名。对开源/自托管项目来说,这种"隐藏默认允许"会降低可审计性。**v0.8 后 OSS 转向不做 SaaS 托管**,建议把作者私有域名从硬编码列表里移除(root cause 在 server 代码,本 doc fix 不彻底)。 diff --git a/tests/qa-dash-07-auth-boundary/README.md b/tests/qa-dash-07-auth-boundary/README.md index 840fad9bd..03b08e448 100644 --- a/tests/qa-dash-07-auth-boundary/README.md +++ b/tests/qa-dash-07-auth-boundary/README.md @@ -39,7 +39,7 @@ sg docker -c 'docker run --rm anet-qa-dash-07' #### 1. `requireAuth` 中央门卫 -[index.ts L98-122](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts#L98): +[server.ts 鉴权入口](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts): - 没 token → 401 "unauthorized" - token 但 resolveToken 找不到 → 401 "invalid token" - 老的 master token + dev_open 模式仍 fallback(legacy) @@ -48,7 +48,7 @@ sg docker -c 'docker run --rm anet-qa-dash-07' #### 2. admin-only 端点单独二审 (`requireAdminAuth`) -[index.ts L138-143](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts#L138):先校 token,再查 `user.role === "admin"`。 +[server.ts admin 角色校验](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts):先校 token,再查 `user.role === "admin"`。 non-admin → 403。例:`/api/server-logs`(含用户名 + task 内容,admin-only)。 #### 3. SSE + MCP 同样 401 diff --git a/tests/qa-dash-08-cross-account-views/README.md b/tests/qa-dash-08-cross-account-views/README.md index 9b3a6b1ee..0ca116149 100644 --- a/tests/qa-dash-08-cross-account-views/README.md +++ b/tests/qa-dash-08-cross-account-views/README.md @@ -50,7 +50,7 @@ sg docker -c 'docker run --rm anet-qa-dash-08' ## 锁住的契约 -`addNetworkScope` 应用于**所有**列表查询([index.ts](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts) 各端点 SQL inject): +`addNetworkScope` 应用于**所有**列表查询([server.ts](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts) 各端点 SQL inject): ```sql WHERE network_id IN (SELECT network_id FROM network_members WHERE user_id = ?) diff --git a/tests/qa-hub-06b-cross-user-isolation/README.md b/tests/qa-hub-06b-cross-user-isolation/README.md index 96711f584..5b310571e 100644 --- a/tests/qa-hub-06b-cross-user-isolation/README.md +++ b/tests/qa-hub-06b-cross-user-isolation/README.md @@ -39,7 +39,7 @@ sg docker -c 'docker run --rm anet-qa-hub-06b' [auth.ts createNetwork](https://github.com/sleep2agi/agent-network/blob/main/server/src/auth.ts#L182): 建网络时在 `network_members` 表写一行 owner。 -[index.ts /api/networks GET](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts) 通过 `getUserAllNetworks(user_id)` 过滤。 +[server.ts /api/networks GET](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts) 通过 `getUserAllNetworks(user_id)` 过滤。 bob 不是 alice-private 的成员 → 看不到。 #### 2. /api/tasks 默认按 user 可见 network 过滤 @@ -49,7 +49,7 @@ bob 没参与 alice 的 network → 查询返空。 #### 3. 直接传 `network_id=` 也防住 -[index.ts /api/task POST L788](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts#L788): +[server.ts /api/task POST](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts): ```ts if (restAuth && !isAdmin && !getUserNetworkRole(restAuth.userId, body.network_id)) { return Response.json({ ok: false, error: "access denied to requested network" }, { status: 403 }); diff --git a/tests/qa-node-03b-task-events/README.md b/tests/qa-node-03b-task-events/README.md index 861891394..dda05afad 100644 --- a/tests/qa-node-03b-task-events/README.md +++ b/tests/qa-node-03b-task-events/README.md @@ -33,7 +33,7 @@ sg docker -c 'docker run --rm anet-qa-node-03b' **`/api/task` REST 端点不写 task_events,只有 MCP `send_task` 写。** -[index.ts /api/task 处理器](https://github.com/sleep2agi/agent-network/blob/main/server/src/index.ts#L771) 直接 INSERT inbox+tasks,但**不调 `logTaskEvent("delivered", ...)`**。 +[server.ts /api/task 处理器](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts) 直接 INSERT inbox+tasks,但**不调 `logTaskEvent("delivered", ...)`**。 而 [MCP send_task L517](https://github.com/sleep2agi/agent-network/blob/main/server/src/tools.ts#L517) 调用。 **含义**:通过 Dashboard 派单(走 REST `/api/task`)的任务在 task_events 表里**没有 delivered 事件**! From 31f5c15d5bc1bbe45640c4a44a9219975c974635 Mon Sep 17 00:00:00 2001 From: t Date: Sun, 16 Aug 2026 06:47:59 +0800 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20=E4=BF=AE=E4=B8=8A=E4=B8=80?= =?UTF-8?q?=E6=9D=A1=E6=94=B9=E5=8A=A8=E8=87=AA=E5=B7=B1=E9=80=A0=E5=87=BA?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E5=A4=84=E9=94=9A=E6=96=87=E6=9C=AC/?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E4=B8=8D=E4=B8=80=E8=87=B4=20(#850)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一条我把 9 处指向 `server/src/index.ts` 的链接改指 `server.ts`。 其中 `docs/open-source-quality-review.md:337` 那条的**锚文本本身就是路径**: [`server/src/index.ts`](…/blob/main/server/src/index.ts) 批量替换只改了目标,于是变成 [`server/src/index.ts`](…/blob/main/server/src/server.ts) ← 文字与目标互相矛盾 🔴 **这正是我在同一条 issue 里刚指出过的形态**(RFC-006 那处:路径写成链接文字、 说明写成目标)。指出一个缺陷不会让人免疫于它。 是新写的 `repo-gates/scripts/check-doc-anchor-target-mismatch.py` 抓到的 —— 它第一次跑就红在我自己的改动上,而**改动前的 origin/main 是绿的** (改前锚文本 `index.ts` 与目标 `index.ts` 一致,只是双双指向已被掏空的文件)。 ⇒ 那道门判的是**一致性**,不是**正确性**。两者都需要,而且是两道不同的门。 --- docs/open-source-quality-review.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/open-source-quality-review.md b/docs/open-source-quality-review.md index c9bf4b9a5..38a5caf2e 100644 --- a/docs/open-source-quality-review.md +++ b/docs/open-source-quality-review.md @@ -334,7 +334,7 @@ try { db.exec("ALTER TABLE ...") } catch {} `server/src/index.ts:234-243` 在 `COMMHUB_CORS_ORIGINS` 之外还硬编码允许: -- 一个作者私有域名(具体见 [`server/src/index.ts`](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts) `additionalAllow` 列表) +- 一个作者私有域名(具体见 [`server/src/server.ts`](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts) `additionalAllow` 列表) - 一个 Vercel 部署域名(dashboard staging) 如果用户显式设置了自己的 CORS origins,一般预期是覆盖默认值,而不是仍然允许官方域名。对开源/自托管项目来说,这种"隐藏默认允许"会降低可审计性。**v0.8 后 OSS 转向不做 SaaS 托管**,建议把作者私有域名从硬编码列表里移除(root cause 在 server 代码,本 doc fix 不彻底)。 From f10527c30cbc07ed17cc548a621e069f5af624ff Mon Sep 17 00:00:00 2001 From: t Date: Tue, 18 Aug 2026 20:47:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20=E4=BF=AE=E6=8E=89=E4=B8=8A?= =?UTF-8?q?=E9=9D=A2=E9=82=A3=E6=9D=A1=E5=BC=95=E8=BF=9B=E6=9D=A5=E7=9A=84?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E8=A1=8C=E5=8F=B7=20pin=EF=BC=88#987=20?= =?UTF-8?q?=E9=82=A3=E9=81=93=E6=96=B0=E9=97=A8=E5=BD=93=E5=9C=BA=E6=8A=93?= =?UTF-8?q?=E7=9A=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/architecture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture.md b/docs/architecture.md index 7b4a4be1e..427cd22c3 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -521,7 +521,7 @@ R256 校准:旧 doc 用 `send_task(hub, result)` 回复任务结果 —— 这 ## 10. Web Dashboard -> **R220 校准(2026-05-13)**:本节的「内置轻量 UI」+「`http://YOUR_IP:9200/dashboard`」是 V2 早期设计草稿,**v0.8 实际未实现** —— commhub-server `server/src/index.ts` 没有 `/dashboard` 路由([全 source grep `/dashboard` 0 hit](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts))。当前**唯一 Dashboard 是独立的 Next.js 包 `@sleep2agi/agent-network-dashboard`**,通过 `anet hub dashboard` 子命令拉起([`agent-network/bin/cli.ts:2386`](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts#L2386) `sub === "dashboard"` 分支,默认端口 3000;版本不再 hardcode pin —— [`dashboardReleaseTag()` cli.ts:347](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts#L347) 默认拉 `@preview` tag,可用 `ANET_DASHBOARD_VERSION` env 覆盖,跟 anet release channel 对齐 — 见 #61)。最新部署方式见 [anet.sh/guide/dashboard](https://anet.sh/guide/dashboard)。下面的「两种 Dashboard」/「内置 UI 设计原则」/「实现方案」/「HTML 结构」全是 V2 设计草稿,仅保留历史背景,**当前不适用**。 +> **R220 校准(2026-05-13)**:本节的「内置轻量 UI」+「`http://YOUR_IP:9200/dashboard`」是 V2 早期设计草稿,**v0.8 实际未实现** —— commhub-server `server/src/index.ts` 没有 `/dashboard` 路由([全 source grep `/dashboard` 0 hit](https://github.com/sleep2agi/agent-network/blob/main/server/src/server.ts))。当前**唯一 Dashboard 是独立的 Next.js 包 `@sleep2agi/agent-network-dashboard`**,通过 `anet hub dashboard` 子命令拉起([`agent-network/bin/cli.ts:2386`](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts#L2386) `sub === "dashboard"` 分支,默认端口 3000;版本不再 hardcode pin —— [`dashboardReleaseTag()` cli.ts:347](https://github.com/sleep2agi/agent-network/blob/main/agent-network/bin/cli.ts#L1569) 默认拉 `@preview` tag,可用 `ANET_DASHBOARD_VERSION` env 覆盖,跟 anet release channel 对齐 — 见 #61)。最新部署方式见 [anet.sh/guide/dashboard](https://anet.sh/guide/dashboard)。下面的「两种 Dashboard」/「内置 UI 设计原则」/「实现方案」/「HTML 结构」全是 V2 设计草稿,仅保留历史背景,**当前不适用**。 ### 当前 Dashboard