eaba21329c
* refactor: Clean up hook-response and new-hook files - Removed 'PreCompact' hook type and associated logic from hook-response.ts for improved type safety. - Deleted extensive architecture comments in new-hook.ts to streamline code readability. - Simplified debug logging in new-hook.ts to reduce verbosity. - Enhanced ensureWorkerRunning function in worker-utils.ts with a final health check before throwing errors. - Added a new documentation file outlining the hooks cleanup process and future improvements. * Refactor cleanup and user message hooks - Updated cleanup-hook.js to improve error handling and remove unnecessary input checks. - Simplified user-message-hook.js by removing time-sensitive announcements and streamlining output. - Enhanced logging functionality in both hooks for better debugging and clarity. * Refactor error handling in hooks to use centralized error handler - Introduced `handleWorkerError` function in `src/shared/hook-error-handler.ts` to manage worker-related errors. - Updated `context-hook.ts`, `new-hook.ts`, `save-hook.ts`, and `summary-hook.ts` to utilize the new error handler, simplifying error management and improving code readability. - Removed repetitive error handling logic from individual hooks, ensuring consistent user-friendly messages for connection issues. * Refactor user-message and summary hooks to utilize shared transcript parser; introduce hook exit codes - Moved user message extraction logic to a new shared module `transcript-parser.ts` for better code reuse. - Updated `summary-hook.ts` to use the new `extractLastMessage` function for retrieving user and assistant messages. - Replaced direct exit code usage in `user-message-hook.ts` with constants from `hook-constants.ts` for improved readability and maintainability. - Added `HOOK_EXIT_CODES` to `hook-constants.ts` to standardize exit codes across hooks. * Refactor hook input interfaces to enforce required fields - Updated `SessionStartInput`, `UserPromptSubmitInput`, `PostToolUseInput`, and `StopInput` interfaces to require `session_id`, `transcript_path`, and `cwd` fields, ensuring better type safety and clarity in hook inputs. - Removed optional index signatures from these interfaces to prevent unintended properties and improve code maintainability. - Adjusted related hook implementations to align with the new interface definitions. * Refactor save-hook to remove tool skipping logic; enhance summary-hook to handle spinner stopping with error logging; update SessionRoutes to load skip tools from settings; add CLAUDE_MEM_SKIP_TOOLS to SettingsDefaultsManager for configurable tool exclusion. * Document CLAUDE_MEM_SKIP_TOOLS setting in public docs Added documentation for the new CLAUDE_MEM_SKIP_TOOLS configuration setting in response to PR review feedback. Users can now discover and customize which tools are excluded from observations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
73 lines
2.0 KiB
TypeScript
73 lines
2.0 KiB
TypeScript
/**
|
|
* Context Hook - SessionStart
|
|
*
|
|
* Pure HTTP client - calls worker to generate context.
|
|
* This allows the hook to run under any runtime (Node.js or Bun) since it has no
|
|
* native module dependencies.
|
|
*/
|
|
|
|
import path from "path";
|
|
import { stdin } from "process";
|
|
import { ensureWorkerRunning, getWorkerPort } from "../shared/worker-utils.js";
|
|
import { HOOK_TIMEOUTS } from "../shared/hook-constants.js";
|
|
import { handleWorkerError } from "../shared/hook-error-handler.js";
|
|
|
|
export interface SessionStartInput {
|
|
session_id: string;
|
|
transcript_path: string;
|
|
cwd: string;
|
|
hook_event_name?: string;
|
|
}
|
|
|
|
async function contextHook(input?: SessionStartInput): Promise<string> {
|
|
// Ensure worker is running before any other logic
|
|
await ensureWorkerRunning();
|
|
|
|
const cwd = input?.cwd ?? process.cwd();
|
|
const project = cwd ? path.basename(cwd) : "unknown-project";
|
|
const port = getWorkerPort();
|
|
|
|
const url = `http://127.0.0.1:${port}/api/context/inject?project=${encodeURIComponent(project)}`;
|
|
|
|
try {
|
|
const response = await fetch(url, { signal: AbortSignal.timeout(HOOK_TIMEOUTS.DEFAULT) });
|
|
|
|
if (!response.ok) {
|
|
const errorText = await response.text();
|
|
throw new Error(`Failed to fetch context: ${response.status} ${errorText}`);
|
|
}
|
|
|
|
const result = await response.text();
|
|
return result.trim();
|
|
} catch (error: any) {
|
|
handleWorkerError(error);
|
|
}
|
|
}
|
|
|
|
// Entry Point - handle stdin/stdout
|
|
const forceColors = process.argv.includes("--colors");
|
|
|
|
if (stdin.isTTY || forceColors) {
|
|
contextHook(undefined).then((text) => {
|
|
console.log(text);
|
|
process.exit(0);
|
|
});
|
|
} else {
|
|
let input = "";
|
|
stdin.on("data", (chunk) => (input += chunk));
|
|
stdin.on("end", async () => {
|
|
const parsed = input.trim() ? JSON.parse(input) : undefined;
|
|
const text = await contextHook(parsed);
|
|
|
|
console.log(
|
|
JSON.stringify({
|
|
hookSpecificOutput: {
|
|
hookEventName: "SessionStart",
|
|
additionalContext: text,
|
|
},
|
|
})
|
|
);
|
|
process.exit(0);
|
|
});
|
|
}
|