












@@ -8,6 +8,10 @@ import {
88resolveNodeFromNodeList,
99type NodeMatchCandidate,
1010} from "openclaw/plugin-sdk/gateway-runtime";
11+import {
12+parseStrictFiniteNumber,
13+parseStrictPositiveInteger,
14+} from "openclaw/plugin-sdk/infra-runtime";
1115import { defaultRuntime } from "openclaw/plugin-sdk/runtime";
1216import {
1317normalizeLowercaseStringOrEmpty,
@@ -87,13 +91,29 @@ function parseTimeoutMs(raw: unknown): number | undefined {
8791if (raw === undefined || raw === null) {
8892return undefined;
8993}
90-const value =
91-typeof raw === "number" || typeof raw === "bigint"
92- ? Number(raw)
93- : typeof raw === "string" && raw.trim()
94- ? Number.parseInt(raw.trim(), 10)
95- : Number.NaN;
96-return Number.isFinite(value) ? value : undefined;
94+return parseStrictPositiveInteger(raw);
95+}
96+97+function parseCanvasPositiveIntOption(raw: string | undefined, flag: string): number | undefined {
98+if (!raw) {
99+return undefined;
100+}
101+const parsed = parseStrictPositiveInteger(raw);
102+if (parsed === undefined) {
103+throw new Error(`${flag} must be a positive integer.`);
104+}
105+return parsed;
106+}
107+108+function parseCanvasFiniteNumberOption(raw: string | undefined, flag: string): number | undefined {
109+if (!raw) {
110+return undefined;
111+}
112+const parsed = parseStrictFiniteNumber(raw);
113+if (parsed === undefined) {
114+throw new Error(`${flag} must be a number.`);
115+}
116+return parsed;
97117}
9811899119function parseNodeCandidates(raw: unknown): CanvasNodeCandidate[] {
@@ -249,8 +269,8 @@ export function registerNodesCanvasCommands(nodes: Command, deps: CanvasCliDepen
249269.action(async (opts: CanvasNodesRpcOpts) => {
250270await deps.runNodesCommand("canvas snapshot", async () => {
251271const format = parseCanvasSnapshotRequestFormat(opts.format);
252-const maxWidth = opts.maxWidth ? Number.parseInt(opts.maxWidth, 10) : undefined;
253-const quality = opts.quality ? Number.parseFloat(opts.quality) : undefined;
272+const maxWidth = parseCanvasPositiveIntOption(opts.maxWidth, "--max-width");
273+const quality = parseCanvasFiniteNumberOption(opts.quality, "--quality");
254274const raw = await invokeCanvas(deps, opts, "canvas.snapshot", {
255275 format,
256276maxWidth: Number.isFinite(maxWidth) ? maxWidth : undefined,
@@ -287,10 +307,10 @@ export function registerNodesCanvasCommands(nodes: Command, deps: CanvasCliDepen
287307.action(async (opts: CanvasNodesRpcOpts) => {
288308await deps.runNodesCommand("canvas present", async () => {
289309const placement = {
290-x: opts.x ? Number.parseFloat(opts.x) : undefined,
291-y: opts.y ? Number.parseFloat(opts.y) : undefined,
292-width: opts.width ? Number.parseFloat(opts.width) : undefined,
293-height: opts.height ? Number.parseFloat(opts.height) : undefined,
310+x: parseCanvasFiniteNumberOption(opts.x, "--x"),
311+y: parseCanvasFiniteNumberOption(opts.y, "--y"),
312+width: parseCanvasFiniteNumberOption(opts.width, "--width"),
313+height: parseCanvasFiniteNumberOption(opts.height, "--height"),
294314};
295315const params: Record<string, unknown> = {};
296316if (opts.target) {
此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。