@dcp-ai/openclaw — 面向 OpenClaw 的 DCP 集成¶
本文是英文版的参考译文,更新于 28/10/2026。如有出入,以英文版为准。标识符、命令和代码块保持原文,不作翻译。
为 AI 代理添加 Digital Citizenship Protocol (DCP) 工具的 OpenClaw 插件。当代理调用这些工具时,操作会被声明、进行风险评分,
并记录在与人类所有者绑定、以哈希链连接的审计轨迹中:插件不会
拦截代理的其他工具。要管控每个敏感操作,宿主必须自己拦截这些工具调用,
并在其前后调用 dcp_declare_intent / dcp_log_action。会话状态保存在内存中的 Map 里,
进程重启时会丢失。
支持的 DCP 规范¶
DCP-01 至 DCP-09,部分支持:下面的工具会创建采用这些规范形式的记录,
dcp_verify_bundle 会验证 bundle。它并未完整实现这些规范。
功能¶
- 身份(DCP-01) — 生成 Ed25519 密钥对、Responsible Principal Record、Agent Passport
- 意图声明(DCP-02) — 在敏感操作之前进行风险评分并给出策略决定,由宿主执行
- 审计轨迹(DCP-03) — 带证据引用、以哈希链连接的操作记录:可发现篡改(被修改的条目会破坏链),并非不可变,且保存在内存中
- 生命周期(DCP-05) — 启用代理、报告活力、停用代理
- 继承(DCP-06) — 带继任者偏好和记忆分类的数字遗嘱
- 委托(DCP-09) — 创建委托授权,将权限从人转移给代理
- bundle 验证 — V2 Signed Bundle 由 SDK 的
verifySignedBundleV2在运营方的验证器策略下验证(签名、哈希、会话绑定、审计链、密钥有效性) - bundle 签名 — 在会话结束时构建并签名 CitizenshipBundle:一个意图及其策略决定,加上会话的审计条目(见风险评分下的说明)
- DCP-05 至 DCP-09 的记录 — 启用、活力、停用、遗嘱和授权的记录保存在会话状态中;
dcp_sign_bundle不会把它们加入 bundle,插件也不会把它们发送到任何地方 - SKILL.md — 教代理如何使用 DCP 工具的配套技能
安装¶
已发布到 npm(2026 年 10 月 26 日)。 @dcp-ai/openclaw 2.1.0 的标签为 latest,依赖 @dcp-ai/sdk ^2.2.0。以下描述的功能已可从 npm 获取。
请从 2.0.0 升级: 该版本仅检查 V2 结构,不验证签名。请使用 2.1.0 获取修复后的验证器、准入和来源监管功能。见 SECURITY.md。
所有软件包版本见 npm 发布清单。
如需使用检出源码进行开发,请构建并安装本地软件包:
git clone https://github.com/dcp-ai-protocol/dcp-ai.git
cd dcp-ai/integrations/openclaw
npm ci && npm run build
# then, in your project (or OpenClaw plugins directory):
npm install /path/to/dcp-ai/integrations/openclaw
加入 OpenClaw 配置:
注册的工具¶
| 工具 | 说明 | DCP 规范 |
|---|---|---|
dcp_identity_setup |
生成密钥对 + RPR + AgentPassport | DCP-01 |
dcp_declare_intent |
声明意图,获取策略决定(approve/escalate/block) | DCP-02 |
dcp_verify_bundle |
用 SDK 验证器验证 Signed Bundle(签名 + 哈希 + 会话绑定) | VERIFICATION |
dcp_log_action |
将操作记录为以哈希链连接的 AuditEntry | DCP-03 |
dcp_get_audit_trail |
获取会话审计轨迹 | DCP-03 |
dcp_commission_agent |
启用代理(生命周期 → commissioned) | DCP-05 |
dcp_report_vitality |
报告活力指标,获取计算出的评分 | DCP-05 |
dcp_decommission_agent |
停用代理(graceful/immediate/emergency) | DCP-05 |
dcp_create_testament |
创建带继任者偏好的数字遗嘱 | DCP-06 |
dcp_create_mandate |
创建从人到代理的委托授权 | DCP-09 |
dcp_sign_bundle |
根据会话状态构建并签名 CitizenshipBundle | BUNDLE |
使用流程¶
┌─────────────────────────────────────────────────────┐
│ Session Start │
│ dcp_identity_setup(owner, jurisdiction, caps) │
└──────────────────────┬──────────────────────────────┘
│
┌────────────▼─────────────┐
│ For each sensitive │
│ action: │
│ │
│ 1. dcp_declare_intent() │
│ → approve/escalate/ │
│ block │
│ │
│ 2. [perform action] │
│ │
│ 3. dcp_log_action() │
└────────────┬─────────────┘
│ (repeat)
┌────────────▼─────────────┐
│ Session End │
│ dcp_sign_bundle() │
│ → SignedBundle │
└───────────────────────────┘
架构¶
integrations/openclaw/
├── package.json # Dependencies: @dcp-ai/sdk, @sinclair/typebox
├── tsconfig.json
├── SKILL.md # Companion skill with agent instructions
├── README.md # This file
└── src/
├── index.ts # Plugin entry — registerTool() calls
├── tools/
│ ├── identity.ts # dcp_identity_setup
│ ├── intent.ts # dcp_declare_intent
│ ├── verify.ts # dcp_verify_bundle
│ ├── audit.ts # dcp_log_action + dcp_get_audit_trail
│ ├── lifecycle.ts # dcp_commission_agent + dcp_report_vitality + dcp_decommission_agent
│ ├── succession.ts # dcp_create_testament
│ └── delegation.ts # dcp_create_mandate
└── state/
└── agent-state.ts # Per-session DCP state management
bundle 验证¶
策略:由运营方设置,由模型收紧¶
dcp_verify_bundle 的验证器策略属于运营方:除非宿主通过 register(api, { verifierPolicy }) 或 configureVerifier({ verifierPolicy }) 设置其他策略,否则就是 SDK 的 DEFAULT_VERIFIER_POLICY(在默认策略之上设置字段;不带 risk_overrides 的 default_mode 适用于所有风险等级;未知字段或错误类型会抛出异常)。
import register, { configureVerifier } from '@dcp-ai/openclaw';
configureVerifier({ verifierPolicy: { default_mode: 'hybrid_required', require_audience_binding: true, verifier_id: 'my-service' } });
工具的 verifier_policy 参数由调用它的模型设置,因此只能让该策略更严格:default_mode 会将每个风险等级至少提升到该模式(classical_only < hybrid_preferred < hybrid_required;pq_only 与任何其他模式组合得到 hybrid_required,因为 pq_only 省去了其他模式要求的经典签名),require_session_binding 和 require_composite_binding 只能开启,allow_v1_bundles 只能关闭。任何其他字段都是错误。
检查哪些内容¶
- V2:使用
@dcp-ai/sdk的verifySignedBundleV2,配合 Ed25519 / ML-DSA-65 / SLH-DSA-192f 注册表和上述策略。它检查工件载荷哈希和清单;会话绑定、到期和已签名的会话开始时间(session_issued_at);委托人用 RPR 的binding_keys对清单所做的 bundle 签名,以及必须与之一致的未签名signature块;每个工件自己的签名;验证模式,即护照risk_tier的策略模式与意图和策略决定的安全等级模式两者中更严格的一个(spec §14.2);PQ 检查点;工件间一致性(护照状态、RPR 到期、各工件和审计条目中只有一个代理、委托人和意图);审计哈希链(使用@dcp-ai/sdk2.2.0 时只有 SHA-256;当你的锁定文件解析到@dcp-ai/sdk2.2.1 或更高版本时,也会检查存在的 V2-11 二级 SHA3-256 字段);以及密钥有效性、kid 推导和规范 base64 密钥(spec/VERIFICATION.mdV2-1 至 V2-14)。 - V1(一个 Ed25519 签名):仅当 VERIFICATION.md 的 V2-10 会接受纯经典 bundle 时,才用
verifySignedBundle验证:allow_v1_bundles为 true,并且 V1 护照risk_tier的策略模式与 V1 意图及策略决定的安全等级模式(V1 的risk_score在 0 到 1 之间,乘以 1000;缺失时按elevated处理)两者中更严格的一个是classical_only或hybrid_preferred。在默认策略下,routine 或 standard 的 V1 意图可以通过;支付、敏感数据、高预估影响或不低于 0.5 的风险评分会被拒绝。 - 无法识别版本的 bundle 会被拒绝。
对 V1 bundle 只应用 allow_v1_bundles、模式和等级:受众绑定、会话到期和时长限制、不含 Ed25519 的
accepted_classical_algs 以及拒绝 Ed25519 的公告都是 V2 检查,通过模式检查的 V1 bundle 即使设置了它们也会被接受。
如果你需要这些控制,请设置
allow_v1_bundles: false,或使用受信任的委托人配合 strict-v1 配置文件。
结果包含验证器的 errors 和 warnings、resolved_tier(安全等级),对 V2 还有 verification_mode。agent_id、human_id 和 session_nonce 只对已验证的 bundle 返回。
“已验证”意味着什么¶
已验证的 bundle 在内部一致,并由它自己列出的密钥签名:bundle 签名用 RPR 的 binding_keys,代理的工件用护照密钥。它不能证明委托人是谁:任何人都可以生成密钥并创建一个声称任意 human_id 的 RPR。为此请配置受信任的委托人(下一节)。已验证的 bundle 也可能在会话过期前被重放;运营方策略中带 verifier_id 的 require_audience_binding(bundle 的 manifest.intended_verifier 必须指向它)以及 require_session_expiry / max_session_duration_seconds 会限制这一点,但不会使其只能使用一次。
受信任的委托人与 strict-v1¶
import { configureVerifier, denyListRevocationSource } from '@dcp-ai/openclaw';
configureVerifier({
trustedPrincipals: trustSet, // or () => trust set, read on every call
profile: { profile: 'strict-v1', verifier_id: 'agent-gateway' },
revocationSource: denyListRevocationSource({ url: 'https://revocation.acme.example/.well-known/dcp-revocations.json' }),
});
使用 trustedPrincipals 时,结果会增加 admitted、principal_trust、profile、profile_compliance、codes、recorded_decision、trust_set_version 和 action_authorized(始终为 false),并且只对通过准入的 bundle 给出代理和委托人(docs/ADMISSION.md、spec/profiles/admission)。verified 保持其含义,即验证器的判定。在配置文件下,模型的 verifier_policy 参数会被拒绝,即使是更严格的也一样,工具未定义的参数(信任集、受众、吊销快照)会被忽略。遇到矛盾(带 verifierPolicy 的配置文件,或没有受信任的委托人或吊销来源的配置文件)时,configureVerifier 抛出 AdmissionConfigError 并保留之前的配置。抛出异常或返回 undefined、null 或无效信任集的 trustedPrincipals 函数会得到 admitted: false,原因在 errors 中;工具不会抛出异常。可运行示例:examples/strict-v1.mjs。
测试会运行 tests/interop/v2/bundle_vectors.json 中的每个用例,每个都在运营方策略及其 verifier_policy_overrides 下进行。
监管信任来源¶
import { configureVerifier, createSourceSupervisor } from '@dcp-ai/openclaw';
const supervisor = createSourceSupervisor({ maxInFlight: 16 });
configureVerifier({
trustedPrincipals: ({ tenant, signal }) => loadTrustSet(tenant, { signal }),
sourceSupervisor: supervisor,
supervise: { trustTimeoutMs: 2000 },
});
期限、容量和范围。
- 函数接收
{ tenant, signal }。在trustTimeoutMs(1 到 2147483647 的整数)之后到达的信任集不会被使用,到达时以单调时钟测量。此时调用得到与失败来源相同的admitted: false(The trusted principals are unavailable (TRUST_SOURCE_FAILED))。 - 最多同时运行
maxInFlight个调用,没有队列。只有当函数真正完成时才会释放位置:永不完成的来源会一直占用其位置,直到进程重启。 - 容量按监管器对象计算,可以共享由
@dcp-ai/express创建的监管器,无论 ESM 还是 CJS。 - 没有其他待处理工作的 Node 进程会一直存活,直到期限给出答复。
- 在 strict-v1 配置文件下,
supervise: { revocation: true }会在同一监管器下运行revocationSource,以revocationTimeoutMs为期限(此时为 1 到 2147483647 的整数)。supervise接受trustTimeoutMs、revocation: true或两者,revocation: true也适用于静态信任集。 - 来源接收
(subjects, { tenant, signal }),每个答案给出的结果与不监管时相同。 null、失败、超时、没有空闲位置以及已关闭的监管器都会得到带codes: ["REVOCATION_UNAVAILABLE"]的admitted: false。REVOCATION_INVALID只在期限之前才算数。- 信任和吊销调用共享监管器的位置。
- 当监管器的
signal中止时,denyListRevocationSource也会中止其 fetch。 - 没有它时,吊销与以前一样使用
revocationTimeoutMs。
重新配置。
configureVerifier可以在使用新的信任集、配置文件、期限或来源选择时保留同一个监管器:其计数器保持不变,调用保留开始时的期限。- 当它会替换或移除一个仍有进行中调用的监管器时(无论该监管器监管哪个来源),它会抛出
AdmissionConfigError(CONFIG_PROFILE_CONTRADICTION)并保留之前的配置。调用从executeVerifyBundle开始的那一刻起就算数,因此在它仍在验证 bundle、尚未调用来源时也算数,其位置一直算到来源完成为止。即使supervisor.close({ drainMs })在仍有调用进行中时已经返回,也是如此:关闭会拒绝新调用,但不会释放任何位置。请在supervisor.stats().inFlight为 0 时替换它,或重启进程。 - 模型的参数无法设置其中任何一项。
取消。
- 此版本的监管器还提供取消能力,由
@dcp-ai/express的cancelOnDisconnect使用。 dcp_verify_bundle没有这样的选项:它的宿主不会给出调用方已离开的信号,configureVerifier({ cancelOnDisconnect })会作为未知选项抛出异常。- 为兼容旧软件包的监管器,
stats().cancelled在类型中是可选的:请按?? 0读取。
它不做的事。 与 @dcp-ai/express 中的限制相同:
- 它不会停止函数的工作,不限制函数自行启动的工作,也不隔离观察者或来源的 CPU;
onSourceEvent必须很快;一次只有一个调用,其余的会被丢弃并计数。它返回的 promise 或 thenable 会像Promise.resolve那样被同化,因此以待定 promise 完成的 thenable 会让它保持忙碌。thenable 启动但不返回的 promise 无法触及。- 计数器在
Number.MAX_SAFE_INTEGER处停止。
概念映射:OpenClaw → DCP¶
| OpenClaw 概念 | DCP 对应物 |
|---|---|
| 所有者(人) | ResponsiblePrincipalRecord |
| 代理会话 | AgentPassport(能力由允许的工具映射而来) |
| 工具调用 | Intent(action_type 由工具名推导) |
| 工具允许列表/拒绝列表 | PolicyDecision |
| DM 配对 | HumanConfirmation |
| 代理操作 | 以哈希链连接的 AuditEntry |
OpenClaw 工具 → DCP 操作类型映射¶
| OpenClaw 工具 | DCP action_type |
DCP channel |
|---|---|---|
browser.* |
browse |
web |
exec, bash |
execute_code |
runtime |
web.fetch, web.search |
api_call |
api |
write, edit, apply_patch |
write_file |
filesystem |
sessions_send |
api_call |
api |
cron, webhook |
api_call |
api |
风险评分¶
意图声明工具根据以下内容计算风险评分:
- 操作类型 — 支付和代码执行的评分高于浏览
- 预估影响 — 低 / 中 / 高
- 数据类别 — 个人数据、凭据和财务数据会提高评分
策略决定:
- approve(风险 < 500)— 正常进行
- escalate(500 ≤ 风险 < 800)— 请人确认
- block(风险 ≥ 800)— 操作被拒绝,需要显式覆盖
评分是 0 到 1000 的千分风险整数(工具答复中为 risk: 650/1000)。决定只是给代理的建议:
插件中没有任何东西会阻止被升级或被阻止的操作,也不会阻止从未声明的操作。
dcp_sign_bundle 取一个意图(其 intent_id,或最近的一个)以及会话的全部审计条目。验证器要求每个审计条目都带有
bundle 的 intent_id,因此在多个意图下记录了操作的会话,会生成被 verifySignedBundleV2 拒绝的 bundle;该工具不会按
意图拆分 bundle。
以编程方式使用¶
这些工具也可以不经 OpenClaw 插件系统直接使用:
import {
executeIdentitySetup,
executeDeclareIntent,
executeLogAction,
executeGetAuditTrail,
} from '@dcp-ai/openclaw';
// Set up identity
const identity = await executeIdentitySetup({
session_id: 'my-session',
owner_name: 'Alice',
jurisdiction: 'US',
});
// Declare intent
const intent = await executeDeclareIntent({
session_id: 'my-session',
action_type: 'api_call',
target_channel: 'api',
estimated_impact: 'low',
});
// Log action
await executeLogAction({
session_id: 'my-session',
intent_id: intent.intent_id,
outcome: 'API call succeeded',
evidence_tool: 'web.fetch',
});
// Get audit trail
const trail = await executeGetAuditTrail({ session_id: 'my-session' });
console.log(trail.entries);
依赖项¶
@dcp-ai/sdk— DCP TypeScript SDK(类型、加密、构建器、签名器、验证器)@sinclair/typebox— JSON Schema 类型构建器(OpenClaw 用于工具参数)
许可证¶
Apache-2.0