# Infra Sentinel

一个本地优先的个人 AI Infra 可观测面板：分别观察网络、AI 用量、本机状态、上游服务与本地设施健康，不抹平各自的单位、来源和协议边界。

## Metadata

- HTML: https://glenzli.com/projects/traffic-sentinel/
- Markdown: https://glenzli.com/projects/traffic-sentinel.md
- Collection: Projects
- Language: zh-CN
- Published: 2026-08-14
- Status: active
- Tags: macOS, observability, ai-usage, network, local-system, infra-protocol, codex, opencode

## Content

Infra Sentinel 是一个本地优先的个人 AI Infra 可观测面板。它现在同时观察本机与远端网络用量、OpenCode 与 Codex 的本地 Token 记录、本机 CPU/内存/磁盘/热状态、少量上游服务状态，以及主动接入的本地基础设施健康状态。

这些对象不会被压成一个看似直观的“总分”。字节、Token、延迟、错误与服务状态各自保留原有单位和统计口径；数据不足时，界面显示未知、覆盖不完整或来源异常，而不是补出一个推测值。

## 三类资源，一套观察面

    **网络用量**
    本机 Mihomo、域名与代理路径、Linux VPS 账单量和 Xray 用户逻辑流量分层呈现，不把不同物理层的计数混成一个总量。

    **AI 用量**
    读取 OpenCode 与 Codex 已保存在本机的聚合元数据，按 Agent、模型、时间范围和观测窗口展示 Token 趋势。

    **本地设施**
    通过 Infra Protocol 精确发现主动登记的 runtime 与服务，并把每个设施作为独立资源展示受限、只读的健康投影。

    **本机与上游状态**
    CPU、内存压力、swap、磁盘、I/O 与热状态保留平台原生语义；上游状态只低频、只读地观察官方状态源。

    **不知道就标记不知道**
    采集窗口不完整、来源失联或协议不兼容时，界面保留这些边界，不把推断冒充账单或健康结论。

  ![Infra Sentinel 中文概览，展示网络、AI 用量与本地设施资源](/images/projects/infra-sentinel-overview-zh.webp)

## 网络的口径不被抹平

本机网络以 Mihomo / Clash Meta 兼容内核为事实来源。相邻的 `uploadTotal + downloadTotal` 增量构成精确总量，域名和实际代理路径只是对这份总量的归因；轮询间隙内无法识别的短连接会保留为“未归因”，不会静默消失。

```text
已归因域名 + 未归因 = Mihomo 精确总增量
代理 + DIRECT + 阻断 + 未知 + 未归因 = Mihomo 精确总增量
```

VPS 是可选来源。每台 Linux 主机通过已有的 `~/.ssh/config` Host alias 短时、只读访问，并独立维护基线、计费方向和阈值。Xray 用户逻辑流量与网卡账单量属于不同层，因此可以对照，但不会相加。

## AI 用量是趋势，不是账户账单

OpenCode 与 Codex 模块只读取各自客户端已经保存在本机的 Token 元数据。它可以呈现今日观测、可读历史、模型构成、消耗速率和 Agent 活动，但不读取任务标题、提示词、响应或项目内容。若 Infer Runtime 参与设施观测，Sentinel 只接收其明确声明为 `execution_origin: "other"` 的当日已结算文本 Token 聚合；Codex 来源仍由原有 collector 保持权威，从而避免重复记账。

  ![Infra Sentinel 中文 AI 用量页面，展示 Agent、模型与 Token 消耗速率](/images/projects/infra-sentinel-ai-usage-zh.webp)

不同来源的时间窗口并不相同：OpenCode 更接近自然日记录，Codex 从 Sentinel 当天首次建立的本机基线开始。应用直接显示观测覆盖，避免把本地趋势误写成 ChatGPT、Codex 或 API Provider 的账户余额。

## 本地设施只共享必要的观察面

兼容服务通过 [Infra Protocol](https://github.com/glenzli/infra-protocol) 发布短时、仅当前用户可读的注册。Sentinel 不扫描端口，也不靠进程名猜测；它只在具体协议版本与 binding 精确匹配后，连接由服务主动公布的端点。

Discovery 本身不携带指标、Console 地址、通用请求格式或控制权限。Sentinel 为每种应用协议编写独立 adapter，只把有界状态、指标、问题、观测时间和可选的本机 Console 链接投影到界面。设施专属的诊断与操作仍留在原生 Console。

当前验证过的接入包括 [Paged Context Protocol](https://github.com/glenzli/paged-context-protocol) 与 [Infer Runtime](https://github.com/glenzli/infer-runtime)。未知协议会被忽略，而不会被猜测为兼容；设施的深度诊断与控制始终留在各自原生 Console。

```text
Mihomo / VPS / Xray / OpenCode / Codex -> Collectors -> SQLite metrics ┐
Local facilities -> Infra Discovery -> protocol adapters -------------┤
                                                                      v
                                             Versioned Projection + commands
                                                                      v
                                                  Tauri UI / notifications
```

Python Agent 是采样、计量、存储、策略与 Projection 的唯一所有者；Tauri WebView 只能读取版本化结果并提交白名单命令。一个 collector 或设施接口失效，不会阻断其他资源的采样。

## 安装与范围

目前正式支持 macOS 13+、Mihomo / Clash Meta 的只读连接 API、经 OpenSSH Host alias 访问的 Linux VPS、可选 Xray StatsService、OpenCode Desktop/CLI、Codex 本地状态库，以及发布兼容 Infra Protocol offer 的 PCP 与 Infer Runtime。

```sh
git clone git@github.com:glenzli/infra-sentinel.git
cd infra-sentinel
python3 -m pip install pyinstaller
./bin/build-desktop-app.sh
open "ui/src-tauri/target/release/bundle/macos/Infra Sentinel.app"
```

它不抓包，不读取提示词、响应正文、URL 路径或项目文件，也不会终止进程、删除文件、断开网络或修改代理配置。所有采集、存储与分析默认在本机完成。
