- 变更规模:新增 514 / 修改 62 / 重命名 155 / 删除 4(归档重组与文档轮次) - .gitignore 修:`归档/**/db-cwd归一-备份-*/` —— 原规则写绝对层级(归档/db-cwd归一-…), 目录搬进 归档/配置与备份/ 后**静默失效**,43 MB 的 DB 备份又变成未跟踪 - .gitignore 补:嵌套 git 内部数据(归档/内嵌git-20261008/、归档/skills-git-旧线-20261007/dotgit-原样移出/) - .gitignore 补:运行态与部署副本(.workbuddy/collab/、.workbuddy/tools/、.workbuddy/.load-pending、.workbuddy/tmp-*) - .gitignore 补:备份件(*.bak-*) - 未跟踪文件从 2190 降到 890(其余为 归档/ 归档件与 .workbuddy/memory/ 知识文件,按口径入库)
158 lines
11 KiB
Markdown
158 lines
11 KiB
Markdown
# 唤醒 · 本机 gateway 直连测试(纯本机 · 无代理 · 无垫片)
|
||
|
||
> **任务**(用户原话):「先用 gateway 那条线测试,但是**不用走代理什么的** 都在本机环境处理即可,也就是**把唤醒做成程序调用本机 workbuddy gateway**,就用**当前会话**测试」
|
||
> **附带口径**(用户补充):「会话自己创建的后台任务是可以触发给自己发消息的……后台任务监控程序安装,装好后会话继续处理,这条线是可以的」
|
||
> 日期 2026-09-30 12:5x | 执行者:接续-唤醒方案分析-20260930
|
||
|
||
---
|
||
|
||
## §0 三句话结论
|
||
|
||
1. **这条线通了**:程序 → `127.0.0.1:59486`(本机 WorkBuddy gateway)→ `POST /api/v1/sessions/6ecf6d98…/reply` ⇒ **HTTP 200 `{"data":{"delivered":true}}`**,⛔ 未经过覆盖网络 443、⛔ 未经过垫片 20090、⛔ 未经过任何代理。
|
||
2. **但「投递成功」≠「立刻唤醒」**:目标当时 `writerOccupied=True`(本轮正在跑)⇒ 消息**入队**、等**空闲边界**才被消费。这是本次唯一新口径。
|
||
3. **用户补充的那条线是对的**,而且它与本测试**互补**:会话后台任务能**继承网关口令**(它跑在 WorkBuddy 进程树内)⇒ 它是「零新会话 + 能每 5 分钟 + 拿得到凭据」的**唯一载体**。⚠️ 代价见 §5。
|
||
|
||
---
|
||
|
||
## §1 交付物:`wake-session.py`
|
||
|
||
路径:`$WS/.workbuddy/collab/wake-session.py`(零第三方依赖,只用标准库)
|
||
|
||
```
|
||
python wake-session.py --list # 列出本机所有网关及其 live 会话
|
||
python wake-session.py --session current --dry-run # 只做发现+前置判定,不投递
|
||
python wake-session.py --session current --text "…" # 真投递(默认目标=当前会话)
|
||
python wake-session.py --port 59486 --session current --text "…" # 应急:跳过发现
|
||
```
|
||
|
||
| 设计点 | 落地 |
|
||
|---|---|
|
||
| 凭据 | **只**从环境变量 `CODEBUDDY_GATEWAY_PASSWORD` 读;⛔ 命令行明文、⛔ 落盘、⛔ 回显(T3) |
|
||
| 端口 | **每次现查**;fail-closed:查不到 ⇒ 具名错误码 `no-live-match`,⛔ **绝不沿用上次端口** |
|
||
| 目标闸门 | 只投给 **live 且 `live.sessionId == 目标`** 的会话 ⇒ 否则 rc=2 拒绝(**T2**) |
|
||
| 超时 | 读 ≤5 s、写 ≤10 s(**T5**);**单次投递、不重试**(**T4**) |
|
||
| 副作用 | 本程序**不监听任何端口**;⛔ 不改配置 / 插件 / 令牌 / 进程(**T3/T7**) |
|
||
| 退出码 | `0` 成功 | `1` 参数错 | `2` 前置不满足 | `3` 发现失败 | `4` 投递失败 |
|
||
|
||
---
|
||
|
||
## §2 读数(2026-09-30 12:49–12:56)
|
||
|
||
### §2.1 「服务本会话的那个网关」怎么定 —— 三判据 + 一条匹配
|
||
|
||
`--list` 实测:
|
||
|
||
| 网关 | pid | live 会话 | writerOccupied | 备注 |
|
||
|---|---|---|---|---|
|
||
| `127.0.0.1:55283` | 56072 | `11a263a2…` | True | 另一个会话的宿主 |
|
||
| `127.0.0.1:56975` | 50716 | `fe146dd9…` | True | 另一个会话的宿主 |
|
||
| **`127.0.0.1:59486`** | 52460 | **`6ecf6d98…`** | True | **← 本会话所在** |
|
||
|
||
三判据(全部**不带凭据**):
|
||
① `GET /` 含 `CodeBuddy Gateway` / `CodeBuddy Remote Control`;
|
||
② `GET /api/v1/health` ⇒ **401 `AUTH_REQUIRED`**;
|
||
③ 能应答 `/api/v1/sessions/live`。
|
||
再按 **`live.sessionId == 目标`** 精确匹配 ⇒ 唯一命中才动手(多命中 ⇒ rc=3 拒绝)。
|
||
|
||
🔴 **本次踩到并修掉的坑(值得记住)**:判指纹**必须不带凭据**。
|
||
带 `x-access-token` 时 `/api/v1/health` 会从 **401 变 200** ⇒ 判据全线落空(首版就因此全灭)。
|
||
⚠️ 而这一条恰好也是「**真网关 vs 垫片 20090**」的**唯一分水岭**:垫片会把根页原样转出去(标记同样命中),但它自己不做鉴权 ⇒ `health=200` ⇒ 被正确排除。
|
||
|
||
### §2.2 投递读数
|
||
|
||
| 项 | 值 |
|
||
|---|---|
|
||
| 目标 | `6ecf6d98-1308-4218-8111-50a71fcb7201`(本会话) |
|
||
| 时刻 | 12:55:11 |
|
||
| 网关应答 | **HTTP 200 `{"data":{"delivered":true}}`** |
|
||
| `sessions.updated_at` | `12:49:20` → **`12:55:31`**(投递后被推进) |
|
||
| `sessions.unread` | 0(live 会话本就不计未读) |
|
||
| 转录落库 | ⛔ **尚未**:`projects/…/6ecf6d98….jsonl` 里**没有**对应的 user 消息(`user-like=0`) |
|
||
|
||
### §2.3 证据分级(⛔ 不把"ack"说成"闭环")
|
||
|
||
| 级别 | 内容 |
|
||
|---|---|
|
||
| **硬(已取得)** | 网关自认 `delivered:true` + 会话行 `updated_at` 在投递后被推进 20 s |
|
||
| **待闭环** | **那条注入消息作为一条用户消息出现** —— 目标当时正忙,会排在**空闲边界**;它自己现身即闭环。⛔ 若始终不出现 ⇒ 说明 `reply` 对 busy 会话**只入队不落地**,需另找触发点(这是本测试留下的**唯一未决项**) |
|
||
|
||
---
|
||
|
||
## §3 链路图(本次实测)
|
||
|
||
```
|
||
┌──────────────────────── 全程本机回环,⛔ 无 443 / 无垫片 / 无代理 ────────────────────────┐
|
||
│ │
|
||
│ wake-session.py │
|
||
│ │ ① netstat -ano → 回环监听口 │
|
||
│ │ ② 逐口三判据指纹(不带凭据)→ 命中 3 个真网关,排除垫片 20090 │
|
||
│ │ ③ GET /api/v1/sessions/live(带 x-access-token)→ 取 live.sessionId │
|
||
│ │ ④ 精确匹配目标 6ecf6d98 ←─ **本会话** │
|
||
│ ▼ │
|
||
│ 127.0.0.1:59486 WorkBuddy gateway ──► POST /api/v1/sessions/6ecf6d98…/reply │
|
||
│ │ │ │
|
||
│ │ └──► 200 {"delivered":true} │
|
||
│ ▼ │
|
||
│ sessions 行 updated_at 被推进(12:49:20 → 12:55:31) │
|
||
│ │ │
|
||
│ ▼ │
|
||
│ ⚠️ writerOccupied=True ⇒ **入队**,等**空闲边界**被消费 ⇒ 本轮结束后作为一条用户消息现身 │
|
||
└──────────────────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## §4 与「会话后台任务」那条线的关系(用户补充口径)
|
||
|
||
**用户说对了,机制层面完全成立**,且与本次测试**互补**:
|
||
|
||
| 问题 | 答案 |
|
||
|---|---|
|
||
| 会话自己起的后台任务能给自己发消息吗? | **能** —— 它的输出**作为事件回流**到宿主会话 ⇒ 就是「监控安装、装完会话继续处理」的那个现象 |
|
||
| 那它为什么被列进禁令(T1)? | 因为**非静默**的输出会**反复**唤醒宿主 ⇒ 会话永不空闲;本轮又取到一条硬证据(见下) |
|
||
| 它对「5 分钟唤醒」意味着什么? | 🔑 **它是本机唯一同时满足「零新会话 + 能拿口令 + 能任意周期」的载体** —— 会话后台任务跑在 WorkBuddy 进程树内 ⇒ **自动继承 `CODEBUDDY_GATEWAY_PASSWORD`**;而独立进程(计划任务)**拿不到口令**,⛔ 不能用网关派活 |
|
||
|
||
### §4.1 🔴 本轮新取到的一条硬证据(与本会话直接相关)
|
||
|
||
| 读数 | 值 |
|
||
|---|---|
|
||
| `logs/2026-09-30/sdk/conversations/6ecf6d98-….log` | **10,485,723 B ≈ 10 MiB + 1 KB** |
|
||
| 该文件 mtime | **12:26**(此后**不再增长**) |
|
||
|
||
⇒ **本会话的诊断日志已经顶到 ~10 MiB 那个阈值**,与既有结论一致(超限 ⇒ 宿主 `diagnostic-log` 丢弃 ⇒ 界面不再显示、看着像卡)。
|
||
⇒ 因此:**会话后台任务当唤醒源,必须「完全静默」(stdout 全重定向到文件)**,否则就是把这个阈值当加速器在踩。
|
||
|
||
---
|
||
|
||
## §5 「5 分钟唤醒」的结论因此**要改**(相较 2026-09-30 上午的判定)
|
||
|
||
| 档 | 载体 | 粒度 | 新会话 | 凭据 | 判定 |
|
||
|---|---|---|---|---|---|
|
||
| **A** | 1 小时自动化(`FREQ=HOURLY;INTERVAL=1`) | 1 h | **24/天** | 有 | ✅ 现成 |
|
||
| **B** | **本机 gateway 直连**(本次成果)+ 一个**完全静默**的周期进程 | **5 分钟可做** | **0** | 需要进程在 WorkBuddy 进程树内 | ✅ **可达 5 分钟、零新会话**;载体=会话后台任务(静默循环)**或**任何能继承口令的常驻进程 |
|
||
| **C** | 外部定时器 → 覆盖网络 443 → 垫片 20090 | 5 分钟 | 0 | 不需要本机口令 | ✅ 可行,但**绕远**(本机测试已证明**不需要走那条**) |
|
||
|
||
🔴 **与 T1 的冲突必须明说**:T1 写的是「⛔ 垫片/桥不得放进会话后台任务」。
|
||
它的**本意**是「别让输出回流把宿主拖死」。B 档若走「会话后台任务 + 完全静默 + 只调 `reply`」,**满足本意、违反字面** ⇒ 要采纳必须先由用户明确覆盖 T1,或把 T1 的措辞改成「**非静默**的长跑不得放进会话后台任务」。
|
||
⛔ 本棒**未擅自建任何常驻**、⛔ 未创建任何自动化。
|
||
|
||
---
|
||
|
||
## §6 边界与残留
|
||
|
||
- ⛔ 未走覆盖网络 443、⛔ 未动垫片 20090、⛔ 未动看板 8788、⛔ 未动中继客户端。
|
||
- ⛔ 未改 WorkBuddy 配置 / 插件 / 令牌;⛔ 未 kill/restart 任何 WorkBuddy 进程(T3/T7 逐条自查通过)。
|
||
- ⛔ 口令未落盘、未回显;本文件与脚本内**无任何凭据字面**。
|
||
- ⛔ 未创建自动化、⛔ 未建常驻进程(均需用户拍板)。
|
||
- 本棒临时取证件(`tmp/_wk_probe.py`、`tmp/_wk_verify.py`)已逐个删除,`tmp/` 无残留。
|
||
- 域锁:`接续-唤醒方案分析-20260930`(`ai1net-dsh-server/`),收尾释放。
|
||
|
||
## §7 索引
|
||
|
||
| 件 | 路径 |
|
||
|---|---|
|
||
| 投递器 | `$WS/.workbuddy/collab/wake-session.py` |
|
||
| 本文件 | `$WS/交付物/唤醒-本机网关直连测试-20260930.md` |
|
||
| 上一棒(方案分析 + §11 五分钟判定) | `$WS/交付物/唤醒的解决方式-官方文档核对与方案分析-20260930.md` |
|
||
| 架构约束(T1–T7 / V7 验收) | `$WS/交付物/手机App经覆盖网络操作WorkBuddy-架构定稿v3-20260929.md` §0.5 |
|