


















11import type { ConnectParams } from "../../packages/gateway-protocol/src/index.js";
22import type { OpenClawConfig } from "../config/types.openclaw.js";
3+import {
4+normalizeNodeApprovalSurfaceList,
5+sameNodeApprovalSurfaceSet,
6+sameNodePermissionSurface,
7+} from "../infra/node-pairing-surface.js";
38import type {
49NodePairingPairedNode,
510NodePairingRequestInput,
611RequestNodePairingResult,
712} from "../infra/node-pairing.js";
8-import { normalizeArrayBackedTrimmedStringList } from "../shared/string-normalization.js";
913import {
1014normalizeDeclaredNodeCommands,
1115resolveNodeCommandAllowlist,
@@ -33,27 +37,6 @@ function resolveApprovedReconnectCommands(params: {
3337});
3438}
353936-function normalizeApprovalSurfaceList(value: readonly string[] | undefined): string[] {
37-return normalizeArrayBackedTrimmedStringList(value) ?? [];
38-}
39-40-function sameApprovalSurfaceSet(
41-left: readonly string[] | undefined,
42-right: readonly string[] | undefined,
43-): boolean {
44-const normalizedLeft = new Set(normalizeApprovalSurfaceList(left));
45-const normalizedRight = new Set(normalizeApprovalSurfaceList(right));
46-if (normalizedLeft.size !== normalizedRight.size) {
47-return false;
48-}
49-for (const entry of normalizedLeft) {
50-if (!normalizedRight.has(entry)) {
51-return false;
52-}
53-}
54-return true;
55-}
56-5740function normalizePermissionMap(
5841value: Record<string, boolean> | undefined,
5942): Record<string, boolean> | undefined {
@@ -66,31 +49,12 @@ function normalizePermissionMap(
6649return entries.length > 0 ? Object.fromEntries(entries) : undefined;
6750}
685169-function samePermissions(
70-left: Record<string, boolean> | undefined,
71-right: Record<string, boolean> | undefined,
72-): boolean {
73-const leftEntries = Object.entries(left ?? {}).toSorted(([leftKey], [rightKey]) =>
74-leftKey.localeCompare(rightKey),
75-);
76-const rightEntries = Object.entries(right ?? {}).toSorted(([leftKey], [rightKey]) =>
77-leftKey.localeCompare(rightKey),
78-);
79-if (leftEntries.length !== rightEntries.length) {
80-return false;
81-}
82-return leftEntries.every(([key, value], index) => {
83-const rightEntry = rightEntries[index];
84-return rightEntry !== undefined && rightEntry[0] === key && rightEntry[1] === value;
85-});
86-}
87-8852function intersectApprovalSurfaceList(params: {
8953approved: readonly string[] | undefined;
9054declared: readonly string[];
9155}): string[] {
92-const approved = new Set(normalizeApprovalSurfaceList(params.approved));
93-return normalizeApprovalSurfaceList(params.declared).filter((entry) => approved.has(entry));
56+const approved = new Set(normalizeNodeApprovalSurfaceList(params.approved));
57+return normalizeNodeApprovalSurfaceList(params.declared).filter((entry) => approved.has(entry));
9458}
95599660function intersectPermissionSurface(params: {
@@ -158,7 +122,7 @@ export async function reconcileNodePairingOnConnect(params: {
158122 : [],
159123allowlist: pairingAllowlist,
160124});
161-const declaredCaps = normalizeApprovalSurfaceList(params.connectParams.caps);
125+const declaredCaps = normalizeNodeApprovalSurfaceList(params.connectParams.caps);
162126const declaredPermissions = normalizePermissionMap(params.connectParams.permissions);
163127164128if (!params.pairedNode) {
@@ -192,11 +156,14 @@ export async function reconcileNodePairingOnConnect(params: {
192156pairedCommands: params.pairedNode.commands,
193157allowlist: runtimeAllowlist,
194158});
195-const approvedCaps = normalizeApprovalSurfaceList(params.pairedNode.caps);
159+const approvedCaps = normalizeNodeApprovalSurfaceList(params.pairedNode.caps);
196160const approvedPermissions = normalizePermissionMap(params.pairedNode.permissions);
197161const hasCommandUpgrade = declared.some((command) => !approvedCommands.includes(command));
198-const hasCapabilityChange = !sameApprovalSurfaceSet(params.pairedNode.caps, declaredCaps);
199-const hasPermissionChange = !samePermissions(params.pairedNode.permissions, declaredPermissions);
162+const hasCapabilityChange = !sameNodeApprovalSurfaceSet(params.pairedNode.caps, declaredCaps);
163+const hasPermissionChange = !sameNodePermissionSurface(
164+params.pairedNode.permissions,
165+declaredPermissions,
166+);
200167const effectiveApprovedDeclaredCaps = intersectApprovalSurfaceList({
201168approved: approvedCaps,
202169declared: declaredCaps,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。