summaryrefslogtreecommitdiff
path: root/Omni
diff options
context:
space:
mode:
Diffstat (limited to 'Omni')
-rw-r--r--Omni/Agent/DESIGN.md104
-rwxr-xr-xOmni/Agent/monitor-worker.sh47
-rwxr-xr-xOmni/Agent/start-worker.sh2
-rw-r--r--Omni/Task/DESIGN.md232
4 files changed, 384 insertions, 1 deletions
diff --git a/Omni/Agent/DESIGN.md b/Omni/Agent/DESIGN.md
new file mode 100644
index 0000000..c3fa792
--- /dev/null
+++ b/Omni/Agent/DESIGN.md
@@ -0,0 +1,104 @@
+# Multi-Agent System 2.0 Design
+
+**Goal:** Replace the current bash-script based worker system (`start-worker.sh`, etc.) with a robust, type-safe Haskell application `Omni/Agent.hs`.
+
+## 1. CLI Interface
+
+The `agent` command (compiled from `Omni/Agent.hs`) will provide a unified interface for managing workers.
+
+```bash
+agent start <name> [--background] # Start a worker (foreground by default, background with flag)
+agent stop <name> # Stop a background worker
+agent status # List all workers and their status
+agent log <name> [-f] # View/tail worker logs
+agent harvest # Harvest task updates from all workers
+agent sync # Sync local state with live (helper)
+```
+
+## 2. Module Structure (`Omni/Agent/`)
+
+We will refactor the bash logic into Haskell modules:
+
+- **Omni.Agent** (`Omni/Agent.hs`): Main entry point and CLI parsing (Docopt).
+- **Omni.Agent.Core**: Core data types and state management.
+- **Omni.Agent.Worker**: The worker loop logic (sync, claim, work, submit).
+- **Omni.Agent.Git**: Git operations (worktree, branch, merge, commit).
+- **Omni.Agent.Process**: Process management (PID files, signals).
+- **Omni.Agent.Log**: Log streaming and filtering (the "monitor" logic).
+
+## 3. Data Types
+
+```haskell
+data WorkerStatus
+ = Idle
+ | Syncing
+ | Working TaskId
+ | Submitting TaskId
+ | Error Text
+ deriving (Show, Eq, Generic)
+
+data Worker = Worker
+ { workerName :: Text
+ , workerPid :: Maybe Int
+ , workerStatus :: WorkerStatus
+ , workerPath :: FilePath
+ }
+```
+
+## 4. Implementation Details
+
+### 4.1 Worker Loop (`agent start`)
+The Haskell implementation should replicate the logic of `start-worker.sh` but with better error handling and logging.
+
+1. **Setup**: Ensure worktree exists (or create it).
+2. **Loop**:
+ - `Git.syncWithLive`
+ - `Task.sync`
+ - `task <- Task.findReady`
+ - If `task`:
+ - `Task.claim task`
+ - `Git.checkoutTaskBranch task`
+ - `Amp.execute prompt`
+ - `Git.commit`
+ - `Git.checkoutBase`
+ - `Task.submitReview task`
+ - Else: `sleep 60`
+
+### 4.2 Process Management
+- Store PIDs in `.tasks/workers/<name>.pid`.
+- `agent stop` sends SIGTERM to the PID.
+- `agent status` checks if PID is alive.
+
+### 4.3 Logging
+- Continue writing raw Amp logs to `_/llm/amp.log` in the worker directory.
+- `agent log` reads this file and applies the filtering logic (currently in `monitor-worker.sh` jq script) using Haskell (Aeson).
+- **Requirement:** Output must include timestamps for every event. Extract the `timestamp` field from the JSON log and format it (e.g., `[HH:MM:ss] 🤖 THOUGHT: ...`).
+
+### 4.4 Harvesting
+- Iterate over `.tasks/workers/` or `git worktree list`.
+- For each worker, extract `.tasks/tasks.jsonl` via `git show`.
+- Run `Task.import`.
+
+## 5. Migration Strategy
+
+1. **Parallel Existence**: Keep bash scripts while developing Haskell version.
+2. **Feature Parity**: Ensure `agent start` works exactly like `start-worker.sh`.
+3. **Cutover**: Update `WORKER_AGENT_GUIDE.md` to use `agent` command.
+4. **Cleanup**: Delete bash scripts.
+
+## 6. Testing Plan
+
+### 6.1 Unit Tests (`Omni/Agent/Test.hs`)
+- Test `Git` module commands (mocked).
+- Test `Log` filtering logic.
+- Test CLI argument parsing.
+
+### 6.2 Integration Tests
+- Create a temporary test repo.
+- Spawn a worker.
+- Mock `amp` binary (simple script that `echo "done"`).
+- Verify task moves from Open -> InProgress -> Review.
+
+## 7. References
+- `Omni/Agent/start-worker.sh` (Current implementation)
+- `Omni/Task.hs` (Task manager integration)
diff --git a/Omni/Agent/monitor-worker.sh b/Omni/Agent/monitor-worker.sh
new file mode 100755
index 0000000..2638e2d
--- /dev/null
+++ b/Omni/Agent/monitor-worker.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+set -e
+
+# Omni/Agent/monitor-worker.sh
+# Monitors the worker agent's activity by filtering the debug log.
+# Usage: ./Omni/Agent/monitor-worker.sh [worker-directory-name]
+
+WORKER_NAME="${1:-omni-worker-1}"
+REPO_ROOT="$(git rev-parse --show-toplevel)"
+WORKER_PATH="$REPO_ROOT/../$WORKER_NAME"
+LOG_FILE="$WORKER_PATH/_/llm/amp.log"
+
+if [ ! -f "$LOG_FILE" ]; then
+ echo "Waiting for log file at $LOG_FILE..."
+ while [ ! -f "$LOG_FILE" ]; do sleep 1; done
+fi
+
+echo "Monitoring Worker Agent in '$WORKER_PATH'..."
+echo "Press Ctrl+C to stop."
+echo "------------------------------------------------"
+
+# Tail the log and use jq to parse/filter relevant events
+# We handle JSON parse errors gracefully (in case of partial writes)
+tail -f "$LOG_FILE" | grep --line-buffered "^{" | jq -R -r '
+try (
+ fromjson |
+ if .message == "executing 1 tools in 1 batch(es)" then
+ "🤖 THOUGHT: Planning tool execution (" + (.batches[0][0] // "unknown") + ")"
+ elif .message == "Tool Bash - checking permissions" then
+ empty
+ elif .message == "Tool Bash permitted - action: allow" then
+ "🔧 TOOL: Bash command executed"
+ elif .toolName != null and .message == "Processing tool completion for ledger" then
+ "✅ TOOL: " + .toolName + " completed"
+ elif .message == "ide-fs" and .method == "readFile" then
+ "📂 READ: " + .path
+ elif .message == "System prompt build complete (no changes)" then
+ "🧠 THINKING..."
+ elif .message == "System prompt build complete (first build)" then
+ "🚀 STARTING new task context"
+ elif .level == "error" then
+ "❌ ERROR: " + .message
+ else
+ empty
+ end
+) catch empty
+'
diff --git a/Omni/Agent/start-worker.sh b/Omni/Agent/start-worker.sh
index d005156..25f325c 100755
--- a/Omni/Agent/start-worker.sh
+++ b/Omni/Agent/start-worker.sh
@@ -117,7 +117,7 @@ Context:
"
mkdir -p _/llm
- "$AMP_BIN" --log-file "_/llm/amp.log" --dangerously-allow-all -x "$PROMPT"
+ "$AMP_BIN" --log-level debug --log-file "_/llm/amp.log" --dangerously-allow-all -x "$PROMPT"
AGENT_EXIT_CODE=$?
diff --git a/Omni/Task/DESIGN.md b/Omni/Task/DESIGN.md
new file mode 100644
index 0000000..0dbf3b5
--- /dev/null
+++ b/Omni/Task/DESIGN.md
@@ -0,0 +1,232 @@
+# Task Manager Improvement Plan
+
+Based on beads project planning patterns, here are proposed improvements for Omni/Task.hs.
+
+## Current State
+
+**What we have:**
+- ✅ Basic CRUD operations (create, list, update, ready)
+- ✅ Dependency tracking (--deps for blocking)
+- ✅ JSONL storage with git sync
+- ✅ Short base62 task IDs
+- ✅ Optional namespace field
+- ✅ Project field for grouping
+- ✅ Three status levels (open, in-progress, done)
+
+**What we're missing:**
+- ❌ Multiple dependency types (blocks, discovered-from, parent-child, related)
+- ❌ Hierarchical task IDs (parent.1, parent.2)
+- ❌ Task types (epic vs task) - epics will replace "project"
+- ❌ Dependency tree visualization
+- ❌ Work discovery tracking
+- ❌ Epic/child task relationships
+
+## Proposed Improvements (Priority Order)
+
+### Phase 1: Core Features (High Priority)
+
+#### 1.1 Add Task Types (Epic vs Task)
+```haskell
+data TaskType = Epic | Task
+ deriving (Show, Eq, Generic)
+```
+
+**Benefits:**
+- Epics are containers for related tasks (replace "project" concept)
+- Tasks are the actual work items
+- Simple two-level hierarchy
+- Epic-based planning support
+
+**Schema Changes:**
+- Replace `taskProject :: Text` with `taskType :: TaskType`
+- Add `taskParent :: Maybe Text` for parent epic
+- Epics can contain tasks or other epics (for nested structure)
+
+**Commands:**
+```bash
+# Create an epic (container)
+task create "User Authentication System" --type=epic
+
+# Create tasks within an epic
+task create "Design API" --type=task --parent=t-abc123
+task create "Implement JWT" --type=task --parent=t-abc123
+
+# Create a sub-epic (optional, for complex projects)
+task create "OAuth Integration" --type=epic --parent=t-abc123
+```
+
+#### 1.2 Enhanced Dependency Types
+```haskell
+data DependencyType = Blocks | DiscoveredFrom | ParentChild | Related
+ deriving (Show, Eq, Generic)
+```
+
+**Benefits:**
+- Track work discovery context
+- Maintain audit trail
+- Support epic hierarchies
+
+**Commands:**
+```bash
+task create "Fix bug" project --discovered-from=t-abc123
+task create "Subtask 1" project --parent=t-epic-id
+task dep add t-123 t-124 --type=related
+```
+
+### Phase 2: Hierarchical Tasks (Medium Priority)
+
+#### 2.1 Parent-Child Task IDs
+**Pattern:** `t-abc123.1`, `t-abc123.2`, `t-abc123.3`
+
+**Benefits:**
+- Human-friendly sequential IDs under epic
+- Natural work breakdown
+- Up to 3 levels of nesting
+
+**Schema Changes:**
+```haskell
+data Task = Task
+ { ...
+ taskParent :: Maybe Text -- Parent task ID
+ ...
+ }
+
+-- New table for child counters
+CREATE TABLE child_counters (
+ parent_id TEXT PRIMARY KEY,
+ last_child INTEGER NOT NULL DEFAULT 0,
+ FOREIGN KEY (parent_id) REFERENCES tasks(id) ON DELETE CASCADE
+);
+```
+
+**Commands:**
+```bash
+task create "Design auth API" project --parent=t-abc123
+# Creates: t-abc123.1
+
+task create "Implement JWT" project --parent=t-abc123
+# Creates: t-abc123.2
+```
+
+#### 2.2 Dependency Tree Visualization
+```bash
+task tree t-epic-id
+# Shows:
+# t-abc123 [Epic] User Authentication System
+# t-abc123.1 [Task] Design auth API
+# t-abc123.2 [Task] Implement JWT
+# t-abc123.2.1 [Task] Add token generation
+# t-abc123.2.2 [Task] Add token validation
+# t-abc123.3 [Task] Add password hashing
+```
+
+### Phase 3: Project Management (Lower Priority)
+
+#### 3.1 Task Filtering and Queries
+```bash
+task list --type=epic
+task list --status=open
+task list --parent=t-epic-id # List all children
+```
+
+#### 3.2 Epic Statistics
+```bash
+task stats # Overall stats
+task stats --epic=t-abc123 # Epic-specific
+task progress t-epic-id # Epic completion %
+```
+
+#### 3.3 Discovered Work Tracking
+```bash
+task create "Found memory leak" project --discovered-from=t-abc123
+# Automatically links context
+# Shows in dependency tree as "discovered during t-abc123"
+```
+
+## Implementation Strategy
+
+### Milestone 1: Type System Foundations
+- [ ] Add TaskType enum (Epic | Task)
+- [ ] Add DependencyType enum
+- [ ] Update Task data structure (replace project with type and parent)
+- [ ] Update CLI commands
+- [ ] Update tests
+- [ ] Update AGENTS.md
+- [ ] Migration: existing tasks default to type=Task, project becomes epic name
+
+### Milestone 2: Enhanced Dependencies
+- [ ] Add `discovered-from` support
+- [ ] Add `related` dependency type
+- [ ] Track dependency metadata (who, when, why)
+- [ ] Update ready work algorithm to respect dependency types
+
+### Milestone 3: Hierarchical Structure
+- [ ] Add parent field to Task
+- [ ] Implement child ID generation (t-abc123.1)
+- [ ] Add child_counters table/storage
+- [ ] Update createTask to handle --parent flag
+- [ ] Implement parent-child dependency creation
+
+### Milestone 4: Visualization & Reporting
+- [ ] Implement `task tree` command
+- [ ] Implement `task stats` command
+- [ ] Implement `task progress` for epics
+- [ ] Add filtering by type, priority
+- [ ] Improve task list display with colors/formatting
+
+## Open Questions
+
+1. **Storage Format**: Should we keep JSONL or move to SQLite like beads?
+ - JSONL: Simple, git-friendly, human-readable
+ - SQLite: Fast queries, complex relationships, beads-compatible
+ - **Recommendation**: Start with JSONL, can add SQLite later for caching
+
+2. **Child Counter Storage**: Where to store child counters?
+ - Option A: Separate .tasks/counters.jsonl file
+ - Option B: In-memory during session, persist to JSONL
+ - Option C: Add SQLite just for this
+ - **Recommendation**: Option A - separate JSONL file
+
+3. **Dependency Storage**: How to store complex dependencies?
+ - Current: List of text IDs in task
+ - Beads: Separate dependencies table
+ - **Recommendation**: Add dependencies field with type info:
+ ```haskell
+ data Dependency = Dependency
+ { depId :: Text
+ , depType :: DependencyType
+ }
+ ```
+
+4. **Backward Compatibility**: How to handle existing tasks?
+ - Add sensible defaults (type=Task, priority=Medium)
+ - Migration script or auto-upgrade on load?
+ - **Recommendation**: Auto-upgrade with defaults on import
+
+## Benefits Summary
+
+**For AI Agents:**
+- Better work discovery and context tracking
+- Clearer project structure
+- Easier to understand what work is related
+- Natural way to break down large tasks
+
+**For Humans:**
+- Epic-based planning for large features
+- Priority-driven work queue
+- Visual dependency trees
+- Better project tracking and reporting
+
+**For Collaboration:**
+- Discovered work maintains context
+- Related work is easily found
+- Epic structure provides clear organization
+- Dependency tracking prevents duplicate work
+
+## Next Steps
+
+1. Create tasks for each milestone
+2. Start with Milestone 1 (Type System Foundations)
+3. Get feedback on hierarchical ID format
+4. Implement incrementally, test thoroughly
+5. Update AGENTS.md with new patterns