一门面向 AI Agent 的安全脚本语言:能力门控、最小特权、确定性执行。
Leash 把安全和可控作为核心设计目标——就像给 AI Agent 拴上一根"牵绳"(leash),限制其能力范围,防止越权行为。程序默认没有任何权限——读文件、访问环境、调用 AI 模型等所有副作用都必须通过宿主显式注入的"能力(capability)"完成,并且每一步都被审计。这让 AI Agent 可以在严格受限的沙箱中自主运行,同时仍拥有完成任务所需的工具。
配套提供三种编辑器:
- leash-studio:Vim 风格终端编辑器(零依赖 C++17,单文件实现)
- leash-studio-qt:基于 Qt/QScintilla 的图形编辑器(Xcode 风格)
- leash-studio-pro:Electron + Monaco + React IDE(主力推荐)
- 能力安全模型:默认零权限;副作用全部走宿主注入的能力,未授权即被拒绝。
- 最小特权 / 审计:每一次能力调用都被记录,作用域可静态追踪。
- 确定性:无隐式并发、无未授权时钟;运行时按 fuel 限制步数、限制内存与递归深度。
- 缩进式语法:类 Python 的缩进代码块,易读、无括号噪音。
- 内置包:
file/os/ai/time/random/crypto/http/re/json/gui,开箱即用。 - 多文件模块:
import "xxx.ae"递归收集、去重、环检测。 - 多款编辑器:终端版(零依赖单文件 C++)、Qt 图形版、Electron 版。
make # 构建 leash 编译器
./leash examples/hello.ae # 运行示例预期输出:
Leash 语言 — 安全 Agent 脚本
hello world!
x + y = 50
| 命令 | 作用 |
|---|---|
make |
构建 leash(编译器)与 leash-studio(终端编辑器) |
make run |
运行 ./leash examples/hello.ae |
make run-ide |
启动 ./leash-studio |
make clean |
清除 obj/ 与二进制文件 |
make studio-qt |
构建 Qt 图形版 leash-studio-qt(Xcode 风格) |
终端编辑器无外部依赖:
g++ -std=c++17 -O2 -o leash-studio studio/src/minivim.cpp
构建要求:支持 C++17 的 g++ / clang++。
hello.ae:
fn main
let name = "world"
out("hello " + name)
let x = 42
let y = 8
out("x + y = {x + y}")
运行:
./leash hello.ae要点:
- 代码块用缩进表示(同 Python),不要写
{ }。 - 打印用
out("..."),括号内是字符串表达式;{expr}做字符串插值。 //或#是行注释。
下面这些"看起来像 C/Python"的写法在本语言里是无效的,已被实测验证:
| 易错点 | 正确写法 | 错误写法 |
|---|---|---|
| 代码块 | 缩进(无 { }) |
fn f() { ... } ❌ |
| 打印 | out("字符串") |
out -> "..." ❌ / out "..." ❌ |
| 注释 | // 或 # 行注释 |
— |
| 多文件引用 | import "math.ae"(带引号路径) |
import math ❌ |
package 暴露的函数 |
裸全局名 append(...) / env(...) / chat(...) |
file.append(...) ❌ |
| 函数返回类型 | fn add(a: int, b: int) -> int |
— |
已支持:
- 变量:
let x = 1/let mut x = 1(仅mut可重赋值)。 - 控制流:
if/else/while/break/continue(均为缩进块)。 - 函数:
fn 名称(参数) -> 返回类型,return返回值。支持递归。 - 运算符:
+ - * / %;比较== != < > <= >=;逻辑and or not;字符串拼接+;字符串字典序比较。 - 字符串插值:
"你 {x + 1} 岁"({expr}内为任意表达式)。 - 切片:
s[1:3]/s[i:j],边界可为算术表达式或len()。 - 映射遍历:
for k, v in m;列表/字符串遍历:for i, e in xs。 - 注释:
//和#均支持行注释,#c第一行等效于-c编译模式。 - 模块:多文件
import "xxx.ae",跨文件函数按名字解析。 - 能力安全:
requires cap声明所需能力;@fuel(N)步数上限、@timeout(Nms)超时熔断、@deterministic禁止非确定源。 - 入口:
fn main(无参数;out由宿主注入)。
设计稿里更多高级语法(
match、泛型、agent/tool/chain原语等)见语法.txt,但当前编译器大多未实现,使用前请先用./leash跑通验证。
通过 package X 引入,提供裸全局函数(直接用名字调用):
- core(自动注入):
sqrt/pow/floor/ceil/round/abs/parse/stringify - file:
read/write/exists/delete/append - os:
env/exit/cwd/is_tty - ai:
chat(无 API key 时返回 mock 结果) - time:
now/sleep - random:
int(lo,hi)/float()/choice(xs) - crypto:
sha256 - http:
get(url)/post(url, body) - re:
ismatch/find - json(自动注入):
parse/stringify - gui:
gui_available/gui_open_file/gui_save_file/gui_message/gui_input/gui_confirm
标准库:lib/ 下有 116+ 个纯 Leash 包 + 原生包(math / string / list / csvx / toml / yaml / httpx 等)。
LangChain 风格框架包(纯 Leash 实现,mock 可跑):promptx / memory / outputx / llmx / chainx / toolx / agent / textx / embedx / vector / retriever / ragx / ui。
import "相对路径.ae" 会递归收集依赖并去重、检测环。跨文件函数按名字直接调用。参见 examples/multifile/。
// main.ae
import "math.ae"
import "text.ae"
package file
fn main
out(section("多文件协同报告"))
let n = 100
let primes = primes_upto(n)
out("1.." + n + " 之间共有 " + count(primes) + " 个质数")
Vim 风格终端编辑器,零依赖单文件 C++17,增量渲染、语法高亮、CJK 兼容。
| 类别 | 按键 |
|---|---|
| 移动 | h j k l / 方向键、w 词后、b 词前、0 行首、$ 行尾、gg 文件头、G 文件尾 |
| 插入 | i a I A o O + Esc |
| 编辑 | x 删字符、dd 删行、yy 复制行、p/P 粘贴、u 撤销、Ctrl+Y 重做 |
| 搜索 | / 向下、? 向上、n 下一处、N 上一处 |
| 文件 | Ctrl+S 保存、Ctrl+O 打开、Ctrl+N 新建、Ctrl+R 运行、Ctrl+Q 退出 |
| 命令模式 | :w :q :wq :e <文件> :run :N(跳转行) |
Electron + Monaco + React IDE,主力推荐。
cd leash-studio-pro
npm install
npm run dev| 快捷键 | 功能 |
|---|---|
Ctrl+S |
保存当前文件 |
Ctrl+W |
关闭当前标签 |
Ctrl+N |
新建文件 |
Ctrl+O |
打开文件或文件夹 |
Ctrl+滚轮 |
编辑器缩放 |
- TitleBar:窗口标题 + 最小化/最大化/关闭
- ActivityBar(左侧):文件浏览 / 源码管理 / 设置
- Explorer:文件树,支持新建/重命名/删除,Seti 风格文件图标
- Editor:Monaco 编辑器,Leash 语法高亮,实时诊断(红色波浪线标记错误行号)
- 预览:
.svg/.png/.jpg/.gif/.md等文件自动以预览模式打开 - Output:运行输出面板
- StatusBar:光标位置、运行状态
- Mintlify 风格:白色底色、
#18E299绿色强调
Makefile 构建脚本(编译器 + 各版编辑器)
语法.txt 语法设计稿(参考,非实现清单)
AGENTS.md AI 编程助手工作约定
教程/ 完整教程
light/ TextMate 语法包(各语言高亮定义)
src/ 编译器源码
frontend/ lexer / parser
checker/ typecheck
codegen/ compiler(字节码)
vm/ 虚拟机
host/ 宿主能力(file/os/ai 等)
main.cpp 入口 + 多文件 assemble()
studio/ 终端编辑器源码
examples/ 示例程序
leash-studio-pro/ Electron + Monaco + React IDE
src/renderer/ React 前端
components/ UI 组件
fileIcons/ Seti 文件图标系统
lang-leash/ Monarch tokenizer + 语言加载
themes/ Monaco 主题
src/main/ Electron 主进程
public/icons/ UI 图标
native/ N-API 原生插件
lib/ 标准库(116+ 包)
icons/ VS Code 风格图标集
- 完整教程:
教程/目录(主教程、标准库详解、实例分析、Agent 专论、包制作)。 - 语法设计稿:
语法.txt(能力类型、agent/tool/chain原语等未来特性)。 - 示例:
examples/下可直接./leash examples/<名称>.ae运行。 - 标准库文档:
教程/标准库详解.md
约定:与本仓库交互、提交信息、文档一律尽量使用中文。