100 lines
2.9 KiB
TypeScript
100 lines
2.9 KiB
TypeScript
import net from 'net';
|
|
import { HooksDatabase } from '../services/sqlite/HooksDatabase.js';
|
|
import { getWorkerSocketPath } from '../shared/paths.js';
|
|
|
|
export interface StopInput {
|
|
session_id: string;
|
|
cwd: string;
|
|
[key: string]: any;
|
|
}
|
|
|
|
/**
|
|
* Summary Hook - Stop
|
|
* Sends FINALIZE message to worker via Unix socket
|
|
*/
|
|
export function summaryHook(input?: StopInput): void {
|
|
try {
|
|
// Log hook entry point
|
|
console.error('[claude-mem summary] Hook fired', {
|
|
input: input ? { session_id: input.session_id, cwd: input.cwd } : null
|
|
});
|
|
|
|
// Handle standalone execution (no input provided)
|
|
if (!input) {
|
|
console.log('No input provided - this script is designed to run as a Claude Code Stop hook');
|
|
console.log('\nExpected input format:');
|
|
console.log(JSON.stringify({
|
|
session_id: "string",
|
|
cwd: "string"
|
|
}, null, 2));
|
|
process.exit(0);
|
|
}
|
|
|
|
const { session_id } = input;
|
|
console.error('[claude-mem summary] Searching for active SDK session', { session_id });
|
|
|
|
// Find active SDK session
|
|
const db = new HooksDatabase();
|
|
const session = db.findActiveSDKSession(session_id);
|
|
db.close();
|
|
|
|
if (!session) {
|
|
// No active session - nothing to finalize
|
|
console.error('[claude-mem summary] No active SDK session found', { session_id });
|
|
console.log('{"continue": true, "suppressOutput": true}');
|
|
process.exit(0);
|
|
}
|
|
|
|
console.error('[claude-mem summary] Active SDK session found', {
|
|
session_id: session.id,
|
|
collection_name: session.collection_name,
|
|
worker_pid: session.worker_pid
|
|
});
|
|
|
|
// Get socket path
|
|
const socketPath = getWorkerSocketPath(session.id);
|
|
|
|
// Send FINALIZE message via Unix socket
|
|
const message = {
|
|
type: 'finalize'
|
|
};
|
|
|
|
console.error('[claude-mem summary] Attempting to send FINALIZE message to worker socket', {
|
|
socketPath,
|
|
message
|
|
});
|
|
|
|
const client = net.connect(socketPath, () => {
|
|
console.error('[claude-mem summary] Socket connection established, sending message');
|
|
client.write(JSON.stringify(message) + '\n');
|
|
client.end();
|
|
});
|
|
|
|
client.on('error', (err) => {
|
|
// Socket not available - worker may have already finished or crashed
|
|
console.error('[claude-mem summary] Socket error occurred', {
|
|
error: err.message,
|
|
code: (err as any).code,
|
|
socketPath
|
|
});
|
|
// Continue anyway, don't block Claude
|
|
});
|
|
|
|
client.on('close', () => {
|
|
console.error('[claude-mem summary] Socket connection closed successfully');
|
|
console.log('{"continue": true, "suppressOutput": true}');
|
|
process.exit(0);
|
|
});
|
|
|
|
} catch (error: any) {
|
|
// On error, don't block Claude Code
|
|
console.error('[claude-mem summary] Unexpected error in hook', {
|
|
error: error.message,
|
|
stack: error.stack,
|
|
name: error.name
|
|
});
|
|
console.log('{"continue": true, "suppressOutput": true}');
|
|
process.exit(0);
|
|
}
|
|
}
|