UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

92 lines (91 loc) 4.55 kB
import { l as normalizeOptionalString, o as normalizeLowercaseStringOrEmpty } from "./string-coerce-CIXf7egm.js"; import { n as extractTextFromChatContent } from "./chat-content-DNdfeXZh.js"; import { a as isNativeCommandTurn, c as resolveCommandTurnContext } from "./command-turn-context-CmPEYNmV.js"; import { m as resolveMainSessionAlias, p as resolveInternalSessionKey } from "./sessions-helpers-B2gzzr60.js"; import { t as formatRunLabel } from "./subagents-utils-ChHH_ZbO.js"; import { n as buildSubagentRunReadIndex } from "./subagent-registry-read-DeFf_9Nz.js"; import { t as buildSubagentRunView } from "./subagent-run-view-BqhTqM1D.js"; import { t as extractStoredAssistantText } from "./chat-history-text-C2UOMgRe.js"; import { n as commandReply } from "./command-gates-B4tlStPI.js"; //#region src/auto-reply/reply/commands-subagents-text.ts /** Text extraction helpers for subagent command output. */ /** Extracts sanitized display text from a subagent chat message. */ function extractSubagentMessageText(message) { const role = typeof message.role === "string" ? message.role : ""; const content = role === "assistant" ? extractStoredAssistantText(message) : message.content; const text = extractTextFromChatContent(content); return text ? { role, text } : null; } function resolveSubagentEntryForToken(runs, token) { const fail = (message) => ({ reply: commandReply(`⚠️ ${message}`) }); const trimmed = normalizeOptionalString(token); if (!trimmed) return fail("Missing subagent id."); const readIndex = buildSubagentRunReadIndex(); const { latest, active, recent } = buildSubagentRunView({ runs, recentMinutes: 30, countPendingDescendantRuns: (sessionKey) => readIndex.countPendingDescendantRuns(sessionKey) }); if (trimmed === "last") { const entry = latest[0]; return entry ? { entry } : fail("Unknown subagent."); } const numericOrder = [...active, ...recent]; if (/^\d+$/.test(trimmed)) { const entry = numericOrder[Number.parseInt(trimmed, 10) - 1]; return entry ? { entry } : fail(`Invalid subagent index: ${trimmed}`); } if (trimmed.includes(":")) { const entry = latest.find((run) => run.childSessionKey === trimmed); return entry ? { entry } : fail(`Unknown subagent session: ${trimmed}`); } const lowered = normalizeLowercaseStringOrEmpty(trimmed); const match = (entries, ambiguity) => { if (entries.length > 1) return fail(`${ambiguity}: ${trimmed}`); const entry = entries[0]; return entry ? { entry } : void 0; }; return match(numericOrder.filter((entry) => normalizeLowercaseStringOrEmpty(entry.taskName) === lowered), "Ambiguous subagent label") ?? match(latest.filter((entry) => normalizeLowercaseStringOrEmpty(formatRunLabel(entry)) === lowered), "Ambiguous subagent label") ?? match(numericOrder.filter((entry) => normalizeLowercaseStringOrEmpty(entry.taskName).startsWith(lowered)), "Ambiguous subagent label prefix") ?? match(latest.filter((entry) => normalizeLowercaseStringOrEmpty(formatRunLabel(entry)).startsWith(lowered)), "Ambiguous subagent label prefix") ?? match(latest.filter((entry) => entry.runId.startsWith(trimmed)), "Ambiguous run id prefix") ?? fail(`Unknown subagent id: ${trimmed}`); } function resolveRequesterSessionKey(params, opts) { const commandTarget = normalizeOptionalString(params.ctx.CommandTargetSessionKey); const commandSession = normalizeOptionalString(params.sessionKey); const raw = opts?.preferCommandTarget ?? isNativeCommandTurn(resolveCommandTurnContext(params.ctx)) ? commandTarget || commandSession : commandSession || commandTarget; if (!raw) return; const { mainKey, alias } = resolveMainSessionAlias(params.cfg); return resolveInternalSessionKey({ key: raw, alias, mainKey }); } function buildSubagentsHelp() { return [ "Subagents", "Usage:", "- /subagents list", "- /subagents log <id|#> [limit] [tools]", "- /subagents info <id|#>", "- /session unbind", "- /agents", "- /session idle <duration|off>", "- /session max-age <duration|off>", "", "Ids: use the list index (#), runId/session prefix, label, or full session key." ].join("\n"); } function formatLogLines(messages) { const lines = []; for (const msg of messages) { const extracted = extractSubagentMessageText(msg); if (!extracted) continue; const label = extracted.role === "assistant" ? "Assistant" : "User"; lines.push(`${label}: ${extracted.text}`); } return lines; } //#endregion export { resolveSubagentEntryForToken as i, formatLogLines as n, resolveRequesterSessionKey as r, buildSubagentsHelp as t };