From 4ba9809f18df8413e8099cf1d881eb28d41e3861 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 6 Feb 2026 17:18:25 -0800 Subject: [PATCH] test(hooks): stabilize session-memory hook tests --- src/hooks/bundled/session-memory/handler.test.ts | 15 +++++++++++++-- src/hooks/bundled/session-memory/handler.ts | 9 +-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/hooks/bundled/session-memory/handler.test.ts b/src/hooks/bundled/session-memory/handler.test.ts index 5561a812a..6c32488e0 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 9295b1d13..8fb0af4f6 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 });