actradeck/actradeck

GitHub: actradeck/actradeck

ActraDeck 是一个本地优先的厂商中立控制平面,用于实时监控、审批治理和跨厂商审计 AI 编码 agent(如 Claude Code 和 Codex)的行为。

Stars: 0 | Forks: 2

# ActraDeck **面向编码 agent 的厂商中立控制平面 —— 在一个控制台中实现机密脱敏、跨厂商审计和审批治理。** ActraDeck 运行在您的编码 agent —— Claude Code、Codex 以及未来将出现的 工具 —— 旁边,为您提供一个**统一的平台来监控它们的行为、在机密被存储前将其拦截,并保留跨厂商的审计追踪**。开箱即用的审批功能可将 Claude Code 的操作转发至控制台,对于在托管模式下的 Codex 同样支持(参见 [支持矩阵](#vendor--mode-support))。它是本地优先的:您机器上的一个 sidecar 负责收集结构化事件,在*任何内容被持久化之前*对机密进行脱敏,并提供一个 由您掌控的 Web 控制台。 ## 实际效果展示 以下是在**带有真实会话的在线环境**中录制的控制台演示 (机密在显示之前,已经在 sidecar 处被屏蔽): ![ActraDeck 控制台演示](https://static.pigsec.cn/wp-content/uploads/repos/cas/34/34fd35d009e3575464567fbe4246ab6bda26ec88e1968fd6c1b3f70919eceb63.gif) ▶ **完整演示(约 90 秒):** [`docs/media/usage.mp4`](./docs/media/usage.mp4) — 实时面板、基于证据的存活检测、带有分类计数的机密脱敏、跨厂商 审计(Claude Code **和** Codex 在同一条追踪记录中)、审批收件箱以及会话 回放。90 秒产品故事操作手册位于 [`docs/demo-90s.md`](./docs/demo-90s.md);可通过 [`scripts/record-cockpit-cast.mjs`](./scripts/record-cockpit-cast.mjs) 从您自己的 环境中重新生成此录像。 ## 为什么会有这个项目 厂商们已经在构建优秀的单一厂商仪表盘(例如 Claude Code 的 Agent View)。ActraDeck 刻意 **不**追求在单一厂商的“并行会话概览”竞赛中获胜。相反,它专注于模型厂商在架构上不会去构建的部分:**跨竞争 agent 的中立治理。** - **审批治理,而不仅仅是 prompt。** 结构化风险分类器会拦截 高风险命令;一个可选的持久化白名单允许您跳过对_安全_操作的重复审批,同时绝对不会自动放行危险操作。 - **机密在持久化或传输前被脱敏。** 双层脱敏器 (INV-REDACTION)会屏蔽检测到的密钥、token 和 `.env` 内容:sidecar 在它收集的事件_到达磁盘或网络之前_进行脱敏,而后端入口 对每个事件——包括来自外部 adapter 的直接 POST 请求——在存储前应用相同的无条件底线。UI 中会显示各分类的计数。检测 是尽力而为的模式匹配(gitleaks 风格规则 + 自定义 regex)——这是一个强大的安全 网,而非绝对的保证(参见[诚实的局限性](./docs/approval-policy.md#honest-limits))。 - **审计与回放。** 每个会话都可以在事后回放,用于审查、 事件分析或合规。会话报告可导出为 HTML/Markdown,并带有 嵌入的完整性清单(SHA-256 哈希链)。启用 `ACTRADECK_AUDIT_SIGNING_KEY` (Ed25519)可获得带有签名的、**防篡改**的报告,接收方可以验证报告在导出后未被 更改;如果没有提供密钥,清单仅包含哈希链(内部完整性)。 检测底层存储在导出_之前_的篡改不在当前范围内(已列入 roadmap)。 - **跨厂商。** 统一的事件模型和一条审计追踪记录,涵盖 Claude Code _和_ Codex,并在一个审批收件箱中展示(关于每种模式转发的内容,请参见支持矩阵 — 未来会支持更多 agent)。 - **公开的摄入契约。** 任何工具都可以规范化其自身的事件,并通过 `POST /ingest` 将其发送到同一个控制台和审计追踪中。provider 维度是一个开放的 slug,而 `event_type` 保持为封闭的 enum,以确保状态机保持有意义。请从 [`docs/ingestion-contract.md`](./docs/ingestion-contract.md) 和位于 [`docs/examples/ingest-adapter/`](./docs/examples/ingest-adapter/) 的零依赖 示例 adapter 开始。 ## 当前可用的功能 - 通过通用、规范化的事件模型,监控 **Claude Code**(通过 hooks)和 **Codex**(通过 Attach 模式下的 rollout tailing,或托管模式下的 App Server)。 - **实时会话状态** —— 运行中 / 等待审批 / 等待用户 / 停滞 / 失败 / 已完成 —— 源自分解后的心跳(进程 / 事件 / stdout / 模型流),因此“停滞”状态是基于证据展示的,而非盲目断言。 - 跨会话和 agent 的**审批收件箱**;允许 / 拒绝 / 在本次会话中允许,并为安全操作提供可选的重启持久化白名单。 - **持久化前进行机密脱敏**,UI 中显示各分类的脱敏计数。 - **会话回放**和只追加的本地事件日志。 - 通过公开摄入契约(`provider=`, `source=external`)接入的**外部 adapter**,在持久化前由后端入口进行脱敏。 ## 厂商 / 模式支持 每个 agent 获得的功能取决于您运行它的模式。Attach 模式(快速入门的 默认模式)无需改变您启动 agent 的方式;托管模式(由 ActraDeck 启动 agent)为 Codex 增加了审批转发。 | 功能 | Claude Code (Attach) | Codex (Attach) | Codex (Managed) | | ---------------------------------------------- | :------------------: | :-------------: | :-------------: | | 监控 — 状态、当前操作、diff | ✅ | ✅ | ✅ | | 持久化前脱敏 | ✅ | ✅ | ✅ | | 审计日志 + 回放 | ✅ | ✅ | ✅ | | 审批转发 — 从控制台允许 / 拒绝 | ✅ | ⛔ 仅限监控 | ✅ | 因此,在默认的 Attach 模式下,**监控、脱敏和审计现已支持跨厂商**。**审批转发** 在 Attach 模式下适用于 Claude Code;对于 Codex,则 需要托管模式 —— 使用 `./scripts/actradeck codex ""` 启动它(这是一个对 `agentmon codex -- ""` 的单命令封装),其 App Server 审批会转发到控制台(允许 / 拒绝 / 在本次会话中允许)。在 Attach 模式下,Codex 会被 监控,但其原生的审批仍在其自身的 TUI 中进行。(为简洁起见,省略了在托管模式下全部为 ✅ 的 Claude Code)。 **通过外部 adapter 接入其他 agent。** 任何第三方 CLI 都可以通过将其 事件映射到公开的摄入契约(`provider=`,`source=external`)来进行监控。 首个内置示例是 **opencode**(`docs/examples/opencode-adapter/`):一个零依赖的 opencode 插件,它将其 hooks 映射到规范化的事件模型中 —— **仅限监控**(状态、 当前操作、命令退出代码、diff、流式传输),脱敏在后端入口的底线处进行,并且它 **不** 转发审批。 | 功能 | opencode (external adapter) | | ---------------------------------------------- | :-------------------------: | | 监控 — 状态、当前操作、diff | ✅ | | 持久化前脱敏(后端底线) | ✅ | | 审计日志 + 回放 | ✅ | | 审批转发 — 从控制台允许 / 拒绝 | ⛔ 仅限监控 | ## 快速入门 只需一行命令 —— 获取源代码并启动控制台(需要 `git`、Node 22.16+ 和 pnpm;**无需 Docker**,数据库是内嵌的): ``` curl --proto '=https' --tlsv1.2 -fsSL https://raw.githubusercontent.com/actradeck/actradeck/main/scripts/install.sh | sh ``` 对于带有来源和校验和验证的发布压缩包,请使用验证失败即关闭的验证路径(需要 GitHub CLI): ``` curl --proto '=https' --tlsv1.2 -fsSL https://raw.githubusercontent.com/actradeck/actradeck/main/scripts/install.sh -o install.sh ACTRADECK_VERIFY=1 ACTRADECK_REF=v0.3.0 sh install.sh ``` 已经克隆了代码,或者更喜欢手动进行(需要 Node 22.16+ 和 pnpm —— **无需 Docker**): ``` ./scripts/quickstart # .env + embedded DB + all tiers, one command ``` 数据库是一个内嵌的 PostgreSQL (PGlite),位于 `~/.actradeck/pgdata` —— 无需 Docker,也 无需单独的服务。如果要改用外部的 Postgres(用于生产环境或现有的 DB),请在 `.env` 中设置 `DATABASE_URL`,或者运行 `ACTRADECK_DB_MODE=postgres ./scripts/quickstart` 通过 `docker compose` 启动一个实例。 ![ActraDeck 首次运行:全新克隆 → 运行控制台,录制于一台干净的环境](https://raw.githubusercontent.com/actradeck/actradeck/main/docs/media/first-run.gif) 然后通过 **http://localhost:55400** 打开控制台。在空白面板上,您可以点击 **运行 30 秒安全演示**,在配置任何内容之前,在一个一次性的会话中体验拦截 / 脱敏 / 审计 —— 然后正常运行您的 agent,无需改变它们的启动方式: ``` cd ~/any/project && claude # or: codex → shows up in the cockpit ``` `quickstart` 是幂等的,并在首次 运行时生成一个带有随机本地机密的 `.env` 文件。在 Linux 上,它会最后通过 `systemd --user` 将这四个层级守护进程化。在 macOS 上 (没有 systemd),它会停在最后一步之前,并打印出需要运行的一条命令 — `./scripts/actradeck up` —— 然后它会自动选择 supervisor:当存在 `launchctl` 时选择 **launchd LaunchAgents**,否则选择前台 supervisor。 macOS 的 LaunchAgents 在您的登录会话中运行(登录期间始终运行,并会在下次登录时自动启动);而一个完全无头、能在注销后存活的 daemon 需要 root 权限的 `LaunchDaemon`,这不在当前范围内。在既没有 systemd 也没有 launchd 的主机上, `up` 会运行一个前台 supervisor(保持终端打开;Ctrl-C 可停止它)。 更倾向于手动操作,或者遇到了问题?请参见 [`docs/getting-started.md`](./docs/getting-started.md)(手动步骤 + 故障排除)。Attach 模式的精度/限制详见 [`docs/attach-mode.md`](./docs/attach-mode.md)。 ### 或者使用 Docker 的一条命令 如果您不想安装 Node/pnpm,**控制台**(后端 + webui + 内嵌 数据库)可以从单个镜像中运行 —— 无需外部数据库,也无需构建步骤: ``` docker run --rm -p 127.0.0.1:55400:55400 ghcr.io/actradeck/actradeck:latest # 然后打开 http://localhost:55400 ``` 该容器**仅包含控制台技术栈**。用于监控您 agent 的 sidecar 会监视*宿主机*的 Claude Code / Codex 进程,因此它无法在容器内运行 — 您需要在宿主机上运行它,并通过 loopback 将其指向容器的摄入端口。 详尽的支持矩阵、确切的 `docker run` 参数、验证镜像的 cosign 签名,以及如何配置宿主机 agent,全部都在 [`docs/docker.md`](./docs/docker.md) 中。 ## 架构 ``` [Claude Code / Codex CLI / Codex App Server] │ hooks / JSON-RPC events ▼ [Local Sidecar] process monitor · stdout/stderr · git diff · secret redactor · approval bridge │ redact-before-emit → append-only local log ▼ [Ingestion API] → [Event Store + State Engine] → [Realtime WS/SSE] → [Web Cockpit] ``` 设计原则:Web UI 永远不会直接连接到本地 CLI。在 agent 的路径上,sidecar 会在任何内容被存储或发送之前对事件进行脱敏;每一个事件 — 包括通过公开摄入契约从外部 adapter 直接发送的 POST 请求 — 在后端入口存储之前,也都会通过一个无条件的脱敏底线。 - 公开摄入契约:[`docs/ingestion-contract.md`](./docs/ingestion-contract.md) - 架构决策记录:[`docs/adr/`](./docs/adr/) - 90 秒演示操作手册:[`docs/demo-90s.md`](./docs/demo-90s.md) ## 安全 持久化前进行机密脱敏是一项核心不变量,而不是一个 feature flag。如果 您认为自己发现了漏洞(脱敏绕过、审批门限 绕过、connector 中的 SSRF 等),请**不要提交公开的 issue** — 有关负责任的披露,请参见 [`SECURITY.md`](./SECURITY.md)。 ## 贡献 ActraDeck 是一个 monorepo(pnpm workspaces):包含 `apps/sidecar`、`apps/backend`、 `apps/webui` 以及共享的 `packages/`。采用 TypeScript strict 模式、conventional commits 规范, 每个 PR 都有 CI 检查。有关环境设置、本地 验证门限、PR 指南以及需要额外关注的对安全敏感区域的说明,请参见 [`CONTRIBUTING.md`](./CONTRIBUTING.md);我们期望所有参与者都能遵守我们的 [`CODE_OF_CONDUCT.md`](./CODE_OF_CONDUCT.md)。为了获得更深入的背景信息,`docs/adr/` 下的 ADR 描述了系统预期的行为方式。欢迎提交 issue 和 pull request。 ## 许可证 [Apache License 2.0](./LICENSE)。
标签:AI治理, AI编程助手, MITM代理, Web控制台, 审批网关, 密钥脱敏, 本地优先, 测试用例, 自动化攻击, 请求拦截