Add Beryl Agent and harness source

This commit is contained in:
2026-09-08 20:10:03 +08:00
parent 06d72d001c
commit 47cfbcd66a
70 changed files with 12558 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# Agent Studio Mini
可运行的内部培训 Harnessassistant-ui 负责交互呈现,Fastify 负责 HTTP/SSEHarness 管理 Session、事件、审批、图片和安全边界,Pi Coding Agent SDK 执行真实 Agent Loop。截图可在首次启动后补入 `docs/screenshot.png`
```mermaid
flowchart LR
UI[assistant-ui Composer/Thread/Tool UI] -->|HTTP + SSE| API[Fastify API]
API --> R[SessionRegistry]
R --> P[Pi AgentSession]
R --> E[EventStore / ApprovalBroker]
P --> L[DefaultResourceLoader / Tools]
E --> UI
L --> S[Skills / Workspace / ModelRuntime]
```
## 快速开始
要求 Node.js 20+ 与 pnpm。运行 `pnpm install`,复制 `.env.example``.env` 并按需填写,然后 `pnpm dev`Web 为 <http://localhost:5173>API 为 <http://localhost:3001>。也可不写环境密钥,在顶部“模型设置”中提交 Provider、API、Base URL、Model ID、Vision 能力与 API Key。密钥只在当前服务进程的 Session 内存中保存,不回传、不写 Web Storage 或 Pi 全局文件。
课堂 Demo:配置模型,发送“请使用 ads-analysis Skill,分析账户 demo-account 最近 7 天数据,找出异常 Campaign,并输出账户总结、关键指标和 3 条优化建议。最后使用 report-writer Skill 生成一份报告草稿。”可再附图并说明图片仅为辅助信号。`save_report_draft` 会暂停并等待批准;Approve 写入 Session 固定 `report.md`Deny/Timeout 不写文件。
## 职责与行为
- Pi `AgentSession` 与 Harness Event Store 是事实来源;`useExternalStoreRuntime` 只是投影层,不请求模型。
- Skills 由 `DefaultResourceLoader.reload()` 发现,Catalog 仅显示元数据;正文保留 progressive disclosure。
- `.agents/skills``.pi/skills` 和按操作系统 `path.delimiter` 解析的 `AGENT_SKILLS_DIRS` 会 canonicalize、去重和诊断。
- `skill.requested`/`skill.loaded` 是 Harness 根据 canonical `SKILL.md` read 请求/成功结果推导的事件,不是 Pi 原生事件。(当前教学实现保留索引边界,完整 read preflight 映射见路线图。)
- Tool 白名单为 `read/grep/find/ls/mock_ads_metrics/save_report_draft`;未知 Tool denyshell/edit/write 不注册。
- 上传只接受 magic bytes 与 MIME 一致的 JPEG/PNG/WebPSharp 自动旋转、限制像素并重编码去元数据;结构化图片传入 `session.prompt(text,{images})`
- SSE 支持 sequence、Last-Event-ID、补发、15 秒 heartbeat、去重所需 ID 与断开清理。
## 版本与 API 核对
2026-08-26 核对 Pi 官方 SDK/Skills/Extensions/Security/Models/Providers 文档及 assistant-ui Custom Runtime/External Store/Tools/Tool UI/Attachments 文档,并检查安装包类型。实际锁定:`@earendil-works/pi-coding-agent` 0.84.3、`@assistant-ui/react` 0.15.16、`@assistant-ui/react-markdown` 0.14.12、Fastify 5.12.1、TypeBox 0.34.x。Pi 当前公开 `createAgentSession``DefaultResourceLoader``ModelRuntime.registerProvider/setRuntimeApiKey``SessionManager.inMemory``defineTool`/TypeBoxassistant-ui 当前公开 `useExternalStoreRuntime`、Toolkit 与 Attachment 类型。独立 markdown 包没有 0.15.x,故按注册表实际稳定版 0.14.12。未使用 `unstable_*``makeAssistantTool``useAssistantToolUI`
## 安全边界与限制
Pi **没有内置 Sandbox**Project Trust 只是项目资源加载防线,不是执行隔离;Pi 与 Extension 继承 Node 进程权限。本课堂版用显式工具 allowlist、随机 Session cwd、路径守卫、固定报告路径、审批、SSRF/DNS 检查、图片重编码与事件脱敏降低风险,但不等于 OS Sandbox。不可信 Skill、脚本、仓库或无人值守任务必须运行在 Docker、VM、micro-VM 或远程 Sandbox。
状态是单进程内存,重启丢失;没有用户鉴权、CSRF、速率限制、分布式协调或对象存储。生产化应加入 Redis/Postgres、对象存储、KMS、身份与租户鉴权、CSRF/限流、容器隔离、不可变审计日志和分布式 SSE。
## 验证
`pnpm lint``pnpm typecheck``pnpm test``pnpm build`。默认测试使用 fake/内存边界,不需要真实 API Key 或真实模型。更多内容见 [架构](docs/architecture.md)、[事件映射](docs/event-mapping.md)、[安全边界](docs/security-boundaries.md)、[课堂演示](docs/classroom-demo.md)和[生产路线](docs/production-roadmap.md)。