diff --git a/src/hooks/bundled/session-memory/handler.test.ts b/src/hooks/bundled/session-memory/handler.test.ts index 5561a812a57..6c32488e082 100644 --- a/src/hooks/bundled/session-memory/handler.test.ts +++ b/src/hooks/bundled/session-memory/handler.test.ts @@ -1,10 +1,21 @@ import fs from "node:fs/promises"; import path from "node:path"; -import { describe, expect, it } from "vitest"; +import { beforeAll, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../../config/config.js"; +import type { HookHandler } from "../../hooks.js"; import { makeTempWorkspace, writeWorkspaceFile } from "../../../test-helpers/workspace.js"; import { createHookEvent } from "../../hooks.js"; -import handler from "./handler.js"; + +// Avoid calling the embedded Pi agent (global command lane); keep this unit test deterministic. +vi.mock("../../llm-slug-generator.js", () => ({ + generateSlugViaLLM: vi.fn().mockResolvedValue("simple-math"), +})); + +let handler: HookHandler; + +beforeAll(async () => { + ({ default: handler } = await import("./handler.js")); +}); /** * Create a mock session JSONL file with various entry types diff --git a/src/hooks/bundled/session-memory/handler.ts b/src/hooks/bundled/session-memory/handler.ts index 9295b1d139f..8fb0af4f62c 100644 --- a/src/hooks/bundled/session-memory/handler.ts +++ b/src/hooks/bundled/session-memory/handler.ts @@ -8,13 +8,13 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { fileURLToPath } from "node:url"; import type { OpenClawConfig } from "../../../config/config.js"; import type { HookHandler } from "../../hooks.js"; import { resolveAgentWorkspaceDir } from "../../../agents/agent-scope.js"; import { createSubsystemLogger } from "../../../logging/subsystem.js"; import { resolveAgentIdFromSessionKey } from "../../../routing/session-key.js"; import { resolveHookConfig } from "../../config.js"; +import { generateSlugViaLLM } from "../../llm-slug-generator.js"; const log = createSubsystemLogger("hooks/session-memory"); @@ -124,13 +124,6 @@ const saveSessionToMemory: HookHandler = async (event) => { // Avoid calling the model provider in unit tests, keep hooks fast and deterministic. if (sessionContent && cfg && !process.env.VITEST && process.env.NODE_ENV !== "test") { log.debug("Calling generateSlugViaLLM..."); - // Dynamically import the LLM slug generator (avoids module caching issues) - // When compiled, handler is at dist/hooks/bundled/session-memory/handler.js - // Going up ../.. puts us at dist/hooks/, so just add llm-slug-generator.js - const openclawRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); - const slugGenPath = path.join(openclawRoot, "llm-slug-generator.js"); - const { generateSlugViaLLM } = await import(slugGenPath); - // Use LLM to generate a descriptive slug slug = await generateSlugViaLLM({ sessionContent, cfg }); log.debug("Generated slug", { slug });