CLI: approve latest pending device request

This commit is contained in:
Mariano Belinky
2026-02-17 14:08:04 +00:00
parent cc359d338e
commit b114c82701
3 changed files with 152 additions and 6 deletions

View File

@@ -13,6 +13,7 @@ type DevicesRpcOpts = {
password?: string;
timeout?: string;
json?: boolean;
latest?: boolean;
device?: string;
role?: string;
scope?: string[];
@@ -86,6 +87,17 @@ function parseDevicePairingList(value: unknown): DevicePairingList {
};
}
function selectLatestPendingRequest(pending: PendingDevice[] | undefined) {
if (!pending?.length) {
return null;
}
return pending.reduce((latest, current) => {
const latestTs = typeof latest.ts === "number" ? latest.ts : 0;
const currentTs = typeof current.ts === "number" ? current.ts : 0;
return currentTs > latestTs ? current : latest;
});
}
function formatTokenSummary(tokens: DeviceTokenSummary[] | undefined) {
if (!tokens || tokens.length === 0) {
return "none";
@@ -172,15 +184,31 @@ export function registerDevicesCli(program: Command) {
devices
.command("approve")
.description("Approve a pending device pairing request")
.argument("<requestId>", "Pending request id")
.action(async (requestId: string, opts: DevicesRpcOpts) => {
const result = await callGatewayCli("device.pair.approve", opts, { requestId });
.argument("[requestId]", "Pending request id")
.option("--latest", "Approve the most recent pending request", false)
.action(async (requestId: string | undefined, opts: DevicesRpcOpts) => {
let resolvedRequestId = requestId?.trim();
if (!resolvedRequestId || opts.latest) {
const listResult = await callGatewayCli("device.pair.list", opts, {});
const latest = selectLatestPendingRequest(parseDevicePairingList(listResult).pending);
resolvedRequestId = latest?.requestId?.trim();
}
if (!resolvedRequestId) {
defaultRuntime.error("No pending device pairing requests to approve");
defaultRuntime.exit(1);
return;
}
const result = await callGatewayCli("device.pair.approve", opts, {
requestId: resolvedRequestId,
});
if (opts.json) {
defaultRuntime.log(JSON.stringify(result, null, 2));
return;
}
const deviceId = (result as { device?: { deviceId?: string } })?.device?.deviceId;
defaultRuntime.log(`${theme.success("Approved")} ${theme.command(deviceId ?? "ok")}`);
defaultRuntime.log(
`${theme.success("Approved")} ${theme.command(deviceId ?? "ok")} ${theme.muted(`(${resolvedRequestId})`)}`,
);
}),
);