openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
152 lines (151 loc) • 5.73 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString, s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js";
import { t as isCommandFlagEnabled } from "./commands.flags-Bx5KKfOp.js";
import { t as getChannelPlugin } from "./registry-MkxNn1Ue.js";
import "./plugins-t2ejWcVy.js";
import { n as listChatCommands, r as listChatCommandsForConfig } from "./commands-registry-list-MVYs4B-p.js";
import { n as listPluginCommands } from "./commands-D0WhGlh-.js";
import "./commands-registry-wvHlpYBK.js";
//#region src/auto-reply/command-status-builders.ts
/** Formats /help and /commands output for text and native command-list surfaces. */
const CATEGORY_LABELS = {
session: "Session",
options: "Options",
status: "Status",
management: "Management",
media: "Media",
tools: "Tools",
docks: "Docks"
};
const CATEGORY_ORDER = [
"session",
"options",
"status",
"management",
"media",
"tools",
"docks"
];
function groupCommandsByCategory(commands) {
const grouped = /* @__PURE__ */ new Map();
for (const category of CATEGORY_ORDER) grouped.set(category, []);
for (const command of commands) {
const category = command.category ?? "tools";
const list = grouped.get(category) ?? [];
list.push(command);
grouped.set(category, list);
}
return grouped;
}
/** Builds the compact slash-command help text shown by `/help`. */
function buildHelpMessage(cfg) {
const lines = ["ℹ️ Help", ""];
lines.push("Session");
lines.push(" /new | /reset | /compact [instructions] | /stop");
lines.push("");
const optionParts = [
"/think <level|default>",
"/model <id>",
"/fast status|on|off|default",
"/verbose on|off|full",
"/trace on|off|raw"
];
if (isCommandFlagEnabled(cfg, "config")) optionParts.push("/config");
if (isCommandFlagEnabled(cfg, "debug")) optionParts.push("/debug");
lines.push("Options");
lines.push(` ${optionParts.join(" | ")}`);
lines.push("");
lines.push("Status");
lines.push(" /status | /tasks | /whoami | /context");
lines.push("");
lines.push("Skills");
lines.push(" /skill <name> [input]");
lines.push("");
lines.push("More: /commands for full list, /tools for available capabilities");
return lines.join("\n");
}
const COMMANDS_PER_PAGE = 8;
function formatCommandEntry(command) {
const primary = command.nativeName ? `/${command.nativeName}` : normalizeOptionalString(command.textAliases[0]) || `/${command.key}`;
const seen = /* @__PURE__ */ new Set();
const aliases = command.textAliases.map((alias) => alias.trim()).filter(Boolean).filter((alias) => normalizeLowercaseStringOrEmpty(alias) !== normalizeLowercaseStringOrEmpty(primary)).filter((alias) => {
const key = normalizeLowercaseStringOrEmpty(alias);
if (seen.has(key)) return false;
seen.add(key);
return true;
});
return `${primary}${aliases.length ? ` (${aliases.join(", ")})` : ""}${command.scope === "text" ? " [text]" : ""} - ${command.description}`;
}
function buildCommandItems(commands, pluginCommands) {
const grouped = groupCommandsByCategory(commands);
const items = [];
for (const category of CATEGORY_ORDER) {
const categoryCommands = grouped.get(category) ?? [];
if (categoryCommands.length === 0) continue;
const label = CATEGORY_LABELS[category];
for (const command of categoryCommands) items.push({
label,
text: formatCommandEntry(command)
});
}
for (const command of pluginCommands) {
const pluginLabel = command.pluginId ? ` (${command.pluginId})` : "";
items.push({
label: "Plugins",
text: `/${command.name}${pluginLabel} - ${command.description}`
});
}
return items;
}
function formatCommandList(items) {
const lines = [];
let currentLabel = null;
for (const item of items) {
if (item.label !== currentLabel) {
if (lines.length > 0) lines.push("");
lines.push(item.label);
currentLabel = item.label;
}
lines.push(` ${item.text}`);
}
return lines.join("\n");
}
/** Builds `/commands` text, returning only the rendered message body. */
function buildCommandsMessage(cfg, skillCommands, options) {
return buildCommandsMessagePaginated(cfg, skillCommands, options).text;
}
/** Builds `/commands` text and pagination metadata for surfaces with native list controls. */
function buildCommandsMessagePaginated(cfg, skillCommands, options) {
const page = Math.max(1, options?.page ?? 1);
const surface = normalizeOptionalLowercaseString(options?.surface);
const prefersPaginatedList = options?.forcePaginatedList === true || Boolean(surface && getChannelPlugin(surface)?.commands?.buildCommandsListChannelData);
const items = buildCommandItems(cfg ? listChatCommandsForConfig(cfg, { skillCommands }) : listChatCommands({ skillCommands }), listPluginCommands());
if (!prefersPaginatedList) {
const lines = ["ℹ️ Slash commands", ""];
lines.push(formatCommandList(items));
lines.push("", "More: /tools for available capabilities");
return {
text: lines.join("\n").trim(),
totalPages: 1,
currentPage: 1,
hasNext: false,
hasPrev: false
};
}
const totalCommands = items.length;
const totalPages = Math.max(1, Math.ceil(totalCommands / COMMANDS_PER_PAGE));
const currentPage = Math.min(page, totalPages);
const startIndex = (currentPage - 1) * COMMANDS_PER_PAGE;
const endIndex = startIndex + COMMANDS_PER_PAGE;
const pageItems = items.slice(startIndex, endIndex);
const lines = [`ℹ️ Commands (${currentPage}/${totalPages})`, ""];
lines.push(formatCommandList(pageItems));
return {
text: lines.join("\n").trim(),
totalPages,
currentPage,
hasNext: currentPage < totalPages,
hasPrev: currentPage > 1
};
}
//#endregion
export { buildCommandsMessagePaginated as n, buildHelpMessage as r, buildCommandsMessage as t };