Cordis
底板的五个规矩
Cordis 是 vendored 的插件框架。dsh 没有内核可以打补丁:你要做的是把插件挂到旁边。
- 1
插件就是一块积木
一块积木可以是函数,也可以是 Service 子类。它有名字,有 apply(ctx),有时还有 inject 清单。
A plugin implements Service. Function plugins export inject + apply(ctx);class plugins 在构造里 super(ctx, name) 立刻注册。
- 2
上下文是公共置物架
谁把大脑放到架子上,别人就拿 ctx.llm,不必 import 具体老师。
Context 是服务仓库。稳定键:ctx.tools、ctx.llm、ctx.sessions。依赖服务名而不是实现。
- 3
inject 是等待朋友到齐
你说『我需要工具柜』,底板就等工具柜出现再让你上场。不用自己排队。
Load order is expressed through service requirements, not manual boot sequencing.
- 4
事件是喊话方式
广播、传纸条、全班一起做、排队发言——四种喊法,合同里写死。
emit / waterfall / parallel / serial。waterfall 是 around-middleware:listener 收 (...args, next)。
- 5
登记都是可逆的
把积木拔掉,它在置物架上留的东西、它听过的喊声,都会消失。
Registrations via ctx.effect() 或 ctx.on()。fiber 卸载时 unwind。没有需要打补丁的特权内核。
四种喊话
| 模式 | 等待? | 顺序 | 返回值 | 小孩版 |
|---|---|---|---|---|
| emit | 否 | 注册顺序观察 | 无 | 广播:谁爱听谁听,不能否决。 |
| waterfall | 否(但绕行) | 洋葱,从外到内 | 有 | 必须喊 next() 把纸传下去,否则就是你做主。 |
| parallel | 是 | 一起跑 | 无 | 全班同时做同一件事,比如把日记刷到磁盘。 |
| serial | 是 | 一个接一个 | 有 | 排队发言,没有 next()。turn-stopping 就是这种。 |
Waterfall 像洋葱
不喊 next() 就是自己做主。agent/pre-step、agent/request、llm/stream、tools/* 都是这种洋葱。
储物柜不是水龙头
scope · 储物柜
每人一个柜子,外套挂在自己的钩上。不是围栏。
dsh-scope 按 agent 划分注册层。把注册限定到一个 agent,用的是 agent.ctx。
isolate · 自己的水龙头
这间教室的饮水机不是大厅那台。同名服务可以另有一份。
isolate(name, label) 给子上下文另一份同名服务。agent preset 靠它换衣服。