Telo SDK (Node.js)
Node.js SDK为Telo模块提供了创作界面。它定义了模块用来插入内核的共享契约(类型和生命周期接口),因此模块代码在各个实现之间保持一致。
它提供了什么
- 模块接口 用于注册资源和处理执行。
- 上下文类型 用于访问内核、注册表和事件。
- 共享基元 Telo模块和工具使用的。
何时使用它
在构建或扩展Telo模块时使用SDK。它不是内核本身; 它是保持模块行为一致和可预测的契约层。
错误
Telo区分了两种类型的失败 Invocable / Runnable:
- 操作故障 ——纯
Error或者RuntimeError投掷。传播到内核的基础设施层 (HTTP → Fastify 5xx,序列 → 冒泡)。这些表示bug或环境故障。 - 域失败 - - - - - -
InvokeError投掷。邀请人公共合同的一部分。上的路由处理程序匹配error.code通过catches:条目;序列处理它们try/catch.
import { InvokeError, isInvokeError } from "@telorun/sdk";
// In a controller:
throw new InvokeError("UNAUTHORIZED", "Token missing or invalid", {
reason: "expired",
});
// Anywhere a thrown value crosses a boundary:
if (isInvokeError(err)) {
// err.code, err.message, err.data
}
使用 isInvokeError(err) 为了识别——它是双领域安全的(幸免于pnpm提升拆分,注册表加载模块带有自己的SDK副本,以及未来的沙盒隔离)。 instanceof InvokeError 跨包边界不可靠。
抛出的控制器 InvokeError 必须 声明它们的代码 Telo.Definition:
kind: Telo.Definition
metadata: { name: VerifyToken }
capability: Telo.Invocable
throws:
codes:
UNAUTHORIZED: { description: Missing or invalid token. }
EXPIRED:
description: Token is past its expires_at.
data:
type: object
properties:
expiredAt: { type: string, format: date-time }
required: [expiredAt]
未声明的代码发出 ${kind}.${name}.InvokeRejected.Undeclared 可观察性事件-分析器静态捕获这些事件。
传播而不是产生代码的作曲家可以声明:
throws:
inherit: true # union of everything I call (requires x-telo-step-context)
# or
passthrough: true # union is whatever my inputs.code resolves to (Run.Throw-style)
inherit 由分析器的数据流传递驱动 x-telo-step-context 数组; 未来的作曲家通过声明注释和 inherit: true. 看到 模块/跑步/ docs / structured-errors.md 对于端到端流。