refactor: streamline input validation and error handling in hooks

This commit is contained in:
Alex Newman
2025-10-16 20:10:51 -04:00
parent 7c5e5b1941
commit 6f62a569df
4 changed files with 84 additions and 249 deletions
+26 -82
View File
@@ -13,87 +13,31 @@ export interface StopInput {
* 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);
if (!input) {
throw new Error('summaryHook requires input');
}
const { session_id } = input;
const db = new HooksDatabase();
const session = db.findActiveSDKSession(session_id);
db.close();
if (!session) {
console.log('{"continue": true, "suppressOutput": true}');
return;
}
const socketPath = getWorkerSocketPath(session.id);
const message = {
type: 'finalize'
};
const client = net.connect(socketPath, () => {
client.write(JSON.stringify(message) + '\n');
client.end();
});
client.on('close', () => {
console.log('{"continue": true, "suppressOutput": true}');
});
}