UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

80 lines (77 loc) 3.09 kB
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js"; import { t as createSubsystemLogger } from "./subsystem-BzXSmsuh.js"; import "./agent-scope-MrLta7Pq.js"; import { a as resolveAgentDir, c as resolveDefaultAgentId, o as resolveAgentWorkspaceDir } from "./agent-scope-config-CgCYpZfK.js"; import { c as resolveDefaultModelForAgent } from "./model-selection-CA_65iXi.js"; import { t as resolveAgentTimeoutMs } from "./timeout-Drw0_zOv.js"; import { t as runEmbeddedAgent } from "./embedded-agent-L9tQiaO-.js"; import path from "node:path"; import fs from "node:fs/promises"; import os from "node:os"; //#region src/hooks/llm-slug-generator.ts /** * LLM-based slug generator for session memory filenames */ const log = createSubsystemLogger("llm-slug-generator"); const DEFAULT_SLUG_GENERATOR_TIMEOUT_MS = 15e3; function resolveSlugGeneratorTimeoutMs(cfg) { const configuredTimeoutSeconds = cfg.agents?.defaults?.timeoutSeconds; if (typeof configuredTimeoutSeconds !== "number" || !Number.isFinite(configuredTimeoutSeconds)) return DEFAULT_SLUG_GENERATOR_TIMEOUT_MS; return resolveAgentTimeoutMs({ cfg }); } /** * Generate a short 1-2 word filename slug from session content using LLM */ async function generateSlugViaLLM(params) { let tempSessionFile = null; try { const agentId = resolveDefaultAgentId(params.cfg); const workspaceDir = resolveAgentWorkspaceDir(params.cfg, agentId); const agentDir = resolveAgentDir(params.cfg, agentId); const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-slug-")); tempSessionFile = path.join(tempDir, "session.jsonl"); const prompt = `Based on this conversation, generate a short 1-2 word filename slug (lowercase, hyphen-separated, no file extension). Conversation summary: ${params.sessionContent.slice(0, 2e3)} Reply with ONLY the slug, nothing else. Examples: "vendor-pitch", "api-design", "bug-fix"`; const { provider, model } = resolveDefaultModelForAgent({ cfg: params.cfg, agentId }); const timeoutMs = resolveSlugGeneratorTimeoutMs(params.cfg); const result = await runEmbeddedAgent({ sessionId: `slug-generator-${Date.now()}`, sessionKey: "temp:slug-generator", agentId, sessionFile: tempSessionFile, workspaceDir, agentDir, config: params.cfg, prompt, provider, model, timeoutMs, runId: `slug-gen-${Date.now()}`, cleanupBundleMcpOnRunEnd: true, authProfileFailurePolicy: "local" }); if (result.payloads && result.payloads.length > 0) { const text = result.payloads[0]?.text; if (text) return normalizeLowercaseStringOrEmpty(text).replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 30) || null; } return null; } catch (err) { const message = err instanceof Error ? err.stack ?? err.message : String(err); log.error(`Failed to generate slug: ${message}`); return null; } finally { if (tempSessionFile) try { await fs.rm(path.dirname(tempSessionFile), { recursive: true, force: true }); } catch {} } } //#endregion export { generateSlugViaLLM as t };