diff options
Diffstat (limited to 'Omni')
| -rwxr-xr-x | Omni/Agent/start-worker.sh | 123 |
1 files changed, 108 insertions, 15 deletions
diff --git a/Omni/Agent/start-worker.sh b/Omni/Agent/start-worker.sh index e3a7200..d005156 100755 --- a/Omni/Agent/start-worker.sh +++ b/Omni/Agent/start-worker.sh @@ -12,9 +12,9 @@ TARGET="${1:-omni-worker-1}" # The first worktree listed is always the main one MAIN_REPO="$(git worktree list --porcelain | grep '^worktree ' | head -n 1 | cut -d ' ' -f 2)" AMP_BIN="$MAIN_REPO/node_modules/.bin/amp" +TASK_BIN="$MAIN_REPO/_/bin/task" # 2. Resolve Worker Path -# If TARGET is a directory, use it. Otherwise assume it's a sibling of MAIN_REPO. if [ -d "$TARGET" ]; then WORKER_PATH="$(realpath "$TARGET")" elif [ -d "$MAIN_REPO/../$TARGET" ]; then @@ -26,10 +26,14 @@ fi if [ ! -x "$AMP_BIN" ]; then echo "Error: Amp binary not found at '$AMP_BIN'." - echo "Please ensure npm dependencies are installed in the main repository." exit 1 fi +# Ensure task binary is built/available +if [ ! -x "$TASK_BIN" ]; then + echo "Warning: Task binary not found at '$TASK_BIN'. Assuming it's in path or build it first." +fi + echo "Starting Worker Agent Loop" echo " Worker Path: $WORKER_PATH" echo " Amp Binary: $AMP_BIN" @@ -37,28 +41,117 @@ echo " Log File: $WORKER_PATH/_/llm/amp.log" echo " Monitor: tail -f $WORKER_PATH/_/llm/amp.log" echo " Press Ctrl+C to stop." +# Function to sync tasks safely +sync_tasks() { + "$MAIN_REPO/Omni/Agent/sync-tasks.sh" "$@" +} + cd "$WORKER_PATH" # 3. The Worker Loop while true; do echo "----------------------------------------------------------------" - echo "$(date): Starting new agent session..." - - mkdir -p _/llm - "$AMP_BIN" --log-file "_/llm/amp.log" --dangerously-allow-all -x "You are a Worker Agent. Your goal is to process tasks from the task manager. + echo "$(date): Syncing and checking for work..." + + # A. Sync with Live + # We use 'git merge' to update our base branch from the shared 'live' ref + git checkout omni-worker-1 >/dev/null 2>&1 + git merge live --no-edit >/dev/null 2>&1 || echo "Warning: Merge conflict or issue merging live." + + # B. Sync Tasks + sync_tasks + + # C. Find Ready Work + # We use jq to parse the first task + # Note: task ready --json returns an array [...] + TASK_JSON=$("$TASK_BIN" ready --json 2>/dev/null | jq -r '.[0] // empty') + + if [ -z "$TASK_JSON" ]; then + echo "$(date): No ready tasks. Sleeping for 60s..." + sleep 60 + continue + fi + + TASK_ID=$(echo "$TASK_JSON" | jq -r '.taskId') + TASK_TITLE=$(echo "$TASK_JSON" | jq -r '.taskTitle') + TASK_NS=$(echo "$TASK_JSON" | jq -r '.taskNamespace // "root"') + + echo "$(date): Claiming task $TASK_ID: $TASK_TITLE" + + # D. Claim Task + "$TASK_BIN" update "$TASK_ID" in-progress >/dev/null + sync_tasks --commit >/dev/null + + # E. Prepare Branch + BRANCH_NAME="task/$TASK_ID" + if git show-ref --verify --quiet "refs/heads/$BRANCH_NAME"; then + echo "Resuming existing branch $BRANCH_NAME" + git checkout "$BRANCH_NAME" >/dev/null + else + echo "Creating new branch $BRANCH_NAME" + git checkout -b "$BRANCH_NAME" >/dev/null + fi + + # F. Execute Agent + echo "Launching Amp to implement task..." + + TASK_DETAILS=$("$TASK_BIN" show "$TASK_ID") + + # We construct a specific prompt for the agent + PROMPT="You are a Worker Agent. +Your goal is to implement the following task: - Step 1: Read 'Omni/Agent/WORKER_AGENT_GUIDE.md' to understand your workflow. - Step 2: Follow the 'Worker Loop' instructions exactly. +$TASK_DETAILS - Start by syncing tasks and checking for ready work. If no work is ready, exit." +INSTRUCTIONS: +1. Analyze the codebase (use finder/Grep) to understand where to make changes. +2. Implement the changes by editing files. +3. Run tests to verify your work (e.g., 'bild --test Omni/Namespace'). +4. Fix any errors found during testing. +5. Do NOT update the task status or manage git branches (the system handles that). +6. When finished and tested, exit. - EXIT_CODE=$? +Context: +- You are working in '$WORKER_PATH'. +- The task is in namespace '$TASK_NS'. +" - if [ $EXIT_CODE -ne 0 ]; then - echo "Agent exited with error code $EXIT_CODE. Sleeping for 10s..." - sleep 10 + mkdir -p _/llm + "$AMP_BIN" --log-file "_/llm/amp.log" --dangerously-allow-all -x "$PROMPT" + + AGENT_EXIT_CODE=$? + + if [ $AGENT_EXIT_CODE -eq 0 ]; then + echo "Agent finished successfully." + + # G. Submit Work + if [ -n "$(git status --porcelain)" ]; then + echo "Committing changes..." + git add . + git commit -m "feat: implement $TASK_ID" || true + else + echo "No changes to commit." + fi + + echo "Submitting for review..." + # Switch back to base + git checkout omni-worker-1 >/dev/null + + # Sync again (in case live moved) + git merge live --no-edit >/dev/null 2>&1 + sync_tasks + + # Update status + "$TASK_BIN" update "$TASK_ID" review >/dev/null + sync_tasks --commit >/dev/null + + echo "Task $TASK_ID submitted for review." + else - echo "Agent session finished. Sleeping for 5s..." - sleep 5 + echo "Agent failed (exit code $AGENT_EXIT_CODE). Sleeping for 10s before retrying..." + sleep 10 fi + + echo "Cooldown..." + sleep 5 done |
