Fix documentation inconsistencies found by code audit

- docs/01: sync all syscall signatures with proto (missing params,
  invented callback params, stream semantics, return types)
- docs/02: mark unimplemented features (FFI system plugins, topo sort,
  lifecycle CLI, watchdog); clarify plugin.yaml is not parsed by the
  kernel - registration goes through gRPC PluginBridge.Register;
  correct permission model and session_id descriptions
- docs/03: check off implemented stage 3 items (Hermes adapter,
  Claude Code plugin)
- docs/04: data/ actual location, add Cargo.toml to plugin trees,
  note __init__.py is hand-maintained
- README: status line now reflects actual progress

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 14:59:54 +08:00
parent 3299468df6
commit e75cfc6812
5 changed files with 65 additions and 35 deletions

View File

@@ -19,21 +19,23 @@
---
### 系统插件(= 内核模块 / 驱动)
### 系统插件(= 内核模块 / 驱动)⏳ 设计目标,未实现
为 syscall 提供具体实现。类比 `insmod alsa_driver.ko`
```yaml
# 设计示意(provides 字段与 FFI 加载尚未实现)
id: alsa-audio
type: system
provides: audio
entry: ./libalsa_audio.so
```
- FFI 加载(.so/.dylib/.dll),零开销
- FFI 加载(.so/.dylib/.dll),零开销 —— **未实现**,当前无动态库加载代码
- 只限 Rust / C ABI
- 同一 syscall 可有多个驱动,同时只激活一个
- 无依赖
- 当前内核仅拒绝外部进程注册 `type: system`(防止权限提升),加载机制本身待实现
---
@@ -43,12 +45,16 @@ entry: ./libalsa_audio.so
```yaml
id: tts-edge
name: Edge TTS
version: 0.1.0
type: basic
syscalls:
- audio.play
- network.request
exports:
- name: speak
description: Text to speech
entry: python tts_plugin.py
```
- 独立进程,gRPC/TCP 通信(后续切 UDS/Named Pipe)
@@ -63,6 +69,8 @@ exports:
```yaml
id: voice-agent
name: Voice Agent
version: 0.1.0
type: standard
syscalls:
- input.text
@@ -73,12 +81,18 @@ depends:
- chat-agent
exports:
- name: voice_chat
description: Voice conversation loop
entry: cargo run -p voice-agent
```
- 可依赖基础插件 + 其他标准插件
- 按依赖拓扑排序加载(= systemd ordering)
- 按依赖拓扑排序加载(= systemd ordering)—— **未实现**:`depends` 当前仅随注册存储,不做解析/排序/校验(阶段 4)
- 任意语言
> **plugin.yaml 的当前角色**:内核**不会**扫描或解析 plugin.yaml——它目前是给开发者看的清单(entry/port 供手动启动用)。
> 实际注册机制是插件进程启动后主动调用 `PluginBridge.Register`(gRPC),传 protobuf `PluginInfo{id, name, version, plugin_type, syscalls, depends, exports, endpoint}`。
> 基于 YAML 的自动发现/自动加载属于阶段 4 的插件管理目标。
---
## 通信:gRPC(= D-Bus)
@@ -96,7 +110,7 @@ exports:
| 插件类型 | 传输 | 延迟 | Linux 类比 |
|---|---|---|---|
| 系统插件 | FFI | ~纳秒 | 内核态函数调用 |
| 系统插件(未实现) | FFI | ~纳秒 | 内核态函数调用 |
| 基础/标准(本机,当前) | gRPC/TCP | ~毫秒 | D-Bus over TCP |
| 基础/标准(目标) | gRPC/Unix socket / Windows Named Pipe | ~微秒 | D-Bus over UDS |
| 远程(可选) | gRPC/TCP | ~毫秒 | D-Bus over TCP |
@@ -137,7 +151,9 @@ message CallRequest {
---
## 生命周期管理(= systemctl)
## 生命周期管理(= systemctl)⏳ 阶段 4 目标,未实现
以下命令为规划中的 CLI,当前内核仅提供 gRPC server,无任何子命令:
| agentsd 命令 | systemd 对标 | 作用 |
|---|---|---|
@@ -153,7 +169,9 @@ message CallRequest {
---
## 加载顺序(= systemd boot)
## 加载顺序(= systemd boot)⏳ 设计目标,未实现
当前插件由开发者手动启动,启动后自行注册。规划中的加载顺序:
```
1. 系统插件(FFI,注册 syscall 实现) ← 类比内核模块加载
@@ -163,7 +181,7 @@ message CallRequest {
---
## 看门狗(= Restart=always)
## 看门狗(= Restart=always)⏳ 阶段 4 目标,未实现
插件崩溃 → agentsd 自动重启(可配置策略):
- `always`:总是重启
@@ -175,8 +193,8 @@ message CallRequest {
## 权限(= seccomp + cgroup)
- 系统插件:内核信任,无限制
- 基础插件:按 `syscalls` 白名单精确到方法(如 `fs.list`)校验,也支持 `fs` / `fs.*` / `*` 授权(= seccomp filter)
- 标准插件:syscalls + depends 白名单,未声明的一律拒绝
- 基础/标准插件:按 `syscalls` 白名单精确到方法(如 `fs.list`)校验,也支持 `fs` / `fs.*` / `*` 授权(= seccomp filter)
- `depends` 字段当前仅声明、随注册存储,不参与权限校验(依赖校验属阶段 4)
### 身份认证
@@ -184,7 +202,7 @@ message CallRequest {
这是第一道安全边界——即使 server 监听 TCP,未注册的进程也无法调用任何 syscall。
认证流程:
1. 插件通过 `PluginBridge.Register` 注册,获得 `session_id`
1. 插件通过 `PluginBridge.Register` 注册(返回的 `session_id` 目前仅作回执,不参与后续校验)
2. 后续所有 syscall 请求须在 gRPC metadata 中带 `x-plugin-id: <plugin_id>`
3. 内核校验:plugin_id 存在 → status=Running → syscall 在该插件的白名单内 → 放行