The Background Task System enables asynchronous execution of agent sessions with automatic lifecycle management, concurrency control, and parent notification. This system allows agents to spawn long-running subagent sessions that execute in parallel while the parent agent continues working, with automatic notifications upon completion.
For information about how agents use background tasks for delegation, see Agent Orchestration For configuration of concurrency limits and spawn depth, see Configuration Reference
The background task system provides:
BackgroundManager.launch() packages/omo-opencode/src/features/background-agent/manager.ts223-245ConcurrencyManager packages/omo-opencode/src/features/background-agent/manager.ts57 packages/omo-opencode/src/features/background-agent/manager.ts148-158pending → running → completed/error packages/omo-opencode/src/features/background-agent/types.ts5-11TaskToastManager packages/omo-opencode/src/features/background-agent/manager.ts39 packages/omo-opencode/src/features/background-agent/manager.ts129-132assertCanSpawn packages/omo-opencode/src/features/background-agent/manager.ts207-215tryFallbackRetry packages/omo-opencode/src/features/background-agent/manager.ts74detectRepetitiveToolUse packages/omo-opencode/src/features/background-agent/loop-detector.ts90-102Sources: packages/omo-opencode/src/features/background-agent/manager.ts186-215 packages/omo-opencode/src/features/background-agent/types.ts5-98 packages/omo-opencode/src/features/background-agent/constants.ts4-16
The BackgroundManager class is the central orchestrator. It maintains task state, manages concurrency, and coordinates polling packages/omo-opencode/src/features/background-agent/manager.ts186-212
Entity Association Map
Key state maps:
tasks: Complete task registry indexed by task ID packages/omo-opencode/src/features/background-agent/manager.ts219notifications: Tasks awaiting parent notification packages/omo-opencode/src/features/background-agent/manager.ts222queuesByKey: FIFO queue per concurrency key (e.g., model name) packages/omo-opencode/src/features/background-agent/manager.ts148Sources: packages/omo-opencode/src/features/background-agent/manager.ts186-222 packages/omo-opencode/src/features/background-agent/types.ts44-100 packages/omo-opencode/src/features/background-agent/task-poller.ts174-184
Background tasks transition through states defined in BackgroundTaskStatus packages/omo-opencode/src/features/background-agent/types.ts5-11
Task Transition Diagram
State definitions:
pending: Queued, waiting for concurrency slot packages/omo-opencode/src/features/background-agent/types.ts6running: Session active, polling for completion packages/omo-opencode/src/features/background-agent/types.ts7completed: Successfully finished with output packages/omo-opencode/src/features/background-agent/types.ts8error: Unrecoverable failure or max retries exceeded packages/omo-opencode/src/features/background-agent/types.ts9cancelled: Aborted by user or staleTimeoutMs packages/omo-opencode/src/features/background-agent/types.ts10Sources: packages/omo-opencode/src/features/background-agent/types.ts5-11 packages/omo-opencode/src/features/background-agent/task-poller.ts25-30 packages/omo-opencode/src/features/background-agent/constants.ts15 packages/omo-opencode/src/features/background-agent/spawner.ts26-150
The system uses a 3-second polling interval (POLLING_INTERVAL_MS) to monitor tasks packages/omo-opencode/src/features/background-agent/constants.ts59
Staleness Checks packages/omo-opencode/src/features/background-agent/task-poller.ts174-205:
progress.lastUpdate for messageStalenessTimeoutMs (default 60 min), it is cancelled packages/omo-opencode/src/features/background-agent/task-poller.ts199-203staleTimeoutMs (default 45 min), it is cancelled packages/omo-opencode/src/features/background-agent/task-poller.ts195-203sessionGoneTimeoutMs (default 1 min), it is aborted packages/omo-opencode/src/features/background-agent/task-poller.ts196-203TASK_CLEANUP_DELAY_MS packages/omo-opencode/src/features/background-agent/constants.ts61Sources: packages/omo-opencode/src/features/background-agent/task-poller.ts1-125 packages/omo-opencode/src/features/background-agent/constants.ts59-63 packages/omo-opencode/src/features/background-agent/types.ts19-27
The ConcurrencyManager enforces limits per provider/model packages/omo-opencode/src/features/background-agent/manager.ts148
BackgroundTaskConfig passed to the BackgroundManager packages/omo-opencode/src/features/background-agent/manager.ts3Before launching, the system checks hierarchical limits via resolveSubagentSpawnContext packages/omo-opencode/src/features/background-agent/subagent-spawn-limits.ts104:
getMaxSubagentDepth packages/omo-opencode/src/features/background-agent/subagent-spawn-limits.ts103BackgroundManager throws SubagentDepthLimitError if depth exceeds configured limits packages/omo-opencode/src/features/background-agent/subagent-spawn-limits.ts102Sources: packages/omo-opencode/src/features/background-agent/manager.ts207-215 packages/omo-opencode/src/features/background-agent/subagent-spawn-limits.ts101-105
To prevent infinite loops that burn tokens, the BackgroundManager uses a circuit breaker packages/omo-opencode/src/features/background-agent/loop-detector.ts1-13
Logic packages/omo-opencode/src/features/background-agent/loop-detector.ts33-102:
recordToolCall maintains a consecutiveCount for identical signatures packages/omo-opencode/src/features/background-agent/loop-detector.ts33-62consecutiveCount exceeds consecutiveThreshold (default 20), detectRepetitiveToolUse returns triggered: true, and the task is failed packages/omo-opencode/src/features/background-agent/loop-detector.ts90-102Sources: packages/omo-opencode/src/features/background-agent/loop-detector.ts1-102 packages/omo-opencode/src/features/background-agent/constants.ts10-11
The ParentWakeNotifier manages the injection of notifications into parent sessions when background tasks finish or reach terminal states packages/omo-opencode/src/features/background-agent/parent-wake-notifier.ts18
queuePendingParentWake packages/omo-opencode/src/features/background-agent/parent-wake-notifier.ts88settleAfterSessionIdle packages/omo-opencode/src/features/background-agent/parent-wake-notifier.ts113PARENT_WAKE_USER_MESSAGE_IN_PROGRESS_WINDOW_MS packages/omo-opencode/src/features/background-agent/manager.ts157dispatchInternalPrompt which uses the prompt-async-gate to add synthetic messages without interrupting the user's flow packages/omo-opencode/src/features/background-agent/manager.ts7 packages/omo-opencode/src/shared/prompt-async-gate.ts69Sources: packages/omo-opencode/src/features/background-agent/parent-wake-notifier.ts18-172 packages/omo-opencode/src/features/background-agent/manager.ts82 docs/reference/prompt-async-gate-rfc.md1-42
The BackgroundManager registers with the registerManagerForCleanup utility to ensure background sessions are aborted when the host process exits packages/omo-opencode/src/features/background-agent/process-cleanup.ts83
Cleanup Mechanism:
SIGINT, SIGTERM, and SIGBREAK (Windows) packages/omo-opencode/src/features/background-agent/process-cleanup.ts183-186scheduleForcedExit while waiting for manager.shutdown() to complete packages/omo-opencode/src/features/background-agent/process-cleanup.ts44-51uncaughtException and unhandledRejection are log-only and do not trigger cleanup to avoid tearing down tasks on transient streaming errors packages/omo-opencode/src/features/background-agent/process-cleanup.ts167-180Sources: packages/omo-opencode/src/features/background-agent/process-cleanup.ts1-200 packages/omo-opencode/src/features/background-agent/manager.ts84
The background system is exposed through several tools:
| Tool | Implementation | Purpose |
|---|---|---|
background_task | createTask packages/omo-opencode/src/features/background-agent/spawner.ts26 | Spawns a new task and returns a task_id packages/omo-opencode/src/features/background-agent/spawner.ts27 |
background_output | createBackgroundOutput packages/omo-opencode/src/tools/background-task/create-background-output.ts | Retrieves output or blocks until completion. |
background_cancel | background_cancel | Aborts a specific background task or all tasks. |
call_omo_agent | startTask packages/omo-opencode/src/features/background-agent/spawner.ts30 | High-level tool to spawn specialized agents in background or sync mode packages/omo-opencode/src/features/background-agent/spawner.ts30-174 |
Output Handling: Notifications are sent to the parent session once a task reaches a terminal state. If the parent is idle, handleSessionIdleBackgroundEvent triggers a prompt to the parent to check results packages/omo-opencode/src/features/background-agent/manager.ts90
Sources: packages/omo-opencode/src/features/background-agent/spawner.ts26-174 packages/omo-opencode/src/features/background-agent/task-poller.ts174-205 packages/omo-opencode/src/features/background-agent/manager.ts90
Refresh this wiki
This wiki was recently refreshed. Please wait 1 day to refresh again.