UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

106 lines (105 loc) 4.4 kB
import { n as formatByteSize } from "./format-CgMRsTCK.js"; import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { d as readPositiveIntegerParam } from "./common-Bm6UTDDA.js"; import { t as callGatewayTool } from "./gateway-CB9m4Gcq.js"; import { i as resolveNodeIdFromList, t as listNodes } from "./nodes-utils-CL3pooh5.js"; import "./number-runtime-Cy4drVnh.js"; import "./string-coerce-runtime-GQa0ehRA.js"; import "./agent-harness-runtime-BqXbkhGi.js"; import "./param-readers-BElxWJzG.js"; import { t as appendFileTransferAudit } from "./audit-Cw95_l64.js"; import crypto from "node:crypto"; //#region extensions/file-transfer/src/shared/params.ts function readGatewayCallOptions(params) { const opts = {}; if (typeof params.gatewayUrl === "string" && params.gatewayUrl.trim()) opts.gatewayUrl = params.gatewayUrl.trim(); if (typeof params.gatewayToken === "string" && params.gatewayToken.trim()) opts.gatewayToken = params.gatewayToken.trim(); opts.timeoutMs = readPositiveIntegerParam(params, "timeoutMs"); return opts; } function readTrimmedString(params, key) { return normalizeOptionalString(params[key]) ?? ""; } function readClampedInt(params) { const requested = readPositiveIntegerParam(params.input, params.key) ?? params.defaultValue; return Math.max(params.hardMin, Math.min(requested, params.hardMax)); } function humanSize(bytes) { return formatByteSize(bytes, { style: "legacy-binary", maxUnit: "mega", separator: " ", fractionDigits: (_value, unit) => unit === "byte" ? null : unit === "kilo" ? 1 : 2 }); } //#endregion //#region extensions/file-transfer/src/shared/errors.ts function throwFromNodePayload(operation, payload) { const code = typeof payload.code === "string" ? payload.code : "ERROR"; const message = typeof payload.message === "string" ? payload.message : `${operation} failed`; const canonical = typeof payload.canonicalPath === "string" ? ` (canonical=${payload.canonicalPath})` : ""; throw new Error(`${operation} ${code}: ${message}${canonical}`); } //#endregion //#region extensions/file-transfer/src/tools/node-tool-invoke.ts function readRequiredNodePath(params) { const node = readTrimmedString(params, "node"); const requestedPath = readTrimmedString(params, "path"); if (!node) throw new Error("node required"); if (!requestedPath) throw new Error("path required"); return { node, requestedPath }; } async function invokeNodeToolPayload(input) { const gatewayOpts = readGatewayCallOptions(input.params); const nodes = await listNodes(gatewayOpts); if (nodes.length === 0) throw new Error("no paired nodes available; file-transfer tools require a paired node from nodes status. Use local file/exec tools for local workspace paths."); const nodeId = resolveNodeIdFromList(nodes, input.node, false); const nodeDisplayName = nodes.find((n) => n.nodeId === nodeId)?.displayName ?? input.node; const startedAt = Date.now(); const raw = await callGatewayTool("node.invoke", gatewayOpts, { nodeId, command: input.command, params: input.commandParams, idempotencyKey: crypto.randomUUID() }); const payload = raw?.payload && typeof raw.payload === "object" && !Array.isArray(raw.payload) ? raw.payload : null; if (!payload) { await appendFileTransferAudit({ op: input.command, nodeId, nodeDisplayName, requestedPath: input.requestedPath, decision: "error", errorMessage: input.invalidPayloadMessage ?? "invalid payload", durationMs: Date.now() - startedAt, ...input.errorAuditExtra }); throw new Error(input.invalidPayloadError ?? `invalid ${input.command} payload`); } if (payload.ok === false || input.requireOk === true && payload.ok !== true) { await appendFileTransferAudit({ op: input.command, nodeId, nodeDisplayName, requestedPath: input.requestedPath, canonicalPath: typeof payload.canonicalPath === "string" ? payload.canonicalPath : void 0, decision: "error", errorCode: typeof payload.code === "string" ? payload.code : void 0, errorMessage: typeof payload.message === "string" ? payload.message : void 0, durationMs: Date.now() - startedAt, ...input.errorAuditExtra }); throwFromNodePayload(input.command, payload); } return { nodeDisplayName, nodeId, payload, startedAt }; } //#endregion export { readClampedInt as i, readRequiredNodePath as n, humanSize as r, invokeNodeToolPayload as t };