UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

157 lines (156 loc) 6.72 kB
import { p as readStringValue } from "./string-coerce-mnp54Vah.js"; import { y as resolveStateDir } from "./paths-mvMm5bYV.js"; import { p as resolveUserPath } from "./utils-CCC-BEJH.js"; import { t as DEFAULT_AGENT_ID, u as normalizeAgentId } from "./session-key-B_NoIfpX.js"; import { n as resolveDefaultAgentWorkspaceDir } from "./workspace-default-B3AjhIK3.js"; import path from "node:path"; //#region src/agents/agent-dir-registry.ts /** Process-local reverse registry from prepared agent directories to agent ids. */ const agentIdByDir = /* @__PURE__ */ new Map(); function normalizeAgentDirKey(agentDir, env = process.env) { return path.resolve(resolveUserPath(agentDir, env)); } /** Register a resolved agent directory for later reverse lookup. */ function registerResolvedAgentDir(params) { agentIdByDir.set(normalizeAgentDirKey(params.agentDir, params.env), normalizeAgentId(params.agentId)); } /** Resolve the agent id previously registered for an agent directory. */ function resolveRegisteredAgentIdForDir(agentDir, env) { return agentIdByDir.get(normalizeAgentDirKey(agentDir, env)); } //#endregion //#region src/agents/agent-scope-config.ts /** Resolves configured agent ids, directories, workspaces, and merged agent defaults. */ let defaultAgentWarned = false; function warnMultipleDefaultAgents() { import("./subsystem-Ck78B-rV.js").then(({ createSubsystemLogger }) => { createSubsystemLogger("agent-scope").warn("Multiple agents marked default=true; using the first entry as default."); }).catch(() => void 0); } /** Strip null bytes from paths to prevent ENOTDIR errors. */ function stripNullBytes(s) { return s.replaceAll("\0", ""); } /** Lists valid configured agent entries from config. */ function listAgentEntries(cfg) { const list = cfg.agents?.list; if (!Array.isArray(list)) return []; return list.filter((entry) => entry !== null && typeof entry === "object"); } /** Lists unique configured agent ids, falling back to the default agent id. */ function listAgentIds(cfg) { const agents = listAgentEntries(cfg); if (agents.length === 0) return [DEFAULT_AGENT_ID]; const seen = /* @__PURE__ */ new Set(); const ids = []; for (const entry of agents) { const id = normalizeAgentId(entry?.id); if (seen.has(id)) continue; seen.add(id); ids.push(id); } return ids.length > 0 ? ids : [DEFAULT_AGENT_ID]; } /** Resolves the default agent id, warning once when multiple defaults exist. */ function resolveDefaultAgentId(cfg) { const agents = listAgentEntries(cfg); if (agents.length === 0) return DEFAULT_AGENT_ID; const defaults = agents.filter((agent) => agent?.default); if (defaults.length > 1 && !defaultAgentWarned) { defaultAgentWarned = true; warnMultipleDefaultAgents(); } const chosen = (defaults[0] ?? agents[0])?.id?.trim(); return normalizeAgentId(chosen || "main"); } function resolveAgentEntry(cfg, agentId) { const id = normalizeAgentId(agentId); return listAgentEntries(cfg).find((entry) => normalizeAgentId(entry.id) === id); } /** Resolves merged config for one agent id. */ function resolveAgentConfig(cfg, agentId) { const entry = resolveAgentEntry(cfg, normalizeAgentId(agentId)); if (!entry) return; const agentDefaults = cfg.agents?.defaults; return { name: readStringValue(entry.name), workspace: readStringValue(entry.workspace), agentDir: readStringValue(entry.agentDir), model: typeof entry.model === "string" || entry.model && typeof entry.model === "object" ? entry.model : void 0, thinkingDefault: entry.thinkingDefault, verboseDefault: entry.verboseDefault ?? agentDefaults?.verboseDefault, reasoningDefault: entry.reasoningDefault, fastModeDefault: entry.fastModeDefault, contextInjection: entry.contextInjection, bootstrapMaxChars: entry.bootstrapMaxChars, bootstrapTotalMaxChars: entry.bootstrapTotalMaxChars, experimental: typeof entry.experimental === "object" && entry.experimental ? { ...agentDefaults?.experimental, ...entry.experimental } : agentDefaults?.experimental, skills: Array.isArray(entry.skills) ? entry.skills : void 0, memorySearch: entry.memorySearch, humanDelay: entry.humanDelay, tts: entry.tts, contextLimits: typeof entry.contextLimits === "object" && entry.contextLimits ? { ...agentDefaults?.contextLimits, ...entry.contextLimits } : agentDefaults?.contextLimits, heartbeat: entry.heartbeat, identity: entry.identity, groupChat: entry.groupChat, subagents: typeof entry.subagents === "object" && entry.subagents ? entry.subagents : void 0, runRetries: typeof entry.runRetries === "object" && entry.runRetries ? { ...agentDefaults?.runRetries, ...entry.runRetries } : agentDefaults?.runRetries, embeddedAgent: typeof entry.embeddedAgent === "object" && entry.embeddedAgent ? entry.embeddedAgent : void 0, sandbox: entry.sandbox, tools: entry.tools }; } function resolveAgentContextLimits(cfg, agentId) { const defaults = cfg?.agents?.defaults?.contextLimits; if (!cfg || !agentId) return defaults; return resolveAgentConfig(cfg, agentId)?.contextLimits ?? defaults; } function resolveAgentWorkspaceDir(cfg, agentId, env = process.env) { const id = normalizeAgentId(agentId); const configured = resolveAgentConfig(cfg, id)?.workspace?.trim(); if (configured) return stripNullBytes(resolveUserPath(configured, env)); const defaultAgentId = resolveDefaultAgentId(cfg); const fallback = cfg.agents?.defaults?.workspace?.trim(); if (id === defaultAgentId) { if (fallback) return stripNullBytes(resolveUserPath(fallback, env)); return stripNullBytes(resolveDefaultAgentWorkspaceDir(env)); } if (fallback) return stripNullBytes(path.join(resolveUserPath(fallback, env), id)); const stateDir = resolveStateDir(env); return stripNullBytes(path.join(stateDir, `workspace-${id}`)); } function resolveAgentDir(cfg, agentId, env = process.env) { const id = normalizeAgentId(agentId); const configured = resolveAgentConfig(cfg, id)?.agentDir?.trim(); if (configured) { const agentDir = resolveUserPath(configured, env); registerResolvedAgentDir({ agentId: id, agentDir, env }); return agentDir; } const root = resolveStateDir(env); const agentDir = path.join(root, "agents", id, "agent"); registerResolvedAgentDir({ agentId: id, agentDir, env }); return agentDir; } function resolveDefaultAgentDir(cfg, env = process.env) { return resolveAgentDir(cfg, resolveDefaultAgentId(cfg), env); } //#endregion export { resolveAgentDir as a, resolveDefaultAgentId as c, resolveAgentContextLimits as i, registerResolvedAgentDir as l, listAgentIds as n, resolveAgentWorkspaceDir as o, resolveAgentConfig as r, resolveDefaultAgentDir as s, listAgentEntries as t, resolveRegisteredAgentIdForDir as u };