feat: purge legacy agent hosts and land vault Chrome extension path

Retire ACP/Hermes/OpenCode surfaces and rename hermes_tools to
mnote_agent_tools so Page AI stays on Pi Lab only. Add Chrome vault
extension + extension token route, pre-release purge design, and soft-retire
legacy smokes for the small-group production cut.
This commit is contained in:
Agent Board
2026-07-25 14:25:37 +08:00
parent bc6f8488ee
commit 262e66b02e
137 changed files with 9018 additions and 46049 deletions
+73 -20
View File
@@ -2,23 +2,33 @@
name: mnote-vault
description: >
MNote AI 密码本(多 agent 唯一策略)。读密与 login/sessionmnote-vault CLI + capability token(不依赖 mnote-web)。
禁扫 .mnote/vault 文件。
登录态为每账号独立 session 文件;禁扫 .mnote/vault 文件。
---
# MNote 密码箱 / AI 密码本
**SSOT**`/home/lix/.agent-infra/vault-policy.md`
**设计**`design/12-vault/process/12-2-vaultd-local-token-agent-read-path-v1.md`
**设计**
- `design/12-vault/process/12-2-vaultd-local-token-agent-read-path-v1.md`agent 读密 / login
- `design/12-vault/process/12-3-chrome-extension-vault-save-v1.md` §5.6 / §6.5(每账号 session 文件;扩展只写入)
## 读密稳态(P0 · 不依赖 mnote-web
二进制:`rust/target/debug/mnote-vault`(或 `cargo run -p mnote-vault --`)。
### 可执行入口(agent 必看 · 不要自己 find
| 优先级 | 路径 | 说明 |
|--------|------|------|
| **1(默认)** | `mnote-vault` | 已装到 `~/.local/bin/mnote-vault`symlink |
| **2(绝对路径)** | `/home/lix/.local/bin/mnote-vault` | PATH 异常时直接用 |
| **3(源码构建产物)** | `/mnt/Data1T/mnote/rust/target/debug/mnote-vault` | 开发树;**不要**在 `/home/lix``find` 全盘 |
```bash
# 一次(人 / 安装):签发 token
cargo run -q -p mnote-vault --manifest-path rust/Cargo.toml -- issue-token --agent paseo --ttl 90d
# 一次(人 / 安装):签发 tokencwd 任意)
mnote-vault issue-token --agent paseo --ttl 90d
# 或绝对路径:
# /home/lix/.local/bin/mnote-vault issue-token --agent paseo --ttl 90d
# Agent 每次(已知 id
# Agent 每次(已知 id;cwd 任意,不要求在 mnote 仓库
export MNOTE_VAULT_TOKEN_FILE="${MNOTE_VAULT_TOKEN_FILE:-$HOME/.config/mnote/vault-tokens/default.token}"
mnote-vault list
mnote-vault resolve --id <id> --field password
@@ -26,41 +36,84 @@ mnote-vault resolve --id <id> --field password
mnote-vault resolve --id <id> --field password --raw
```
**故障排查顺序**(≤2 步,禁止全盘搜索二进制):
1. `command -v mnote-vault || ls /home/lix/.local/bin/mnote-vault`
2. `mnote-vault doctor``tokenValid=false` 时只跑 `issue-token`**不要**起 3000
| 命令 | 用途 |
|------|------|
| `doctor` | workspace / token / hmac 状态(无明文) |
| `issue-token` | 签发 capability token**不是** master key |
| `whoami` | 当前 token claims |
| `list` / `get` | L0 选型;无密码明文 |
| `resolve` | **唯一取密**;审计无 value |
| `login` | 复用未过期 session,或 api_first 出站登录并写回 session |
| `session` | 浏览器/人机验证后回写 Cookie(不启 3000 |
| `list` / `get` | L0 选型;无密码/cookie 明文;可见 `hasLoginSession` |
| `resolve` | **取密**字段 `password` / `apikey` / `token` 等;审计无 value |
| `login` | **优先复用登录态**;无/过期则 api_first 或 human_required |
| `session` | 浏览器/人机验证后回写 Cookie(写 session 文件;不启 3000 |
| `serve` | 可选 UDS vaultdCLI 默认 sock→内嵌 fallback |
**禁止**:为读密 / login / session 去 `auth-e2e` / 起 3000 / 用 cookie 调 `/api/vault/ai/*`
**禁止**`Read` / `cat` / `grep` `.mnote/vault/**`(含 `entries/``sessions/`)。
`scripts/mnote-vault-cli.js` 的 web 路径仅调试 UI。
## 登录稳态(P1d · 同样不依赖 mnote-web
## 登录态文件(每账号一份 · 12-3
需要外站 cookie 时
磁盘(AI 本 / 用户 vault 同结构)
```text
{workspace}/.mnote/vault/
entries/{credId}.md # 账号密码;勿手读
sessions/{credId}/primary.json # 主账号登录态
sessions/{credId}/{accountId}.json
```
- **写入口(人)**:Chrome 扩展默认保存登录态 → `PUT …/session`;或 Agent `mnote-vault session`
- **读入口(AI**:只经 `login` / `session` /P1`resolve --field session`
- frontmatter 内旧 `loginSession`:兼容读;**新写一律走 session 文件**。
- 扩展写入的是**人用 vault**Agent 默认读 **AI 本** → 须用户 **share-to-ai**(会连同 session 文件复制)。
## 登录稳态(外站 cookie · 12-2 P1d + 12-3
需要外站已登录状态(Cookie)时:
```bash
# 优先复用已有 session(无 HTTP 出站)
# 1) 优先复用已有 session读 sessions/…json无 HTTP 出站)
mnote-vault login --id <id>
# 多账号:
mnote-vault login --id <id> --account-id <accId>
# human_required / CFchrome-bridge 登录后回写
# 2a) mode=session | reused | ok → 用响应里的 cookieHeader
# (仅进程内/管道使用;禁止贴进聊天、commit、issue
# 2b) human_required / CFchrome-bridge 登录后回写
mnote-vault session --id <id> --cookie-header 'name=value; …' --source human_bridge
# 可选:--account-id <accId>
# 强制重新 api_first 登录(忽略未过期 session
# 3) 强制重新 api_first 登录(忽略未过期 session
mnote-vault login --id <id> --force-refresh
```
- `resolve` / `session` 写盘:本地 `.mnote/vault/**`core)。
- `login``api_first` 仅对目标站出站 HTTP**不**经 mnote-web。
- Cloudflare / captcha → `mode=human_required` + `humanInstructions.cli`,完成后 `session` 回写。
| `login` 结果 | Agent 动作 |
|--------------|------------|
| `mode=session` / `reused` / `ok` 且含 `cookieHeader` | 用 Cookie 调目标站 API 或注入浏览器 |
| `mode=human_required` | chrome-bridge / 人完成验证 → `session` 回写 → 再 `login` |
| 无 session 且 api_first 失败 | 查 playbook / 人用扩展是否已 share-to-ai |
- `resolve` / `session` / `login` 写盘:本地 `.mnote/vault/**`core),**不**经 mnote-web。
- `login``api_first` 仅对目标站出站 HTTP。
- 默认 session TTL7 天(`MNOTE_VAULT_SESSION_TTL_HOURS`)。
## 与 Chrome 扩展的边界
| 角色 | 通道 | 鉴权 |
|------|------|------|
| 人:外站保存账号+登录态 | 扩展 → mnote-web `/api/vault/*` | human Bearer**非** agent token |
| AI:读密 / 复用登录态 | `mnote-vault` CLI → core | capability token |
扩展 **不是** agent 通道。人保存后若要 AI 用:在确认层勾选 **同步到 AI 密码本**(或工作台 share-to-ai)。
## 硬规则
1. 禁 file 扫 `.mnote/vault/**`
2. 聊天不贴 password / cookie / token
1. 禁 file 扫 `.mnote/vault/**`(含 sessions
2. 聊天不贴 password / cookieHeader / token
3. Token `0600`;故障先 `issue-token`,不要默认起 3000
4. 需要登录态时 **先 `login`**,不要先 `resolve` 密码再手拼 Cookie