openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
135 lines (134 loc) • 8.08 kB
JavaScript
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 };