跳到正文

Cordis

底板的五个规矩

Cordis 是 vendored 的插件框架。dsh 没有内核可以打补丁:你要做的是把插件挂到旁边。

  1. 1

    插件就是一块积木

    一块积木可以是函数,也可以是 Service 子类。它有名字,有 apply(ctx),有时还有 inject 清单。

    A plugin implements Service. Function plugins export inject + apply(ctx);class plugins 在构造里 super(ctx, name) 立刻注册。

  2. 2

    上下文是公共置物架

    谁把大脑放到架子上,别人就拿 ctx.llm,不必 import 具体老师。

    Context 是服务仓库。稳定键:ctx.tools、ctx.llm、ctx.sessions。依赖服务名而不是实现。

  3. 3

    inject 是等待朋友到齐

    你说『我需要工具柜』,底板就等工具柜出现再让你上场。不用自己排队。

    Load order is expressed through service requirements, not manual boot sequencing.

  4. 4

    事件是喊话方式

    广播、传纸条、全班一起做、排队发言——四种喊法,合同里写死。

    emit / waterfall / parallel / serial。waterfall 是 around-middleware:listener 收 (...args, next)。

  5. 5

    登记都是可逆的

    把积木拔掉,它在置物架上留的东西、它听过的喊声,都会消失。

    Registrations via ctx.effect() 或 ctx.on()。fiber 卸载时 unwind。没有需要打补丁的特权内核。

四种喊话

模式等待?顺序返回值小孩版
emit注册顺序观察广播:谁爱听谁听,不能否决。
waterfall否(但绕行)洋葱,从外到内必须喊 next() 把纸传下去,否则就是你做主。
parallel一起跑全班同时做同一件事,比如把日记刷到磁盘。
serial一个接一个排队发言,没有 next()。turn-stopping 就是这种。

Waterfall 像洋葱

外层监听器:可改写或短路
中层:必须 next() 才能往下
内核:真正干活的人

不喊 next() 就是自己做主。agent/pre-step、agent/request、llm/stream、tools/* 都是这种洋葱。

储物柜不是水龙头

scope · 储物柜

每人一个柜子,外套挂在自己的钩上。不是围栏。

dsh-scope 按 agent 划分注册层。把注册限定到一个 agent,用的是 agent.ctx。

isolate · 自己的水龙头

这间教室的饮水机不是大厅那台。同名服务可以另有一份。

isolate(name, label) 给子上下文另一份同名服务。agent preset 靠它换衣服。