LLM-native 原生工具
不是给人类的工具套一层 API。
不是「给工具加个 API」的问题。人类工具的每一条交互假设,放在 LLM 身上都不成立。
所以六合线做的不是「更强的工具」,而是三套补偿机制 + 一条会交还的任务线。
不是画给投资人看的示意图。索引里存的是符号、引用和文件依赖——nodes、edges、cycles,可以查询、可以算影响面。
默认档不需要记忆 44 个工具名。只读快查全部收进 code_query:
{
"nodes": [ ... ],
"edges": [ ... ],
"cycles": [
["resolve.js", "parse.js"]
]
}
动态调用、反射、跨语言引用不可见——这是静态分析边界,写在每次返回的 limitations 里,不装作全知。
宁可如实说“看不见”,也不让模型基于一张假图做决策。
五步主链、四个回退环、六个侧出口。每一步都写明走到了哪个 node,下一步由 next_action 给出。
做任何事前,先知道自己在哪、能读什么、影响多大。
每一个都能预览、留证据、可撤销;失败不会自动变成「完成」。
跨文件事务与 undo,同时属于 classic 44——目录逐字节冻结,所以刻意不改。
下面每个箭头都是实际会发生的调用。中间有一次失败的检查、一次修复和一次重验——没有一步靠模型自认为完成。
没有 read_ref 就不给写;文件在中间被外部改过,会直接 VERSION_CONFLICT,不静默覆盖。
测试失败后 progress 仍是 partial,next_action 指回同一个检查范围——先修,再证明。
next_action:null + host_required:工具宣布「机械要求已满足」,业务是否达标由宿主判断。
「完成」不是一个感觉,是一个可以检查的投影。所有状态机汇成同一个只读结论,按固定优先级取值——第一个命中的就是事实。
从上往下,第一个命中的状态就是当前事实。只读,不可写。
这四行是合同,不是文案:next_action:null 表示工具侧没有下一步;是否真的达成业务目标,工具不替你盖章。
测试全绿也不算完成——完成态由 audit 驱动。仅当审计证据适用于当前 goal 和文件时,才进入 awaiting_decision。
12 套状态机落在工作区里,每次调用重新投影。上下文被截断、会话被重开,任务也不会丢——这是「无记忆」真正的补法。
journal 与委派账本主要用于崩溃对账与幂等;其余状态都会出现在 LLM 拿到的响应字段里。
入口可以很少,是因为复杂度被放到了它该在的地方:状态落盘、索引与解析在进程外。
MCP 进程崩了,任务不会跟着丢。重启后按 journal 对账,能恢复就恢复,不能就标 indeterminate。
tree-sitter 跑在 Rust 服务里,panic 被 catch_unwind 兜住,返回错误码而不是带走整个 MCP 进程。
写锁 + 批次锁 + 原子写。sql.js 后端下第二个写进程会被明确拒绝,而不是悄悄覆盖。
六合线不是把任务画成一张图。任务侧只有 route、node 和每次现算的 next_action,没有持久化的边;真正的图在代码侧——{nodes, edges, cycles}。这个区分我们写进文档,不混着说。
三个档位是并列目录,不是包含关系。全部纯正则 / AST 实现,零 LLM 调用。
工具目录每一轮都会随上下文重发。先算这笔账,再谈吞吐。
结论有点反直觉:砍描述最多只能省 0.6k。要降目录税只能砍参数面——这就是 13 个入口把 44 个工具的 schema 收进来的意义。
同一脚本化路径,非宿主对照,非 agentic 对话结果。
code_batch 把 N 处编辑收进一次调用(全有或全无)。 逐处改,每一轮都要重发系统提示、工具目录、对话历史和已读文件;批量改只发一次—— 少 N−1 轮,乘的是整段上下文,不是目录税——也少 N−1 次模型往返的等待。
不需要构建产物。clone、装依赖,把 MCP 客户端指向它。
# 1) 克隆 git clone https://github.com/wulun811/LiuHe.git # 2) 安装(含 better-sqlite3) cd LiuHe/malong && npm ci # 3) 启动 MCP server node --max-old-space-size=512 mcp-server.js \ --workspace /path/to/project
{
"mcp": {
"malong": {
"type": "local",
"command": ["node", "--max-old-space-size=512",
"malong/mcp-server.js",
"--workspace", "."],
"enabled": true
}
}
}