Files
kandev/backend/dockerfiles/augment-agent/agent.sh
T
jcfs ba919305c2 Initial commit: Kandev with SQLite persistence and agent integration
Features:
- Unified Go binary running Task Service, Agent Manager, and Orchestrator
- SQLite persistence for boards, columns, and tasks
- Docker-based agent execution with ACP message streaming
- Augment Agent integration with session resumption support
- RESTful API for all operations (port 8080)
- In-memory event bus for service communication

Architecture:
- cmd/kandev: Single entry point for all services
- internal/task: Task, board, and column management
- internal/agent: Docker container lifecycle and ACP streaming
- internal/orchestrator: Agent coordination and monitoring
- internal/events: In-memory pub/sub event bus

Documentation:
- README.md: Project overview and quick start
- docs/ARCHITECTURE.md: System architecture (current + planned)
- docs/GETTING_STARTED.md: Development setup guide
- docs/IMPLEMENTATION_PLAN.md: Original microservices plan
- backend/NEXT_STEPS.md: Development roadmap
2026-01-10 01:30:24 +00:00

188 lines
6.1 KiB
Bash

#!/bin/bash
# Augment Agent - Integrates with Auggie CLI (Augment Code)
# Outputs ACP (Agent Communication Protocol) messages to stdout
set -e
# Common variables for ACP messages
AGENT_ID="${KANDEV_INSTANCE_ID:-unknown}"
TASK_ID="${KANDEV_TASK_ID:-${TASK_ID:-unknown}}"
# Helper function to output ACP messages
acp_message() {
local type="$1"
local content="$2"
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
jq -n -c \
--arg type "$type" \
--arg agentId "$AGENT_ID" \
--arg taskId "$TASK_ID" \
--arg timestamp "$timestamp" \
--arg content "$content" \
'{type: $type, agent_id: $agentId, task_id: $taskId, timestamp: $timestamp, data: {content: $content}}'
}
acp_progress() {
local progress="$1"
local message="$2"
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
jq -n -c \
--arg agentId "$AGENT_ID" \
--arg taskId "$TASK_ID" \
--arg timestamp "$timestamp" \
--arg message "$message" \
--argjson progress "$progress" \
'{type: "progress", agent_id: $agentId, task_id: $taskId, timestamp: $timestamp, data: {progress: $progress, message: $message}}'
}
acp_complete() {
local result="$1"
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
jq -n -c \
--arg agentId "$AGENT_ID" \
--arg taskId "$TASK_ID" \
--arg timestamp "$timestamp" \
--arg result "$result" \
'{type: "result", agent_id: $agentId, task_id: $taskId, timestamp: $timestamp, data: {status: "completed", summary: $result}}'
}
acp_error() {
local error="$1"
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
jq -n -c \
--arg agentId "$AGENT_ID" \
--arg taskId "$TASK_ID" \
--arg timestamp "$timestamp" \
--arg error "$error" \
'{type: "error", agent_id: $agentId, task_id: $taskId, timestamp: $timestamp, data: {error: $error}}'
}
# Session info message to store session_id for resumption
acp_session_info() {
local session_id="$1"
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
jq -n -c \
--arg agentId "$AGENT_ID" \
--arg taskId "$TASK_ID" \
--arg timestamp "$timestamp" \
--arg sessionId "$session_id" \
'{type: "session_info", agent_id: $agentId, task_id: $taskId, timestamp: $timestamp, data: {session_id: $sessionId}}'
}
# Main agent logic
main() {
acp_message "thinking" "Starting Auggie agent for task: ${TASK_TITLE:-No title}"
acp_progress 5 "Initializing Auggie CLI..."
# Check if auggie is available
if ! command -v auggie &> /dev/null; then
acp_error "Auggie CLI not found. Please ensure @augmentcode/auggie is installed."
exit 1
fi
# Check for authentication
# AUGMENT_SESSION_AUTH should contain the full session JSON (same format as ~/.augment/session.json)
if [ -z "$AUGMENT_SESSION_AUTH" ]; then
acp_error "AUGMENT_SESSION_AUTH environment variable is required for authentication. It should contain the full session JSON."
exit 1
fi
# Export for auggie to use
export AUGMENT_SESSION_AUTH
# Check for task description
if [ -z "$TASK_DESCRIPTION" ]; then
acp_error "TASK_DESCRIPTION environment variable is required."
exit 1
fi
# Check if we're resuming a session
if [ -n "$AUGGIE_SESSION_ID" ]; then
acp_progress 10 "Resuming Auggie session: $AUGGIE_SESSION_ID"
acp_message "thinking" "Continuing previous session with: $TASK_DESCRIPTION"
else
acp_progress 10 "Starting new Auggie session..."
acp_message "thinking" "Task: $TASK_DESCRIPTION"
fi
# Build auggie command
# --print: One-shot mode, output and exit
# --output-format json: Structured JSON output
AUGGIE_CMD="auggie --print --output-format json"
# Add workspace root if we're in a workspace
if [ -d "/workspace" ] && [ "$(ls -A /workspace 2>/dev/null)" ]; then
AUGGIE_CMD="$AUGGIE_CMD --workspace-root /workspace"
fi
# Resume session if session ID is provided
if [ -n "$AUGGIE_SESSION_ID" ]; then
AUGGIE_CMD="$AUGGIE_CMD --resume $AUGGIE_SESSION_ID"
fi
# Add the instruction
AUGGIE_CMD="$AUGGIE_CMD --instruction \"$TASK_DESCRIPTION\""
acp_progress 20 "Executing Auggie..."
# Run auggie and capture output
# The output will be JSON when using --output-format json
set +e
AUGGIE_OUTPUT=$(eval $AUGGIE_CMD 2>&1)
AUGGIE_EXIT_CODE=$?
set -e
acp_progress 90 "Processing Auggie output..."
# Check if auggie succeeded
if [ $AUGGIE_EXIT_CODE -ne 0 ]; then
acp_error "Auggie failed with exit code $AUGGIE_EXIT_CODE: $AUGGIE_OUTPUT"
exit $AUGGIE_EXIT_CODE
fi
# Extract session_id from auggie output for future resumption
local session_id=""
if echo "$AUGGIE_OUTPUT" | jq -e '.session_id' >/dev/null 2>&1; then
session_id=$(echo "$AUGGIE_OUTPUT" | jq -r '.session_id')
fi
# Output the session_id as a separate ACP message so the orchestrator can store it
if [ -n "$session_id" ]; then
acp_session_info "$session_id"
fi
# Output the auggie result as an ACP message
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Try to parse as JSON, if it fails, treat as plain text
if echo "$AUGGIE_OUTPUT" | jq -e . >/dev/null 2>&1; then
# Valid JSON output from auggie - wrap in ACP format
jq -n -c \
--arg agentId "$AGENT_ID" \
--arg taskId "$TASK_ID" \
--arg timestamp "$timestamp" \
--argjson output "$AUGGIE_OUTPUT" \
'{type: "auggie_result", agent_id: $agentId, task_id: $taskId, timestamp: $timestamp, data: {output: $output}}'
else
# Plain text output
jq -n -c \
--arg agentId "$AGENT_ID" \
--arg taskId "$TASK_ID" \
--arg timestamp "$timestamp" \
--arg output "$AUGGIE_OUTPUT" \
'{type: "auggie_result", agent_id: $agentId, task_id: $taskId, timestamp: $timestamp, data: {output: $output}}'
fi
acp_progress 100 "Task completed"
acp_complete "Auggie agent finished successfully"
}
# Run main and catch errors
main "$@" || acp_error "Agent failed: $?"