mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-19 21:21:10 +00:00
84 lines
2.4 KiB
TypeScript
84 lines
2.4 KiB
TypeScript
import type { OpenClawConfig } from "../config/config.js";
|
|
import type {
|
|
NodePairingPairedNode,
|
|
NodePairingPendingRequest,
|
|
NodePairingRequestInput,
|
|
} from "../infra/node-pairing.js";
|
|
import {
|
|
normalizeDeclaredNodeCommands,
|
|
resolveNodeCommandAllowlist,
|
|
} from "./node-command-policy.js";
|
|
import type { ConnectParams } from "./protocol/index.js";
|
|
|
|
type PendingNodePairingResult = {
|
|
status: "pending";
|
|
request: NodePairingPendingRequest;
|
|
created: boolean;
|
|
};
|
|
|
|
export type NodeConnectPairingReconcileResult = {
|
|
nodeId: string;
|
|
effectiveCommands: string[];
|
|
pendingPairing?: PendingNodePairingResult;
|
|
};
|
|
|
|
function buildNodePairingRequestInput(params: {
|
|
nodeId: string;
|
|
connectParams: ConnectParams;
|
|
commands: string[];
|
|
remoteIp?: string;
|
|
}): NodePairingRequestInput {
|
|
return {
|
|
nodeId: params.nodeId,
|
|
displayName: params.connectParams.client.displayName,
|
|
platform: params.connectParams.client.platform,
|
|
version: params.connectParams.client.version,
|
|
deviceFamily: params.connectParams.client.deviceFamily,
|
|
modelIdentifier: params.connectParams.client.modelIdentifier,
|
|
caps: params.connectParams.caps,
|
|
commands: params.commands,
|
|
remoteIp: params.remoteIp,
|
|
};
|
|
}
|
|
|
|
export async function reconcileNodePairingOnConnect(params: {
|
|
cfg: OpenClawConfig;
|
|
connectParams: ConnectParams;
|
|
pairedNode: NodePairingPairedNode | null;
|
|
reportedClientIp?: string;
|
|
requestPairing: (input: NodePairingRequestInput) => Promise<PendingNodePairingResult>;
|
|
}): Promise<NodeConnectPairingReconcileResult> {
|
|
const nodeId = params.connectParams.device?.id ?? params.connectParams.client.id;
|
|
const allowlist = resolveNodeCommandAllowlist(params.cfg, {
|
|
platform: params.connectParams.client.platform,
|
|
deviceFamily: params.connectParams.client.deviceFamily,
|
|
});
|
|
const declared = normalizeDeclaredNodeCommands({
|
|
declaredCommands: Array.isArray(params.connectParams.commands)
|
|
? params.connectParams.commands
|
|
: [],
|
|
allowlist,
|
|
});
|
|
|
|
if (!params.pairedNode) {
|
|
const pendingPairing = await params.requestPairing(
|
|
buildNodePairingRequestInput({
|
|
nodeId,
|
|
connectParams: params.connectParams,
|
|
commands: declared,
|
|
remoteIp: params.reportedClientIp,
|
|
}),
|
|
);
|
|
return {
|
|
nodeId,
|
|
effectiveCommands: declared,
|
|
pendingPairing,
|
|
};
|
|
}
|
|
|
|
return {
|
|
nodeId,
|
|
effectiveCommands: declared,
|
|
};
|
|
}
|