src/hooks/delegate-task-retry/
Responsibility
Orchestrates automatic retry guidance for failed task delegation attempts by detecting specific error patterns and injecting contextual retry suggestions into tool output.
Design
Core Components
- Error Detection: Pattern-based error classifier (
detectDelegateTaskError) that identifies known delegate-task failure modes from tool output
- Retry Guidance Builder: Constructs actionable retry suggestions with context-specific fix hints
- Available Agents Extractor: Parses tool output to discover currently permitted agents for targeted retries
Architecture Pattern
Uses the Observer pattern via OpenCode's plugin hook system:
- Subscribes to
tool.execute.after lifecycle hook
- Intercepts output from the
task tool (delegate-task)
- Mutates output in-place to append retry guidance without breaking existing workflows
Error Classification
Leverages a predefined set of error patterns (DELEGATE_TASK_ERROR_PATTERNS) that map:
- Error type identifiers (e.g., "invalid-category", "missing-required-field")
- Human-readable fix hints
- Regex patterns for detection
Flow
Execution Sequence
- Hook Registration: Plugin loads
createDelegateTaskRetryHook during initialization
- Event Subscription: Hook subscribes to
tool.execute.after lifecycle event
- Tool Filtering: Only processes output from the
task tool (delegate-task delegation)
- Error Detection: Runs
detectDelegateTaskError() on tool output string
- Guidance Generation: If error detected:
- Looks up error pattern to get fix hint
- Extracts available agent list from output
- Constructs multi-line retry suggestion with:
- Detected error type
- Pattern-specific fix hint
- Available agent list (if present)
- Example retry invocation
- Output Mutation: Appends generated retry guidance to tool output string
- Propagation: Modified output returned to caller for display/user action
Error Handling
- No-op on success: If no delegate-task error detected, hook exits early without modifying output
- Type safety: Validates output is a string before processing
- Graceful degradation: Falls back to generic retry suggestion if error pattern not recognized
Integration
Dependencies
- OpenCode Plugin System: Consumes
tool.execute.after lifecycle hook
- Error Patterns Module: Imports
DELEGATE_TASK_ERROR_PATTERNS and detectDelegateTaskError from ./patterns.ts
- Task Tool: Specifically targets the
task tool used for delegate-task operations
Consumers
- OpenCode Core: Receives enhanced tool output with retry guidance
- User Workflow: Displays actionable error context and retry examples in OpenCode UI
Configuration
- No user configuration required: Pattern matching and guidance generation are hardcoded for reliability
- Extensible patterns: New error types can be added by extending
DELEGATE_TASK_ERROR_PATTERNS array
Lifecycle Hook
'tool.execute.after': async (input, output) => { ... }
- Triggered after every tool execution in OpenCode
- Runs asynchronously but synchronously with respect to tool output processing
- Mutates output object in-place (standard OpenCode plugin hook contract)