e9c0ec45db
- Removed bin/hooks/ wrapper layer - Moved all hook logic into consolidated hooks/*-hook.ts files - Each hook now handles its own stdin/stdout/JSON wrapping - Removed ALL try-catch blocks from context-hook (let errors surface) - Updated build script to reference new src/hooks/ paths - Reduced from 12+ files to 6 hook files This simplifies the architecture and makes debugging actually possible.
78 lines
2.1 KiB
JavaScript
78 lines
2.1 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Summary Hook - Stop
|
|
* Consolidated entry point + logic
|
|
*/
|
|
|
|
import { stdin } from 'process';
|
|
import { SessionStore } from '../services/sqlite/SessionStore.js';
|
|
import { createHookResponse } from './hook-response.js';
|
|
import { logger } from '../utils/logger.js';
|
|
import { ensureWorkerRunning } from '../shared/worker-utils.js';
|
|
|
|
export interface StopInput {
|
|
session_id: string;
|
|
cwd: string;
|
|
[key: string]: any;
|
|
}
|
|
|
|
/**
|
|
* Summary Hook Main Logic
|
|
*/
|
|
async function summaryHook(input?: StopInput): Promise<void> {
|
|
if (!input) {
|
|
throw new Error('summaryHook requires input');
|
|
}
|
|
|
|
const { session_id } = input;
|
|
|
|
// Ensure worker is running first
|
|
const workerReady = await ensureWorkerRunning();
|
|
if (!workerReady) {
|
|
throw new Error('Worker service failed to start or become healthy');
|
|
}
|
|
|
|
const db = new SessionStore();
|
|
|
|
// Get or create session
|
|
const sessionDbId = db.createSDKSession(session_id, '', '');
|
|
const promptNumber = db.getPromptCounter(sessionDbId);
|
|
db.close();
|
|
|
|
// Use fixed worker port
|
|
const FIXED_PORT = parseInt(process.env.CLAUDE_MEM_WORKER_PORT || '37777', 10);
|
|
|
|
logger.dataIn('HOOK', 'Stop: Requesting summary', {
|
|
sessionId: sessionDbId,
|
|
workerPort: FIXED_PORT,
|
|
promptNumber
|
|
});
|
|
|
|
const response = await fetch(`http://127.0.0.1:${FIXED_PORT}/sessions/${sessionDbId}/summarize`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ prompt_number: promptNumber }),
|
|
signal: AbortSignal.timeout(2000)
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const errorText = await response.text();
|
|
logger.failure('HOOK', 'Failed to generate summary', {
|
|
sessionId: sessionDbId,
|
|
status: response.status
|
|
}, errorText);
|
|
throw new Error(`Failed to request summary from worker: ${response.status} ${errorText}`);
|
|
}
|
|
|
|
logger.debug('HOOK', 'Summary request sent successfully', { sessionId: sessionDbId });
|
|
console.log(createHookResponse('Stop', true));
|
|
}
|
|
|
|
// Entry Point
|
|
let input = '';
|
|
stdin.on('data', (chunk) => input += chunk);
|
|
stdin.on('end', async () => {
|
|
const parsed = input ? JSON.parse(input) : undefined;
|
|
await summaryHook(parsed);
|
|
});
|