Files
OpenCode Test df6cf94dae feat(external-llm): add external LLM integration (fc-004)
Implements external LLM routing via opencode CLI for:
- GitHub Copilot (gpt-5.2, claude-sonnet-4.5, claude-haiku-4.5, o3, gemini-3-pro)
- Z.AI (glm-4.7 for code generation)
- OpenCode native (big-pickle)

Components:
- mcp/llm-router/invoke.py: Main router with task-based model selection
- mcp/llm-router/delegate.py: Agent delegation helper (respects external mode)
- mcp/llm-router/toggle.py: Enable/disable external-only mode
- mcp/llm-router/providers/: CLI wrappers for opencode and gemini

Features:
- Persistent toggle via state/external-mode.json
- Task routing: reasoning -> gpt-5.2, code-gen -> glm-4.7, long-context -> gemini
- Claude tier mapping: opus -> gpt-5.2, sonnet -> claude-sonnet-4.5, haiku -> claude-haiku-4.5
- Session-start hook announces when external mode is active
- Natural language toggle support via component registry

Plan: gleaming-routing-mercury

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 13:34:35 -08:00
..

Hooks

Event handlers that run automatically during Claude Code sessions.

Active Hooks

Event Script Purpose
SessionStart scripts/session-start.sh Load context, check for pending items
PreCompact scripts/pre-compact.sh Remind to preserve context before compaction

Hook Events

Event When It Fires
SessionStart When Claude Code session begins
SessionEnd When session ends
PreToolUse Before a tool is used
PostToolUse After a tool is used
UserPromptSubmit When user submits a prompt
PreCompact Before context compaction
Notification When notification is sent

Configuration

Hooks are defined in hooks.json:

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/scripts/session-start.sh"
          }
        ]
      }
    ]
  }
}

Adding Hooks

  1. Create script in scripts/
  2. Make executable: chmod +x scripts/your-hook.sh
  3. Add to hooks.json
  4. Restart Claude Code

Script Output

  • Stdout is injected into session as context
  • Use format: HookName:Callback hook success: Success
  • Additional context: HookName hook additional context: <message>

Matchers (for Tool Hooks)

{
  "matcher": "Write|Edit",
  "hooks": [...]
}

Matches tool names with regex pattern.

Tips

  • Keep hooks fast (<1s) to avoid delays
  • Use set -euo pipefail for safety
  • Output useful context, not noise
  • Test hooks manually before adding