/** * Claude Code Platform Adapter * * Handles the stdin JSON format from Claude Code hooks. * This is the default adapter and matches the existing behavior * of parseHookInput() and formatResponse() in types.ts. * * @module @agentkits/memory/hooks/adapters/claude-code-adapter */ import type { PlatformAdapter } from './platform-adapter.js'; import type { NormalizedHookInput, HookResult, ClaudeCodeHookInput, ClaudeCodeHookResponse } from '../types.js'; import { getProjectName, STANDARD_RESPONSE } from '../types.js'; /** * Claude Code platform adapter. * * Input format: * { session_id, cwd, prompt, tool_name, tool_input, tool_result, * transcript_path, stop_reason } * * Output format: * { continue, suppressOutput, hookSpecificOutput: { * hookEventName, additionalContext } } */ export class ClaudeCodeAdapter implements PlatformAdapter { readonly name = 'claude-code'; readonly supportedEvents = [ 'context', 'session-init', 'observation', 'summarize', 'user-message', ] as const; parseInput(stdin: string): NormalizedHookInput { try { const raw: ClaudeCodeHookInput = JSON.parse(stdin); const cwd = raw.cwd || process.cwd(); return { sessionId: raw.session_id || `session_${Date.now()}`, cwd, project: getProjectName(cwd), prompt: raw.prompt, toolName: raw.tool_name, toolInput: raw.tool_input, toolResponse: raw.tool_result, transcriptPath: raw.transcript_path, stopReason: raw.stop_reason, timestamp: Date.now(), }; } catch { const cwd = process.cwd(); return { sessionId: `session_${Date.now()}`, cwd, project: getProjectName(cwd), timestamp: Date.now(), }; } } formatOutput(result: HookResult): string { if (result.additionalContext) { const response: ClaudeCodeHookResponse = { hookSpecificOutput: { hookEventName: 'SessionStart', additionalContext: result.additionalContext, }, }; return JSON.stringify(response); } return JSON.stringify(STANDARD_RESPONSE); } }