UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

144 lines (143 loc) • 7.98 kB
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs"; import { o as resolveUserPath } from "./home-dir-Dc6nN6HB.mjs"; import "./src-CdRlGRnW.mjs"; import { t as expectDefined } from "./expect-lbe3Hgrh.mjs"; import { a as writeRuntimeJson, r as defaultRuntime } from "./runtime-DlO3PTAd.mjs"; import { n as sanitizeTerminalText } from "./safe-text-SY_CvCi3.mjs"; import { p as shortenHomePath } from "./utils-DgZn2dLu.mjs"; import { t as formatErrorMessage } from "./errors-O33D01XW.mjs"; import { t as formatCliCommand } from "./command-format-DwEdrDKL.mjs"; import { t as ExpectedCliError } from "./failure-output-gtb9zaTk.mjs"; import { t as quoteCliArg } from "./quote-cli-arg-BEt71TUh.mjs"; import { n as normalizeAgentId, r as normalizeAgentIdStrict } from "./agent-id-D1-Q6vR4.mjs"; import { d as resolveAgentWorkspaceDir, g as resolveDefaultAgentId } from "./agent-scope-config-CDYpzA0r.mjs"; import "./session-key-C09ow4h0.mjs"; import { i as listAgentIds, n as listAgentEntries } from "./agent-roster-BXD1uMJD.mjs"; import { t as applyImplicitAgentRosterDefaults } from "./implicit-agent-roster-D39ONJLa.mjs"; import "./agent-scope-CG17uXFn.mjs"; import { r as replaceConfigFile } from "./mutate-DJq1JylX.mjs"; import "./config-DLycWFvB.mjs"; import "./workspace-bootstrap-policy-CPdXB_so.mjs"; import "./workspace-BHjQqjjT.mjs"; import { a as loadAgentIdentityFromWorkspaceAsync, r as loadAgentIdentityFromFile } from "./identity-file-DQ9_U4uO.mjs"; import { t as applyAgentConfig } from "./agents.config-CEaxMlw1.mjs"; import { r as logConfigUpdated } from "./logging-BBc-wU1i.mjs"; import { r as requireValidConfigForWrite } from "./config-validation-BnPsZc0_.mjs"; import path from "node:path"; //#region src/commands/agents.commands.identity.ts const normalizeWorkspacePath = (input) => path.resolve(resolveUserPath(input)); function failAgentIdentity(message) { throw new ExpectedCliError({ message, humanOutput: message, machineOutput: message }); } function resolveAgentIdByWorkspace(cfg, workspaceDir) { const list = listAgentEntries(cfg); const ids = list.length > 0 ? list.map((entry) => normalizeAgentId(entry.id)) : [resolveDefaultAgentId(cfg)]; const normalizedTarget = normalizeWorkspacePath(workspaceDir); return ids.filter((id) => normalizeWorkspacePath(resolveAgentWorkspaceDir(cfg, id)) === normalizedTarget); } async function agentsSetIdentityCommand(opts, runtime = defaultRuntime) { const writeSnapshot = await requireValidConfigForWrite(runtime); if (!writeSnapshot) return; const cfg = applyImplicitAgentRosterDefaults(writeSnapshot.snapshot.sourceConfig); const nameRaw = normalizeOptionalString(opts.name); const emojiRaw = normalizeOptionalString(opts.emoji); const themeRaw = normalizeOptionalString(opts.theme); const avatarRaw = normalizeOptionalString(opts.avatar); const hasExplicitIdentity = Boolean(nameRaw || emojiRaw || themeRaw || avatarRaw); const identityFileRaw = normalizeOptionalString(opts.identityFile); const workspaceRaw = normalizeOptionalString(opts.workspace); const wantsIdentityFile = Boolean(opts.fromIdentity || identityFileRaw || !hasExplicitIdentity); const normalizedAgent = opts.agent === void 0 ? null : normalizeAgentIdStrict(opts.agent); if (normalizedAgent && !normalizedAgent.ok) failAgentIdentity(`Agent "${opts.agent}" not found. Create it with \`openclaw agents add\`.`); let agentId = normalizedAgent?.value; let identityFilePath; let workspaceDir; let workspaceLocatorDir; if (identityFileRaw) { identityFilePath = normalizeWorkspacePath(identityFileRaw); workspaceDir = path.dirname(identityFilePath); } else if (workspaceRaw) { workspaceLocatorDir = normalizeWorkspacePath(workspaceRaw); workspaceDir = workspaceLocatorDir; } else if (agentId && wantsIdentityFile) workspaceDir = resolveAgentWorkspaceDir(cfg, agentId); else if (wantsIdentityFile || !agentId) workspaceDir = path.resolve(process.cwd()); if (!agentId) { const resolvedWorkspace = expectDefined(workspaceDir, "agent workspace"); const matches = resolveAgentIdByWorkspace(cfg, resolvedWorkspace); if (matches.length === 0) failAgentIdentity(`No agent workspace matches ${shortenHomePath(resolvedWorkspace)}. Pass --agent to target a specific agent.`); if (matches.length > 1) failAgentIdentity(`Multiple agents match ${shortenHomePath(resolvedWorkspace)}: ${matches.join(", ")}. Pass --agent to choose one.`); agentId = matches[0]; } const resolvedAgentId = expectDefined(agentId, "agent id"); if (!listAgentIds(cfg).map((id) => normalizeAgentId(id)).includes(resolvedAgentId)) failAgentIdentity(`Agent "${resolvedAgentId}" not found. Create it with \`openclaw agents add\`.`); let identityFromFile = null; if (wantsIdentityFile) { if (identityFilePath) try { identityFromFile = await loadAgentIdentityFromFile(identityFilePath); } catch (error) { failAgentIdentity(formatErrorMessage(error)); } else if (workspaceDir) identityFromFile = await loadAgentIdentityFromWorkspaceAsync(workspaceDir); if (!identityFromFile) { const targetPath = identityFilePath ?? (workspaceDir ? path.join(workspaceDir, "IDENTITY.md") : "IDENTITY.md"); failAgentIdentity(`No identity data found in ${shortenHomePath(targetPath)}.`); } } const fileTheme = identityFromFile?.theme ?? identityFromFile?.creature ?? identityFromFile?.vibe ?? void 0; const incomingIdentity = { ...nameRaw || identityFromFile?.name ? { name: nameRaw ?? identityFromFile?.name } : {}, ...emojiRaw || identityFromFile?.emoji ? { emoji: emojiRaw ?? identityFromFile?.emoji } : {}, ...themeRaw || fileTheme ? { theme: themeRaw ?? fileTheme } : {}, ...avatarRaw || identityFromFile?.avatar ? { avatar: avatarRaw ?? identityFromFile?.avatar } : {} }; const nextConfig = applyAgentConfig(cfg, { agentId: resolvedAgentId, identity: incomingIdentity }); const committed = await replaceConfigFile({ ...writeSnapshot, sourceConfig: nextConfig, writeOptions: { ...writeSnapshot.writeOptions, allowConfigSizeDrop: true } }); const committedEntry = expectDefined(listAgentEntries(committed.nextConfig).find((entry) => normalizeAgentId(entry.id) === resolvedAgentId), "committed agent config"); const committedIdentity = expectDefined(committedEntry.identity, "committed agent identity"); const storedWorkspaceDir = resolveAgentWorkspaceDir(committed.nextConfig, resolvedAgentId); const identitySourceDir = identityFromFile ? workspaceDir : void 0; const locatorDiffers = workspaceLocatorDir !== void 0 && normalizeWorkspacePath(workspaceLocatorDir) !== normalizeWorkspacePath(storedWorkspaceDir); const identitySourceDiffers = identitySourceDir !== void 0 && normalizeWorkspacePath(identitySourceDir) !== normalizeWorkspacePath(storedWorkspaceDir); if (opts.json) { writeRuntimeJson(runtime, { agentId: resolvedAgentId, identity: committedIdentity, workspace: workspaceDir ?? null, storedWorkspace: storedWorkspaceDir, identityFile: identityFilePath ?? null }); return; } logConfigUpdated(runtime); runtime.log(`Agent: ${sanitizeTerminalText(resolvedAgentId)}`); for (const [field, label] of [ ["name", "Name"], ["theme", "Theme"], ["emoji", "Emoji"], ["avatar", "Avatar"] ]) { const value = committedIdentity[field]; if (value) runtime.log(`${label}: ${sanitizeTerminalText(value)}`); } runtime.log(`Workspace: ${sanitizeTerminalText(shortenHomePath(storedWorkspaceDir))}`); if (locatorDiffers && workspaceLocatorDir) { runtime.log(`Workspace locator: ${sanitizeTerminalText(shortenHomePath(workspaceLocatorDir))}`); runtime.log(`Stored workspace unchanged. Relocate with ${formatCliCommand(`openclaw config set agents.entries.${resolvedAgentId}.workspace ${quoteCliArg(workspaceLocatorDir)}`)}.`); } else if (identitySourceDiffers && identitySourceDir) runtime.log(`Identity source: ${sanitizeTerminalText(shortenHomePath(identitySourceDir))}`); } //#endregion export { agentsSetIdentityCommand };