import { randomUUID } from "node:crypto"; import { callGateway } from "../gateway/call.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../gateway/protocol/client-info.js"; import type { PluginRuntime } from "./runtime/types.js"; export function createPluginCliGatewayNodesRuntime(): PluginRuntime["nodes"] { return { async list(params) { const payload = await callGateway({ method: "node.list", params: {}, clientName: GATEWAY_CLIENT_NAMES.CLI, mode: GATEWAY_CLIENT_MODES.CLI, }); const nodes = Array.isArray(payload?.nodes) ? payload.nodes : []; const filteredNodes = params?.connected === true ? nodes.filter( (node) => node !== null && typeof node === "object" && (node as { connected?: unknown }).connected === true, ) : nodes; return { nodes: filteredNodes as Awaited>["nodes"], }; }, async invoke(params) { return await callGateway({ method: "node.invoke", params: { nodeId: params.nodeId, command: params.command, ...(params.params !== undefined && { params: params.params }), timeoutMs: params.timeoutMs, idempotencyKey: params.idempotencyKey || randomUUID(), }, timeoutMs: params.timeoutMs ? params.timeoutMs + 5_000 : undefined, clientName: GATEWAY_CLIENT_NAMES.CLI, mode: GATEWAY_CLIENT_MODES.CLI, }); }, }; }