mirror of
https://github.com/thedotmack/claude-mem
synced 2026-04-25 17:15:04 +02:00
Merge crab-mem observation recording with existing SSE broadcasting to create a complete OpenClaw plugin. Records observations from embedded runner sessions via worker HTTP API, and continuously syncs MEMORY.md to agent workspaces so agents always have fresh context. - Add event handlers: before_agent_start, tool_result_persist, agent_end, gateway_start - Add MEMORY.md live sync on every agent start and tool use (fire-and-forget) - Add worker HTTP client (POST, fire-and-forget POST, GET text) - Add /claude-mem-status health check command - Add workspace dir tracking across session events - Expand test suite from 17 to 36 tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
107 lines
3.0 KiB
JavaScript
107 lines
3.0 KiB
JavaScript
/**
|
|
* Smoke test for OpenClaw claude-mem plugin registration.
|
|
* Validates the plugin structure works independently of the full OpenClaw runtime.
|
|
*
|
|
* Run: node test-sse-consumer.js
|
|
*/
|
|
|
|
import claudeMemPlugin from "./dist/index.js";
|
|
|
|
let registeredService = null;
|
|
const registeredCommands = new Map();
|
|
const eventHandlers = new Map();
|
|
const logs = [];
|
|
|
|
const mockApi = {
|
|
id: "claude-mem",
|
|
name: "Claude-Mem (Persistent Memory)",
|
|
version: "1.0.0",
|
|
source: "/test/extensions/claude-mem/dist/index.js",
|
|
config: {},
|
|
pluginConfig: {},
|
|
logger: {
|
|
info: (message) => { logs.push(message); },
|
|
warn: (message) => { logs.push(message); },
|
|
error: (message) => { logs.push(message); },
|
|
debug: (message) => { logs.push(message); },
|
|
},
|
|
registerService: (service) => {
|
|
registeredService = service;
|
|
},
|
|
registerCommand: (command) => {
|
|
registeredCommands.set(command.name, command);
|
|
},
|
|
on: (event, callback) => {
|
|
if (!eventHandlers.has(event)) {
|
|
eventHandlers.set(event, []);
|
|
}
|
|
eventHandlers.get(event).push(callback);
|
|
},
|
|
runtime: {
|
|
channel: {
|
|
telegram: { sendMessageTelegram: async () => {} },
|
|
discord: { sendMessageDiscord: async () => {} },
|
|
signal: { sendMessageSignal: async () => {} },
|
|
slack: { sendMessageSlack: async () => {} },
|
|
whatsapp: { sendMessageWhatsApp: async () => {} },
|
|
line: { sendMessageLine: async () => {} },
|
|
},
|
|
},
|
|
};
|
|
|
|
// Call the default export with mock API
|
|
claudeMemPlugin(mockApi);
|
|
|
|
// Verify registration
|
|
let failures = 0;
|
|
|
|
if (!registeredService) {
|
|
console.error("FAIL: No service was registered");
|
|
failures++;
|
|
} else if (registeredService.id !== "claude-mem-observation-feed") {
|
|
console.error(
|
|
`FAIL: Service ID is "${registeredService.id}", expected "claude-mem-observation-feed"`
|
|
);
|
|
failures++;
|
|
} else {
|
|
console.log("OK: Service registered with id 'claude-mem-observation-feed'");
|
|
}
|
|
|
|
if (!registeredCommands.has("claude-mem-feed")) {
|
|
console.error("FAIL: No 'claude-mem-feed' command registered");
|
|
failures++;
|
|
} else {
|
|
console.log("OK: Command registered with name 'claude-mem-feed'");
|
|
}
|
|
|
|
if (!registeredCommands.has("claude-mem-status")) {
|
|
console.error("FAIL: No 'claude-mem-status' command registered");
|
|
failures++;
|
|
} else {
|
|
console.log("OK: Command registered with name 'claude-mem-status'");
|
|
}
|
|
|
|
const expectedEvents = ["before_agent_start", "tool_result_persist", "agent_end", "gateway_start"];
|
|
for (const event of expectedEvents) {
|
|
if (!eventHandlers.has(event) || eventHandlers.get(event).length === 0) {
|
|
console.error(`FAIL: No handler registered for '${event}'`);
|
|
failures++;
|
|
} else {
|
|
console.log(`OK: Event handler registered for '${event}'`);
|
|
}
|
|
}
|
|
|
|
if (!logs.some((l) => l.includes("plugin loaded"))) {
|
|
console.error("FAIL: Plugin did not log a load message");
|
|
failures++;
|
|
} else {
|
|
console.log("OK: Plugin logged load message");
|
|
}
|
|
|
|
if (failures > 0) {
|
|
console.error(`\nFAIL: ${failures} check(s) failed`);
|
|
process.exit(1);
|
|
} else {
|
|
console.log("\nPASS: Plugin registers service, commands, and event handlers correctly");
|
|
}
|