mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 13:11:23 +00:00
refactor(gateway): dedupe agent file request resolution
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import fs from "node:fs/promises";
|
import fs from "node:fs/promises";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import type { GatewayRequestHandlers } from "./types.js";
|
import type { GatewayRequestHandlers, RespondFn } from "./types.js";
|
||||||
import {
|
import {
|
||||||
listAgentIds,
|
listAgentIds,
|
||||||
resolveAgentDir,
|
resolveAgentDir,
|
||||||
@@ -57,6 +57,30 @@ const MEMORY_FILE_NAMES = [DEFAULT_MEMORY_FILENAME, DEFAULT_MEMORY_ALT_FILENAME]
|
|||||||
|
|
||||||
const ALLOWED_FILE_NAMES = new Set<string>([...BOOTSTRAP_FILE_NAMES, ...MEMORY_FILE_NAMES]);
|
const ALLOWED_FILE_NAMES = new Set<string>([...BOOTSTRAP_FILE_NAMES, ...MEMORY_FILE_NAMES]);
|
||||||
|
|
||||||
|
function resolveAgentWorkspaceFileOrRespondError(
|
||||||
|
params: Record<string, unknown>,
|
||||||
|
respond: RespondFn,
|
||||||
|
): {
|
||||||
|
cfg: ReturnType<typeof loadConfig>;
|
||||||
|
agentId: string;
|
||||||
|
workspaceDir: string;
|
||||||
|
name: string;
|
||||||
|
} | null {
|
||||||
|
const cfg = loadConfig();
|
||||||
|
const agentId = resolveAgentIdOrError(String(params.agentId ?? ""), cfg);
|
||||||
|
if (!agentId) {
|
||||||
|
respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "unknown agent id"));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const name = String(params.name ?? "").trim();
|
||||||
|
if (!ALLOWED_FILE_NAMES.has(name)) {
|
||||||
|
respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `unsupported file "${name}"`));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const workspaceDir = resolveAgentWorkspaceDir(cfg, agentId);
|
||||||
|
return { cfg, agentId, workspaceDir, name };
|
||||||
|
}
|
||||||
|
|
||||||
type FileMeta = {
|
type FileMeta = {
|
||||||
size: number;
|
size: number;
|
||||||
updatedAtMs: number;
|
updatedAtMs: number;
|
||||||
@@ -403,22 +427,11 @@ export const agentsHandlers: GatewayRequestHandlers = {
|
|||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const cfg = loadConfig();
|
const resolved = resolveAgentWorkspaceFileOrRespondError(params, respond);
|
||||||
const agentId = resolveAgentIdOrError(String(params.agentId ?? ""), cfg);
|
if (!resolved) {
|
||||||
if (!agentId) {
|
|
||||||
respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "unknown agent id"));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const name = String(params.name ?? "").trim();
|
const { agentId, workspaceDir, name } = resolved;
|
||||||
if (!ALLOWED_FILE_NAMES.has(name)) {
|
|
||||||
respond(
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
errorShape(ErrorCodes.INVALID_REQUEST, `unsupported file "${name}"`),
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const workspaceDir = resolveAgentWorkspaceDir(cfg, agentId);
|
|
||||||
const filePath = path.join(workspaceDir, name);
|
const filePath = path.join(workspaceDir, name);
|
||||||
const meta = await statFile(filePath);
|
const meta = await statFile(filePath);
|
||||||
if (!meta) {
|
if (!meta) {
|
||||||
@@ -465,22 +478,11 @@ export const agentsHandlers: GatewayRequestHandlers = {
|
|||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const cfg = loadConfig();
|
const resolved = resolveAgentWorkspaceFileOrRespondError(params, respond);
|
||||||
const agentId = resolveAgentIdOrError(String(params.agentId ?? ""), cfg);
|
if (!resolved) {
|
||||||
if (!agentId) {
|
|
||||||
respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "unknown agent id"));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const name = String(params.name ?? "").trim();
|
const { agentId, workspaceDir, name } = resolved;
|
||||||
if (!ALLOWED_FILE_NAMES.has(name)) {
|
|
||||||
respond(
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
errorShape(ErrorCodes.INVALID_REQUEST, `unsupported file "${name}"`),
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const workspaceDir = resolveAgentWorkspaceDir(cfg, agentId);
|
|
||||||
await fs.mkdir(workspaceDir, { recursive: true });
|
await fs.mkdir(workspaceDir, { recursive: true });
|
||||||
const filePath = path.join(workspaceDir, name);
|
const filePath = path.join(workspaceDir, name);
|
||||||
const content = String(params.content ?? "");
|
const content = String(params.content ?? "");
|
||||||
|
|||||||
Reference in New Issue
Block a user