openclaw/src/plugin-sdk/approval-native-helpers.ts

79 lines
2.7 KiB
TypeScript

import type { ExecApprovalSessionTarget } from "../infra/exec-approval-session-target.js";
import { resolveApprovalRequestOriginTarget } from "../infra/exec-approval-session-target.js";
import type { ExecApprovalRequest } from "../infra/exec-approvals.js";
import type { PluginApprovalRequest } from "../infra/plugin-approvals.js";
import type { OpenClawConfig } from "./config-runtime.js";
type ApprovalRequest = ExecApprovalRequest | PluginApprovalRequest;
type ApprovalKind = "exec" | "plugin";
type ApprovalResolverParams = {
cfg: OpenClawConfig;
accountId?: string | null;
approvalKind?: ApprovalKind;
request: ApprovalRequest;
};
type NativeApprovalTarget = {
to: string;
threadId?: string | number | null;
};
export function createChannelNativeOriginTargetResolver<TTarget>(params: {
channel: string;
shouldHandleRequest?: (params: ApprovalResolverParams) => boolean;
resolveTurnSourceTarget: (request: ApprovalRequest) => TTarget | null;
resolveSessionTarget: (
sessionTarget: ExecApprovalSessionTarget,
request: ApprovalRequest,
) => TTarget | null;
targetsMatch: (a: TTarget, b: TTarget) => boolean;
resolveFallbackTarget?: (request: ApprovalRequest) => TTarget | null;
}) {
return (input: ApprovalResolverParams): TTarget | null => {
if (params.shouldHandleRequest && !params.shouldHandleRequest(input)) {
return null;
}
return resolveApprovalRequestOriginTarget({
cfg: input.cfg,
request: input.request,
channel: params.channel,
accountId: input.accountId,
resolveTurnSourceTarget: params.resolveTurnSourceTarget,
resolveSessionTarget: (sessionTarget) =>
params.resolveSessionTarget(sessionTarget, input.request),
targetsMatch: params.targetsMatch,
resolveFallbackTarget: params.resolveFallbackTarget,
});
};
}
export function createChannelApproverDmTargetResolver<
TApprover,
TTarget extends NativeApprovalTarget = NativeApprovalTarget,
>(params: {
shouldHandleRequest?: (params: ApprovalResolverParams) => boolean;
resolveApprovers: (params: {
cfg: OpenClawConfig;
accountId?: string | null;
}) => readonly TApprover[];
mapApprover: (approver: TApprover, params: ApprovalResolverParams) => TTarget | null | undefined;
}) {
return (input: ApprovalResolverParams): TTarget[] => {
if (params.shouldHandleRequest && !params.shouldHandleRequest(input)) {
return [];
}
const targets: TTarget[] = [];
for (const approver of params.resolveApprovers({
cfg: input.cfg,
accountId: input.accountId,
})) {
const target = params.mapApprover(approver, input);
if (target) {
targets.push(target);
}
}
return targets;
};
}