summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.tasks/tasks.jsonl12
-rw-r--r--Omni/Agent/Log.hs59
2 files changed, 44 insertions, 27 deletions
diff --git a/.tasks/tasks.jsonl b/.tasks/tasks.jsonl
index e5a8903..5f7c6c8 100644
--- a/.tasks/tasks.jsonl
+++ b/.tasks/tasks.jsonl
@@ -164,7 +164,7 @@
{"taskCreatedAt":"2025-11-21T22:31:20.872934097Z","taskDependencies":[],"taskDescription":null,"taskId":"t-rWblzNdp4.3","taskNamespace":null,"taskParent":"t-rWblzNdp4","taskPriority":"P2","taskStatus":"Done","taskTitle":"Implement smart base branch selection in Worker","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T22:36:36.614180518Z"}
{"taskCreatedAt":"2025-11-21T23:01:48.224051611Z","taskDependencies":[],"taskDescription":null,"taskId":"t-rWbnAjCJH","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Update start-worker.sh to use Haskell agent","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T01:34:02.545292575Z"}
{"taskCreatedAt":"2025-11-22T01:34:07.407341455Z","taskDependencies":[],"taskDescription":"Omni/Bild.hs:776 has a TODO: wrapper should just be removed, instead rely on upstream nixpkgs builders to make wrappers. This simplifies the codebase by removing manual bash script generation.","taskId":"t-rWbMpcV4v","taskNamespace":"Omni/Bild.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Remove manual wrapper generation in Omni/Bild","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T03:21:49.357422745Z"}
-{"taskCreatedAt":"2025-11-22T01:34:12.233596517Z","taskDependencies":[],"taskDescription":"Implement a metrics view in the Admin dashboard (Biz/PodcastItLater/Admin.py). Show total users, active subscriptions, and recent submission counts. Ref: Biz/PodcastItLater/DESIGN.md","taskId":"t-rwbmpxabk","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Review","taskTitle":"Implement metrics view in Admin dashboard","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T19:52:08.215223385Z"}
+{"taskCreatedAt":"2025-11-22T01:34:12.233596517Z","taskDependencies":[],"taskDescription":"Implement a metrics view in the Admin dashboard (Biz/PodcastItLater/Admin.py). Show total users, active subscriptions, and recent submission counts. Ref: Biz/PodcastItLater/DESIGN.md","taskId":"t-rwbmpxabk","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Implement metrics view in Admin dashboard","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T03:30:02.510477593Z"}
{"taskCreatedAt":"2025-11-22T01:34:19.451799517Z","taskDependencies":[],"taskDescription":"Update Omni/Agent/start-worker.sh to invoke the new Haskell-based agent binary ('agent start <name>') instead of running the legacy bash loop. Ensure it still sets up the environment correctly. The agent binary handles the loop internally.","taskId":"t-rWbMq1snX","taskNamespace":"Omni/Agent.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Update start-worker.sh to use Haskell agent","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T01:57:09.161716208Z"}
{"taskCreatedAt":"2025-11-22T02:13:44.805917094Z","taskDependencies":[],"taskDescription":"Modify Omni/Agent/Git.hs to proactively clean up stale rebase/merge states before attempting operations. The worker should attempt 'git rebase --abort' (ignoring errors) before syncing to prevent 'already rebase-merge' errors.","taskId":"t-rWbP06f2O","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Make worker agent robust to stale git states","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T02:14:40.413090556Z"}
{"taskCreatedAt":"2025-11-22T02:26:44.02456019Z","taskDependencies":[],"taskDescription":"Modify Omni/Agent/Git.hs to check for .git/rebase-merge or .git/rebase-apply before running git rebase --abort. This avoids blindly running abort commands.","taskId":"t-rWbPQPLps","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Detect in-progress rebase before aborting in Agent","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T02:27:45.377866012Z"}
@@ -196,7 +196,7 @@
{"taskCreatedAt":"2025-11-22T12:57:29.984013645Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2bkoma4nf","taskNamespace":"Omni.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Update AGENTS.md with commit message guidelines","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T12:59:00.994108608Z"}
{"taskCreatedAt":"2025-11-22T12:57:52.859363726Z","taskDependencies":[{"depId":"t-1o2bkoma4nf","depType":"Related"}],"taskDescription":null,"taskId":"t-1o2bkozwfdt","taskNamespace":"Omni.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Configure git commit template (.gitmessage)","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T12:59:25.14786599Z"}
{"taskCreatedAt":"2025-11-22T13:01:18.426816879Z","taskDependencies":[],"taskDescription":"Update repository setup scripts (e.g. Omni/Ide/hooks or task init) to automatically run 'git config commit.template .gitmessage' so all users get the template.","taskId":"t-1o2bkseag8u","taskNamespace":"Omni/Ide.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Automate git commit template configuration","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T18:56:46.2904441Z"}
-{"taskCreatedAt":"2025-11-22T13:03:21.434586142Z","taskDependencies":[],"taskDescription":"Move detailed documentation (Task Manager, Bild, Git Workflow) to separate README files in their respective namespaces. Keep AGENTS.md focused on critical rules, cheat sheets, and pointers to the detailed docs. Goal is to reduce token usage.","taskId":"t-1o2bkufixnc","taskNamespace":"Omni.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Review","taskTitle":"Refactor and condense AGENTS.md","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T19:05:00.617171774Z"}
+{"taskCreatedAt":"2025-11-22T13:03:21.434586142Z","taskDependencies":[],"taskDescription":"Move detailed documentation (Task Manager, Bild, Git Workflow) to separate README files in their respective namespaces. Keep AGENTS.md focused on critical rules, cheat sheets, and pointers to the detailed docs. Goal is to reduce token usage.","taskId":"t-1o2bkufixnc","taskNamespace":"Omni.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Refactor and condense AGENTS.md","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T03:30:14.384583642Z"}
{"taskCreatedAt":"2025-11-21T04:37:55.163249193Z","taskDependencies":[{"depId":"t-144gqry","depType":"DiscoveredFrom"}],"taskDescription":null,"taskId":"t-rwadhwrzt","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Fix bild failure for Biz/PodcastItLater/Web.py","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T14:32:24.679826325Z"}
{"taskCreatedAt":"2025-11-21T05:28:31.973657907Z","taskDependencies":[],"taskDescription":null,"taskId":"t-rwagbsb6w","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Add error handling tests for Worker","taskType":"WorkTask","taskUpdatedAt":"2025-11-21T05:40:59.255645021Z"}
{"taskCreatedAt":"2025-11-22T10:39:11.364170862Z","taskDependencies":[{"depId":"t-rwbmpxabk","depType":"DiscoveredFrom"}],"taskDescription":null,"taskId":"t-rwcm6todb","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Fix failing tests in Biz/PodcastItLater/Web.py (UsageLimits and EpisodeDetail)","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T14:32:24.762100815Z"}
@@ -210,6 +210,12 @@
{"taskCreatedAt":"2025-11-22T21:19:54.675769476Z","taskDependencies":[],"taskDescription":null,"taskId":"t-rwd249bi3","taskNamespace":"Omni/Task.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Test Approved Status","taskType":"WorkTask","taskUpdatedAt":"2025-11-22T21:20:10.652509625Z"}
{"taskCreatedAt":"2025-11-23T00:24:33.85216903Z","taskDependencies":[],"taskDescription":"Add HumanTask to TaskType in Omni/Task/Core.hs. Update 'task ready' and 'Omni/Agent/Worker.hs' to exclude HumanTask. Update docs (Omni/Task/README.md, AGENTS.md) to explain HumanTask usage.","taskId":"t-1o2c9vazf64","taskNamespace":"Omni/Task.hs","taskParent":null,"taskPriority":"P1","taskStatus":"Done","taskTitle":"Add HumanTask type to Task system","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T00:37:37.189983777Z"}
{"taskCreatedAt":"2025-11-23T00:25:37.243000855Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2c9wcq3go","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P1","taskStatus":"Open","taskTitle":"PodcastItLater: Mailgun Integration","taskType":"Epic","taskUpdatedAt":"2025-11-23T00:25:37.243000855Z"}
-{"taskCreatedAt":"2025-11-23T00:41:46.590529112Z","taskDependencies":[],"taskDescription":"Revert the agent status bar layout to use 5 vertical lines instead of 2 horizontal lines, as it is easier to read on small screens. Update Omni/Agent/Log.hs 'render' function and 'init' function (to reserve lines).","taskId":"t-1o2cacdulgn","taskNamespace":"Omni/Agent.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Review","taskTitle":"Restore vertical layout for Agent Status","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T00:50:41.302002061Z"}
+{"taskCreatedAt":"2025-11-23T00:41:46.590529112Z","taskDependencies":[],"taskDescription":"Revert the agent status bar layout to use 5 vertical lines instead of 2 horizontal lines, as it is easier to read on small screens. Update Omni/Agent/Log.hs 'render' function and 'init' function (to reserve lines).","taskId":"t-1o2cacdulgn","taskNamespace":"Omni/Agent.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Done","taskTitle":"Restore vertical layout for Agent Status","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T03:29:32.049530208Z"}
{"taskCreatedAt":"2025-11-23T00:42:49.682439567Z","taskDependencies":[],"taskDescription":"Sign up for Mailgun, configure domain podcastitlater.com, setup DNS, verify domain, and generate API Key.","taskId":"t-1o2c9wcq3go.1","taskNamespace":"Biz/PodcastItLater.hs","taskParent":"t-1o2c9wcq3go","taskPriority":"P2","taskStatus":"Review","taskTitle":"Setup Mailgun Infrastructure","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T00:53:26.321015678Z"}
{"taskCreatedAt":"2025-11-23T00:42:56.80437736Z","taskDependencies":[{"depId":"t-1o2c9wcq3go.1","depType":"Blocks"}],"taskDescription":"Implement Mailgun email sending in Biz/PodcastItLater/Mail.py. Use requests. Blocked by Setup Mailgun Infrastructure.","taskId":"t-1o2c9wcq3go.2","taskNamespace":"Biz/PodcastItLater.hs","taskParent":"t-1o2c9wcq3go","taskPriority":"P2","taskStatus":"Open","taskTitle":"Implement Mailgun Client","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T00:42:56.80437736Z"}
+{"taskCreatedAt":"2025-11-23T01:18:20.705021976Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2cbco62ly","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Review","taskTitle":"Build failed: Biz.nix - 1","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T01:40:40.156818957Z"}
+{"taskCreatedAt":"2025-11-23T01:20:43.938765636Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2cbf1fzh2","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Review","taskTitle":"Build failed: Biz/PodcastItLater/Episode.py - 1","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T01:57:40.248006534Z"}
+{"taskCreatedAt":"2025-11-23T01:21:11.642226289Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2cbfhxu5e","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P2","taskStatus":"InProgress","taskTitle":"Build failed: Biz/PodcastItLater/Test.py - 1","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T01:57:44.869123255Z"}
+{"taskCreatedAt":"2025-11-23T01:21:53.713796565Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2cbg6zl25","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Open","taskTitle":"Build failed: Biz/PodcastItLater/UI.py - 1","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T01:21:53.713796565Z"}
+{"taskCreatedAt":"2025-11-23T01:22:34.513743178Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2cbgva26h","taskNamespace":"Biz/PodcastItLater.hs","taskParent":null,"taskPriority":"P2","taskStatus":"Open","taskTitle":"Build failed: Biz/PodcastItLater/Worker.py - 1","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T01:22:34.513743178Z"}
+{"taskCreatedAt":"2025-11-23T01:32:43.559862931Z","taskDependencies":[],"taskDescription":null,"taskId":"t-1o2cbqxw13j","taskNamespace":null,"taskParent":null,"taskPriority":"P2","taskStatus":"Open","taskTitle":"Build failed: pyproject.toml - ","taskType":"WorkTask","taskUpdatedAt":"2025-11-23T01:32:43.559862931Z"}
diff --git a/Omni/Agent/Log.hs b/Omni/Agent/Log.hs
index 3f305d8..71a7aca 100644
--- a/Omni/Agent/Log.hs
+++ b/Omni/Agent/Log.hs
@@ -51,10 +51,13 @@ init :: Text -> IO ()
init workerName = do
IO.hSetBuffering IO.stderr IO.LineBuffering
writeIORef currentStatus (emptyStatus workerName)
- -- Reserve 2 lines at bottom
+ -- Reserve 5 lines at bottom
IO.hPutStrLn IO.stderr ""
IO.hPutStrLn IO.stderr ""
- ANSI.hCursorUp IO.stderr 2
+ IO.hPutStrLn IO.stderr ""
+ IO.hPutStrLn IO.stderr ""
+ IO.hPutStrLn IO.stderr ""
+ ANSI.hCursorUp IO.stderr 5
-- | Update the status
update :: (Status -> Status) -> IO ()
@@ -73,7 +76,13 @@ log msg = do
ANSI.hClearLine IO.stderr
ANSI.hCursorDown IO.stderr 1
ANSI.hClearLine IO.stderr
- ANSI.hCursorUp IO.stderr 1
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hClearLine IO.stderr
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hClearLine IO.stderr
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hClearLine IO.stderr
+ ANSI.hCursorUp IO.stderr 4
-- Print message (scrolls screen)
TIO.hPutStrLn IO.stderr msg
@@ -82,42 +91,44 @@ log msg = do
-- (Since we scrolled, we are now on the line above where the first status line should be)
render
--- | Render the two status lines
+-- | Render the five status lines
render :: IO ()
render = do
Status {..} <- readIORef currentStatus
-
- -- Line 1: Meta
- -- [Worker: name] Task: t-123 | Thread: T-abc | Files: 3 | Credits: $0.45 | Time: 05:23
let taskStr = maybe "None" identity statusTask
threadStr = maybe "None" identity statusThread
- meta =
- "[Worker: "
- <> statusWorker
- <> "] Task: "
- <> taskStr
- <> " | Thread: "
- <> threadStr
- <> " | Files: "
- <> tshow statusFiles
- <> " | Credits: $"
- <> tshow statusCredits
- <> " | Time: "
- <> statusTime
+ -- Line 1: Worker | Thread
+ ANSI.hSetCursorColumn IO.stderr 0
+ ANSI.hClearLine IO.stderr
+ TIO.hPutStr IO.stderr ("[Worker: " <> statusWorker <> "] Thread: " <> threadStr)
+
+ -- Line 2: Task
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hSetCursorColumn IO.stderr 0
+ ANSI.hClearLine IO.stderr
+ TIO.hPutStr IO.stderr ("Task: " <> taskStr)
+
+ -- Line 3: Files | Credits
+ ANSI.hCursorDown IO.stderr 1
+ ANSI.hSetCursorColumn IO.stderr 0
+ ANSI.hClearLine IO.stderr
+ TIO.hPutStr IO.stderr ("Files: " <> tshow statusFiles <> " | Credits: $" <> tshow statusCredits)
+
+ -- Line 4: Time
+ ANSI.hCursorDown IO.stderr 1
ANSI.hSetCursorColumn IO.stderr 0
ANSI.hClearLine IO.stderr
- TIO.hPutStr IO.stderr meta
+ TIO.hPutStr IO.stderr ("Time: " <> statusTime)
- -- Line 2: Activity
- -- [14:05:22] > Thinking...
+ -- Line 5: Activity
ANSI.hCursorDown IO.stderr 1
ANSI.hSetCursorColumn IO.stderr 0
ANSI.hClearLine IO.stderr
TIO.hPutStr IO.stderr ("> " <> statusActivity)
-- Return cursor to line 1
- ANSI.hCursorUp IO.stderr 1
+ ANSI.hCursorUp IO.stderr 4
IO.hFlush IO.stderr
-- | Log Entry from JSON