opensourceagi/qwksearch-research-agent/agent-runtime-hooks

Claude Code and agent skill by opensourceagi/qwksearch-research-agent

Trust tier 3
  • community
  • ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Source check pending

Checking that the SKILL.md file is still in the repository.

Agent runtime lifecycle hooks. Use for before/after tool or step hooks, tool mocks, human intervention, sub-agent calls, context compression, evals, callAgent, or lifecycle events.

Install

npx vskill@latest install opensourceagi/qwksearch-research-agent/agent-runtime-hooks

Semi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard

SKILL.md

Agent Runtime Hooks

Lifecycle hooks for observing and intercepting agent execution. Hooks are registered per-operation via execAgent({ hooks }) and dispatched by HookDispatcher.

Hook Types

16 hook types across 5 categories:

execAgent({ hooks })
│
├─ beforeStep ──────────── Before each step executes
│ │
│ ├─ [call_llm] LLM inference
│ │
│ ├─ [call_tool]
│ │ ├─ beforeToolCall ── Before tool executes (supports mocking)
│ │ ├─ (tool execution)
│ │ ├─ afterToolCall ─── After tool completes (observation only)
│ │ └─ onToolCallError ─ Tool threw an exception
│ │
│ ├─ [request_human_approve]
│ │ ├─ beforeHumanIntervention ── Before agent pauses
│ │ ├─ afterHumanIntervention ─── After approve/reject + resume
│ │ └─ onStopByHumanIntervention ── User rejected, agent halted
│ │
│ ├─ [compress_context]
│ │ ├─ beforeCompact ──── Before compression starts
│ │ ├─ afterCompact ───── After compression completes
│ │ └─ onCompactError ─── Compression failed
│ │
│ ├─ [callAgent] (via execSubAgentTask)
│ │ ├─ beforeCallAgent ── Before sub-agent starts
│ │ ├─ afterCallAgent ─── After sub-agent completes
│ │ └─ onCallAgentError ── Sub-agent failed
│ │
│ └─ afterStep ──────────── After step completes
│
├─ (next step...)
│
├─ onComplete ───────────── Operation reaches terminal state
└─ onError ──────────────── Error during execution

Key Files

FileRole
packages/agent-runtime/src/types/hooks.tsType definitions (AgentHookType, all event interfaces)
apps/server/src/services/agentRuntime/hooks/types.tsServer-side types (AgentHook, re-exports)
apps/server/src/services/agentRuntime/hooks/HookDispatcher.tsRegistration, dispatch, dispatchBeforeToolCall
apps/server/src/modules/AgentRuntime/RuntimeExecutors.tsTool/Compact/HumanIntervention hook dispatch
apps/server/src/services/agentRuntime/AgentRuntimeService.tsStep hooks + HumanIntervention resume/reject
apps/server/src/services/aiAgent/index.tsCallAgent hook dispatch

Registration Flow

ts
const hooks: AgentHook[] = [
{ id: 'my-hook', type: 'afterStep', handler: async (event) => { ... } },
];
await aiAgentService.execAgent({ agentId, prompt, hooks });
// Internally: hookDispatcher.register(operationId, hooks)
// Cleanup: hookDispatcher.unregister(operationId)

Hook Reference

Step Level

`beforeStep` — Before each step. event: AgentHookEvent `afterStep` — After each step. event: AgentHookEvent (content, toolsCalling, totalCost, etc.) `onComplete` — Terminal state. event: AgentHookEvent (reason: done/error/interrupted/max\_steps/cost\_limit) `onError` — Error occurred. event: AgentHookEvent (errorMessage, errorDetail)

Tool Call Level

`beforeToolCall` — Before tool executes. Supports mocking via event.mock().

ts
// event: ToolCallHookEvent
{
(identifier, apiName, args, callIndex, stepIndex, operationId, mock);
}
// Mock example:
event.mock({ content: '{"error":"rate limited"}' });

Dispatch method: hookDispatcher.dispatchBeforeToolCall() (returns mock result or null).

`afterToolCall` — After tool completes. Observation only.

ts
// event: AfterToolCallHookEvent
{
(identifier, apiName, args, callIndex, content, success, mocked, executionTimeMs, stepIndex);
}

`onToolCallError` — Tool threw an exception (catch block, not just success=false).

ts
// event: ToolCallErrorHookEvent
{
(identifier, apiName, args, callIndex, error, stepIndex);
}
Human Intervention

`beforeHumanIntervention` — Before agent pauses for approval.

ts
// event: BeforeHumanInterventionHookEvent
{ operationId, stepIndex, pendingTools: [{ identifier, apiName }] }

`afterHumanIntervention` — After approve/reject, agent resumes.

ts
// event: AfterHumanInterventionHookEvent
{ operationId, action: 'approve' | 'reject' | 'rejectAndContinue', toolCallId?, rejectionReason? }

`onStopByHumanIntervention` — User rejected, agent halted.

ts
// event: StopByHumanInterventionHookEvent
{ operationId, toolCallId?, rejectionReason? }
Context Compression

`beforeCompact` — Before compression starts.

ts
// event: BeforeCompactHookEvent
{
(operationId, stepIndex, messageCount, tokenCount);
}

`afterCompact` — After compression completes.

ts
// event: AfterCompactHookEvent
{
(operationId, stepIndex, groupId, messagesBefore, messagesAfter, summary);
}

`onCompactError` — Compression failed.

ts
// event: CompactErrorHookEvent
{
(operationId, stepIndex, tokenCount, error);
}
Sub-Agent (CallAgent)

`beforeCallAgent` — Before calling sub-agent. Dispatched on parent operation.

ts
// event: BeforeCallAgentHookEvent
{
(operationId, agentId, instruction);
}

`afterCallAgent` — Sub-agent completed. Dispatched on parent operation.

ts
// event: AfterCallAgentHookEvent
{
(operationId, agentId, subOperationId, threadId, success);
}

`onCallAgentError` — Sub-agent failed. Dispatched on parent operation.

ts
// event: CallAgentErrorHookEvent
{
(operationId, agentId, error);
}

Note: CallAgent hooks require parentOperationId in ExecSubAgentTaskParams.

Design Notes

  • Fire-and-forget: All handlers return Promise<void>. Errors are non-fatal.
  • Exception: beforeToolCall supports mock via event.mock() — uses dispatchBeforeToolCall() which returns the mock result.
  • Sequential: Same-type hooks run in registration order.
  • Local only: beforeToolCall mock only works in local mode (in-memory hooks). Webhook mode does not support mocking.
  • Scoped per operation: Auto-cleaned via hookDispatcher.unregister() on completion.
  • Sandbox/MCP: No separate hooks — they go through executeTool, so beforeToolCall/afterToolCall cover them. Use event.identifier to filter.

Real-World Example: agent-evals

See devtools/agent-evals/helpers/runner.ts — createEvalHooks() uses afterStep, onComplete, afterToolCall, and beforeToolCall (for mock).

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Not refreshed yet.

Extension points

  • hookPre/post lifecycle hooks

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/opensourceagi/qwksearch-research-agent/agent-runtime-hooks/badge)](https://verified-skill.com/skills/opensourceagi/qwksearch-research-agent/agent-runtime-hooks)

Something wrong with this skill or its page? Tell us.