
Current 发布:为 AI agent 提供变更管控,基于 Elixir 构建
来源标题:Show HN: Current – Change control for AI agents (Elixir)
Current 是一个让 AI agent 只提交变更提案、由用户批准后才执行的变更管控工具,并用防篡改哈希链日志记录每一步。agent 全程无法直接操作,模型也拿不到仓库,只能查看目录结构并按需请求内容。目前处于早期阶段,仅支持单节点和本地项目。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Agent 提出变更。Current 负责验证这些变更,等待你的批准,再执行它们,并把每一步都记录在防篡改日志中。
一句话介绍 · 查看实际演示 ·
快速上手 · 工作原理 ·
来源追溯 ·
可复现性 ·
可验证性 ·
架构 · Intent · CLI ·
HTTP API · MCP · 配置 ·
安全 · 状态 · 路线图
为什么不直接用 Claude Code 或 Codex?当然可以。但在那里,agent 一边行动,你一边逐步批准。而在 Current 中,agent 完全不能行动。它交出一份完整的提案,在提案被批准并执行之前,什么都不会发生。
该日志采用哈希链,因此对历史记录的改动可以被检测出来,并且可以在另一台机器上从日志重建完整状态。
状态:早期阶段。单节点,本地项目。Current 不是沙箱,也不是认证系统:被批准的命令以运行时自身的权限执行。参见安全与威胁模型。
让 Current 为自带的 Next.js 示例添加 CSRF 防护:
current run "add CSRF protection to this app"
--dir examples/nextjs-auth
--model openai:gpt-5.6-sol
模型始终拿不到整个仓库。它只能看到目录结构,并按需索取所需内容,由 Current 逐个获取文件:
… 第 1 轮:模型请求查看 8 项内容
✓ read_file app/api/login/route.ts 769 B
✓ read_file lib/auth.ts 626 B
✓ read_file lib/rate-limit.ts 2.4 KB
✓ read_file tests/login.test.ts 847 B
✓ read_file tests/rate-limit.test.ts 2.3 KB
✓ read_file package.json 343 B
✓ read_file tsconfig.json 221 B
✓ read_file .gitignore 83 B
读取被限制在项目范围内。依赖、构建产物、.git 和 .env* 文件永远不会展示给模型,而且每一次读取都会被记录。
Agent 生成的提案
proposal sha256:672c4973787b…
登录路由在解析凭证之前已经调用了一个缺失的 CSRF 校验器。请实现该校验器,采用同源 Origin 检查的失败即拒绝策略,并为接受的来源和被拒绝的来源补充针对性测试。
PROPOSED
1 WriteFile lib/csrf.ts
2 WriteFile tests/csrf.test.ts
3 RunCommand npm test
4 Report Add fail-closed same-origin CSRF validation for the login
route and unit tests covering valid, absent, malformed,
and cross-origin headers.
✓ 提案已解码
✓ 提案已校验
等待批准。尚未应用任何变更。
agent 已经提出了变更。你的项目未受任何影响。
你可以审阅确切的文件和命令,或者把机器可读版本(--json)交给另一个 agent 征求第二意见:
current review sha256:672c4973787b
然后做出决定。带上反馈把它退回,模型会读取更多内容并返回一份新提案:
current revise sha256:672c4973787b -m "add a test for a missing Origin header"
或者批准它。批准会被记录,但此时还不会运行任何东西:
current approve sha256:672c4973787b -m "LGTM"
✓ Approved sha256:672c4973787b
message LGTM
尚未应用任何变更。用以下命令应用:
current apply sha256:672c4973787b
应用是独立的步骤。由 Current(而不是 agent)写入文件并运行命令:
current apply sha256:672c4973787b
✓ Proposal approved
✓ Workflow completed
MODE: APPLY
4 effects executed.
检查
current events sha256:1429719b7546
current proposal sha256:672c4973787b
current artifact sha256:fb30687f1722 (raw model output)
上述每一步——从请求、模型读取的每个文件,到它的原始回复、批准记录以及每个 effect 的输出——现在都成为该工作流记录的一部分。current events 会将其打印出来。
环境要求
Erlang/OTP 上的 Elixir 1.19(mise.toml 固定了 OTP 28.5 和 Elixir 1.19.5;如果你使用 mise,运行 mise install)
git、make 和 bash
一个 OpenAI 或 Anthropic API key
- 获取代码并构建 git clone https://github.com/santosh79/current.git cd current mix deps.get mix compile make client
- 启动运行时 在一个终端中,导出 key 并启动服务器。它监听 127.0.0.1:4000,并在每个请求和提交发生时打印出来。 export ANTHROPIC_API_KEY="..." # or OPENAI_API_KEY export CURRENT_ALLOWED_COMMANDS=npm # commands are denied unless allowlisted bin/current-server
- 发起请求
在另一个终端中,从仓库根目录执行:
export PATH="$PWD:$PATH" # puts the local
currentCLI on PATH current models # the models your keys give you MODEL="openai:gpt-5.6" # replace with a model listed above current run "add CSRF protection to this app"
--dir examples/nextjs-auth
--model $MODEL 当提案等待审阅时,run 会停止。不同模型和不同运行的输出会有所不同。如果需要一份可以审阅但永远不会被应用的提案,请用 plan 代替 run。 current review <proposal-id> current revise <proposal-id> -m "keep the route check, add edge cases" current approve <proposal-id> -m "reviewed" current apply <proposal-id> 或者用 current reject <proposal-id> -m "..." 结束工作流。修订会产生一个新的提案 ID,必须依次审阅并批准;之前的提案则作废。ID 可以缩短为至少四个十六进制字符的唯一前缀。 current events <workflow-id> # the full chain, in log order current proposal <proposal-id> # intents, claims, and what the model read current artifact <artifact-id> # exact bytes: a file, command output, a raw reply 工作原理 在典型的 agent 中,工具调用就是行动本身:模型决定写入某个文件的那一刻,文件就被写入了。而在 Current 中,模型的输出是一份提案,即一组带类型的 intent: "在 lib/signup.ex 中,把这段文本替换为那段文本";"运行 mix test";"声明测试通过,因为该命令退出码为 0" 提案本身不会做任何事。在提案与你的项目之间,运行时负责: 每一步都是一个事件。圆角框表示工作流结束的位置。 任务通过 prompt、项目目录和模型提交。 目录被解析一次为其真实路径并记录下来。 模型会获得项目的目录结构:路径和大小,不包含内容。依赖、构建产物、版本控制目录和 .env* 文件被排除在外。 模型可以回复一个 observe 请求:最多 20 个 read_file、glob 或 grep intent,每个都附有理由。运行时执行这些
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。