可选文件 convention
用 Rust 或 TypeScript 编写 CLI 命令和 Agent Tool,并隔离可选依赖。
需要本地 App 开发所述的 Engine CLI 和配套 support 包。 以下是本地已实现的路径,不是 registry 发布公告。
应用选择支持,文件才生效
App 选择 support Plugin,由它定义文件名匹配和生成逻辑。其他 Plugin 可以携带
cli.rs、Console 页面或 Agent Tool,而不强迫所有应用采用这些体验。
Engine 负责通用处理,各 support Plugin 负责具体解释。
简单 Plugin 只需要一个 Cargo.toml 或 package.json。重量级可选依赖需要独立可构建的
surface 包,通过 surfaces 元数据或 composite plugin.json 声明。
未选择的独立 surface 不解析、安装、编译或打包;已被核心导入或纳入其 Cargo workspace 的
依赖仍参与构建。仅靠文件名不能消除核心已经需要的依赖。
通用 Engine processor 支持其他语言工具,但 App 运行支持仍取决于 SDK、Adapter 和 Host 准入。
CLI 命令
lenso app create my-cli --cli
cd my-cli
lenso app dev -- hello --name Ada
# 停止开发进程后:
lenso app build
lenso app start --from dist -- hello --name Ada
Scaffold 包含 app/local.hello/cli.ts:
import { command } from '@lenso/cli';
export default command({
name: 'hello',
description: 'Say hello',
args: { name: { type: 'string', default: 'world' } },
run({ args, output }) { output.text(`Hello, ${args.name}!`); },
});
已有 App 用 lenso app add @lenso/cli 采用可执行文件自带的支持,不是 marketplace 查询。
App 本地裸目录可只放 cli.ts 或 cli.rs;可复用包应保留显式身份。
自动生成的路径身份会随重命名变化。
Rust cli.rs 可使用选中 support 提供的宏:
use lenso_cli_support::command;
/// Say hello from Rust
#[command(name = "hello-rust")]
async fn hello(#[arg(long, default = "world")] name: String)
-> anyhow::Result<String>
{
Ok(format!("Hello, {name}!"))
}
一个带宏函数生成 entry factory。参数用 FromStr 转换,Option<T> 可选,bool 为 flag。
Rust 源码需要 Cargo。程序化 command builder 和底层 terminal Provider 继续可用。
Terminal 是 Stream,请通过 App 执行,不使用仅支持 Request 的独立 plugin dev 路径。
Agent Tool
显式采用配套 Agent Tool convention support 后,可提供 agent/tools.ts:
import { tool, tools } from '@lenso/agent-tool-sdk';
import * as schema from '@lenso/agent-tool-sdk/schema';
export default tools([
tool({
name: 'greet', description: 'Greet a person.',
input: schema.object({ name: schema.string() }), output: schema.string(),
}, ({ name }) => ({ ok: true, value: `Hello, ${name}!` })),
]);
Agent 仓库拥有 packages/agent-tool-convention 和
examples/app-tools / examples/app-tools-rust 可执行示例。
Rust 用 #[lenso_agent_tool_sdk::tool_provider] 和 #[tool] 方法;
具体 SDK 依赖和生成注册方式以配套 fixture 为准。
编译生成普通 Tool provider。消费它的 Agent 仍需安装并选择 provider,显式授予 Tool 策略。 发现不会启动 Agent、选择 Model 或授权执行。本地 fixture 已通过真实 Turn 验证允许执行、 越权调用在执行前拒绝,以及移除 provider。目前证明路径使用本地 Bun Adapter 修复; 面向公开安装必须使用包含修复的发布依赖。
浏览器页面与后端 adapter 见 App Console。普通 provider / consumer 继续使用 Plugin 编写。