UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

135 lines (134 loc) 8.08 kB
import "./src-vebZIeLe.js"; import { t as expectDefined } from "./expect-CyE8FADM.js"; import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { a as writeRuntimeJson, r as defaultRuntime } from "./runtime-CF2WjnNZ.js"; import { c as resolveUserPath } from "./home-dir-BPhrG-aM.js"; import { m as shortenHomePath } from "./utils-P__uGsPB.js"; import { n as normalizeAgentId, r as normalizeAgentIdStrict } from "./agent-id-CeT3w4ap.js"; import { t as formatCliCommand } from "./command-format-C7YfyMTd.js"; import { i as listAgentEntries, m as resolveAgentWorkspaceDir, o as listAgentIds, y as resolveDefaultAgentId } from "./agent-scope-config-DcbEhP0R.js"; import "./session-key-BnWWjqNc.js"; import { t as formatErrorMessage } from "./errors-Db3Ymjlb.js"; import { n as sanitizeTerminalText } from "./safe-text-BGBqp1a4.js"; import { t as migratePersistedImplicitMainRoster } from "./legacy.roster-CQ9vDbV2.js"; import "./agent-scope-DbtJyKUL.js"; import { r as replaceConfigFile } from "./mutate-ZNN4iFCn.js"; import "./config-Cs0XXL3x.js"; import { t as ExpectedCliError } from "./failure-output-Dc5ce9_F.js"; import { t as quoteCliArg } from "./quote-cli-arg-BEt71TUh.js"; import "./workspace-ConDEamr.js"; import { n as loadAgentIdentityFromFile, r as loadAgentIdentityFromWorkspace } from "./identity-file-Dnl4bkpm.js"; import { r as logConfigUpdated } from "./logging-Idqd9ylL.js"; import { t as applyAgentConfig } from "./agents.config-CFXmxe4B.js"; import { n as requireValidConfigFileSnapshot } from "./config-validation-C1Wo5r0Q.js"; 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); } /** Update an agent identity from flags or workspace identity markdown. */ async function agentsSetIdentityCommand(opts, runtime = defaultRuntime) { const configSnapshot = await requireValidConfigFileSnapshot(runtime); if (!configSnapshot) return; const cfg = migratePersistedImplicitMainRoster(configSnapshot.sourceConfig ?? configSnapshot.config).config; const baseHash = configSnapshot.hash; 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 = loadAgentIdentityFromWorkspace(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({ nextConfig, ...baseHash !== void 0 ? { baseHash } : {} }); 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)}`); if (committedIdentity.name) runtime.log(`Name: ${sanitizeTerminalText(committedIdentity.name)}`); if (committedIdentity.theme) runtime.log(`Theme: ${sanitizeTerminalText(committedIdentity.theme)}`); if (committedIdentity.emoji) runtime.log(`Emoji: ${sanitizeTerminalText(committedIdentity.emoji)}`); if (committedIdentity.avatar) runtime.log(`Avatar: ${sanitizeTerminalText(committedIdentity.avatar)}`); 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 };