Skip to main content

Task Queue API

/api/queue - Task queue management endpoints

Overview​

The Task Queue API provides global concurrency control and failure recovery capabilities, allowing the frontend to submit agent tasks to the queue, which are then uniformly scheduled and executed by the Gateway to prevent resource exhaustion from running too many agents simultaneously.

Endpoints​

MethodPathDescription
POST/api/queue/enqueueSubmit task to queue
POST/api/queue/enqueue-batchBatch submit tasks to queue
GET/api/queue/statusGet overall queue status
GET/api/queue/tasksGet task list
GET/api/queue/tasks/:idGet single task details
GET/api/queue/tasks/:id/runningCheck if task process is running
GET/api/queue/tasks/:id/streamTask output stream (SSE)
DELETE/api/queue/tasks/:idCancel/delete task
PUT/api/queue/configUpdate queue configuration
GET/api/queue/configGet queue configuration
POST/api/queue/clear-historyClear task history

Detailed Description​

POST /api/queue/enqueue​

Submit a task to the queue.

Request Body:

{
"agent_id": "CLAUDE_CODE",
"input": "Please help me refactor this code",
"cwd": "/path/to/project",
"session_id": "session-123",
"agent_config_path": "/path/to/agents/myagent/AGENTS.md",
"max_retries": 3,
"attachments": [
{ "type": "text", "data": "...", "name": "context.txt" }
]
}

Field Description:

FieldTypeRequiredDescription
agent_idstringYesAgent ID
inputstringYesUser prompt
cwdstringNoWorking directory
session_idstringNoSession ID
agent_config_pathstringNoAgent configuration file path
resume_sessionstringNoResume existing SDK session
max_retriesnumberNoMaximum retry count (default 3)
attachmentsarrayNoAttachment list

Response:

{
"task_id": "task_1709123456789_abc123",
"position": 2,
"status": "pending"
}

POST /api/queue/enqueue-batch​

Batch submit tasks to the queue.

Request Body:

{
"task_ids": ["task-1", "task-2", "task-3"]
}

Response:

{
"success": true,
"queued": 3,
"failed": []
}

Field Description:

FieldTypeDescription
successbooleanWhether all tasks were queued successfully
queuednumberNumber of tasks successfully queued
failedstring[]List of task IDs that failed to queue

GET /api/queue/status​

Get overall queue status.

Response:

{
"pending_count": 3,
"running_count": 2,
"max_concurrency": 3,
"tasks": [
{
"id": "task_1709123456789_abc123",
"status": "running",
"agent_id": "CLAUDE_CODE",
"created_at": 1709123456789
}
]
}

GET /api/queue/tasks​

Get task list.

Query Parameters:

ParameterTypeDescription
statusstringFilter by status: pending, running, completed, failed

Response:

{
"tasks": [
{
"id": "task_1709123456789_abc123",
"type": "agent-run",
"payload": {
"agent_id": "CLAUDE_CODE",
"input": "Please help me..."
},
"status": "completed",
"retry_count": 0,
"max_retries": 3,
"created_at": 1709123456789,
"started_at": 1709123456800,
"completed_at": 1709123457000
}
]
}

GET /api/queue/tasks/:id​

Get single task details.

Response:

{
"id": "task_1709123456789_abc123",
"type": "agent-run",
"payload": {
"agent_id": "CLAUDE_CODE",
"input": "Please help me...",
"cwd": "/path/to/project"
},
"status": "running",
"retry_count": 0,
"max_retries": 3,
"created_at": 1709123456789,
"started_at": 1709123456800
}

GET /api/queue/tasks/:id/running​

Check if task process is actually running.

Response:

{
"success": true,
"data": {
"task_id": "task_1709123456789_abc123",
"running": true,
"status": "running"
}
}

GET /api/queue/tasks/:id/stream​

Subscribe to task output SSE stream.

Response Format: text/event-stream

Event Types:

// Initial task status
{"type": "task", "task": {...}}

// Progress update
{"type": "progress", "id": "task_...", "progress": {...}}

// Task completed
{"type": "completed", "task": {...}}

// Task failed
{"type": "failed", "task": {...}}

// Task cancelled
{"type": "cancelled", "task": {...}}

// Heartbeat
{"type": "ping"}

// Stream end
{"type": "done"}

DELETE /api/queue/tasks/:id​

Cancel or delete a task.

  • For pending/running tasks: cancel execution
  • For completed/failed tasks: remove from history

Response:

// Cancel successful
{"cancelled": true, "task_id": "task_..."}

// Delete successful
{"deleted": true, "task_id": "task_..."}

PUT /api/queue/config​

Update queue configuration.

Request Body:

{
"max_concurrency": 5,
"default_max_retries": 3,
"persist_debounce_ms": 500,
"shutdown_timeout_ms": 30000
}

Field Description:

FieldTypeDescription
max_concurrencynumberMaximum concurrent tasks
default_max_retriesnumberDefault maximum retry count
persist_debounce_msnumberPersistence debounce delay (milliseconds)
shutdown_timeout_msnumberShutdown timeout (milliseconds)

GET /api/queue/config​

Get current queue configuration.

Response:

{
"max_concurrency": 3,
"default_max_retries": 3,
"persist_debounce_ms": 500,
"shutdown_timeout_ms": 30000
}

POST /api/queue/clear-history​

Clear completed and failed task history.

Response:

{
"cleared": 15
}

Task Status​

StatusDescription
pendingQueued, waiting for execution
runningCurrently executing
retryingExecution failed, preparing to retry
completedExecution completed successfully
failedExecution failed, maximum retries reached

Event Notifications​

Queue status changes will send events to WebSocket (queue channel) and SSE:

// Task queued
{
"type": "queue_task_queued",
"data": {
"task": { "id": "...", "status": "pending", "agent_id": "...", "created_at": ... }
}
}

// Task started
{
"type": "queue_task_started",
"data": {
"task": { "id": "...", "status": "running", ... }
}
}

// Task progress
{
"type": "queue_task_progress",
"data": {
"task_id": "...",
"progress": { ... }
}
}

// Task completed
{
"type": "queue_task_completed",
"data": {
"task": { ... },
"duration": 5000
}
}

// Task failed
{
"type": "queue_task_failed",
"data": {
"task": { ... },
"error": "Error message",
"duration": 3000
}
}

// Task cancelled
{
"type": "queue_task_cancelled",
"data": {
"task": { ... }
}
}

// Queue status changed
{
"type": "queue_status_changed",
"data": {
"pending_count": 2,
"running_count": 1,
"max_concurrency": 3,
"tasks": [...]
}
}

// Queue restored (after Gateway restart)
{
"type": "queue_restored",
"data": {
"pending_count": 3,
"running_recovered": 1
}
}

File Persistence​

Queue data is stored in ~/.viben/queue/ directory:

~/.viben/queue/
├── config.yaml # Queue configuration
├── state.yaml # Queue metadata
├── tasks/ # Task details
│ ├── task-{id}.yaml
│ └── ...
└── corrupted/ # Corrupted task files