export { createHookRegistry } from './hook-registry.js'; import type { SubagentTrace } from './subagent/result.js'; import type { GrantManager } from './tools/grant-manager.js'; export type HarnessHookEvent = 'SessionStart' | 'SessionEnd' | 'SubagentStart' | 'SubagentStop' | 'PreToolUse' | 'PostToolUse' | 'PreCompact' | 'PostToolUseFailure' | 'Stop' | 'UserPromptSubmit'; export interface HookDecision { continue?: boolean; decision?: 'block' | 'approve'; reason?: string; injectContext?: string; } export type SubagentHookStatus = 'idle' | 'running' | 'succeeded' | 'failed' | 'cancelled'; export interface SessionStartContext { event: 'SessionStart'; sessionId?: string; parentSessionId?: string; } export interface SessionEndContext { event: 'SessionEnd'; sessionId?: string; reason?: string; parentSessionId?: string; tracePath?: string; } export interface SubagentStartContext { event: 'SubagentStart'; subagentId: string; parentSessionId?: string; } export interface SubagentStopContext { event: 'SubagentStop'; subagentId: string; status: SubagentHookStatus; reason?: string; lastMessage?: string; agentType?: string; durationMs?: number; trace?: SubagentTrace; } export interface PreToolUseContext { event: 'PreToolUse'; sessionId?: string; subagentId?: string; parentSessionId?: string; cwd?: string; toolName: string; input?: unknown; grantManager?: GrantManager; toolUseId?: string; } export interface PostToolUseContext { event: 'PostToolUse'; sessionId?: string; subagentId?: string; parentSessionId?: string; toolName: string; input?: unknown; output?: unknown; isError?: boolean; grantManager?: GrantManager; incomplete?: boolean; incompleteReason?: string; } export interface PreCompactContext { event: 'PreCompact'; sessionId?: string; trigger?: 'manual' | 'auto'; } export interface PostToolUseFailureContext { event: 'PostToolUseFailure'; sessionId?: string; subagentId?: string; parentSessionId?: string; toolName: string; input?: unknown; error: string; } export interface StopContext { event: 'Stop'; sessionId?: string; parentSessionId?: string; terminalState?: 'done' | 'blocked' | 'asking' | 'interrupted'; doneHasCorroboratingEvidence?: boolean; doneEvidenceClassification?: 'no-code-changes' | 'verified' | 'unverified'; } export interface UserPromptSubmitContext { event: 'UserPromptSubmit'; prompt: string; sessionId?: string; } export type HookContext = SessionStartContext | SessionEndContext | SubagentStartContext | SubagentStopContext | PreToolUseContext | PostToolUseContext | PreCompactContext | PostToolUseFailureContext | StopContext | UserPromptSubmitContext; export type HookHandler = (context: HookContext, signal?: AbortSignal) => HookDecision | Promise; export interface RegisterOptions { longRunning?: boolean; } export interface HookRegistry { register(event: HarnessHookEvent, handler: HookHandler, options?: RegisterOptions): () => void; dispatch(context: HookContext, signal?: AbortSignal, handlerTimeoutMs?: number): Promise; count(event: HarnessHookEvent): number; } export declare function resolveSessionHookRegistry(queryScoped: HookRegistry | undefined, constructorScoped: HookRegistry | undefined): HookRegistry | undefined;