summaryrefslogtreecommitdiff
path: root/Omni
AgeCommit message (Collapse)Author
2025-12-01Fix build errors in Jr modulesBen Sima
- Fix Worker.hs to use EngineError instead of tuple - Fix Types.hs imports for LazyText.encodeUtf8 and dayOfWeek - Remove duplicate SortOrder from Components.hs (import from Types.hs) - Add orphan instance pragmas to Pages.hs and Partials.hs - Clean up unused imports
2025-12-01Fix timeline partial to include cost/token metrics and controlsBen Sima
The HTMX-refreshed AgentEventsPartial was missing: - Cost/token summary in header - Live toggle button - Autoscroll toggle button - Comment form Now matches the full page renderUnifiedTimeline output.
2025-12-01Add lint warning for large files (>1000 lines)Ben Sima
Large files cause agent token bloat and edit_file failures. This adds a warning (not error) to encourage splitting. Task-Id: t-228
2025-12-01Refactor Web.hs into smaller modulesBen Sima
Split 3231-line Web.hs into focused submodules: - Types.hs (346 lines): Data types, forms, API definition - Components.hs (1464 lines): Reusable UI components - Pages.hs (866 lines): Full page ToHtml instances - Partials.hs (247 lines): HTMX partial ToHtml instances - Handlers.hs (642 lines): Servant handler implementations - Web.hs (39 lines): Main module with run function Reduces main file by 99%, preventing agent token bloat. Task-Id: t-226 Amp-Thread-ID: https://ampcode.com/threads/T-355fae3a-03e9-4bdb-a1c7-6132576bf601 Co-authored-by: Amp <amp@ampcode.com>
2025-12-01Strengthen prompt to stop immediately after tests passBen Sima
Jr was completing tasks but then going into verification loops, re-reading files and 'tracing through logic' after tests passed. This burned ~4 cents of extra cost on t-221. Made instructions more emphatic: - 'STOP IMMEDIATELY' with explicit list of what NOT to do - 'ANY further tool calls are wasted money' - Repeated in BUILD SYSTEM NOTES section Task-Id: t-227
2025-12-01Fix Recent Activity duplicating tasks on refreshBen Sima
Changed taskToUnixTs from round to ceiling to prevent sub-second timing issues where a task updated at e.g. 10:00:00.3 would round down to 10:00:00, causing the next poll with since=10:00:00 to include it again. Task-Id: t-221
2025-12-01Sort ready queue by priorityBen Sima
getReadyTasks now returns tasks sorted by: 1. Priority (P0 first, then P1, P2, etc.) 2. Creation time (oldest first within same priority) This ensures high-priority items are always at the top of both the CLI 'jr task ready' output and the web dashboard. Task-Id: t-220
2025-12-01Add prompt guidance for large file editingBen Sima
Instructs the agent to: - Use line ranges when reading large files (>500 lines) - Use minimal context for edit_file old_str matching - Re-read exact lines after failed edits - Stop after 2-3 failed edits to reconsider approach - Flag very large files (>2000 lines) for refactoring Task-Id: t-225
2025-12-01Add guardrail for repeated edit_file failuresBen Sima
Tracks 'old_str not found' errors from edit_file tool calls. After 5 consecutive failures, stops the agent to prevent burning tokens on impossible edits. This catches the pattern where the agent repeatedly tries to edit a large file with incorrect old_str matches, which was the root cause of t-222 exceeding its cost budget. Task-Id: t-224
2025-12-01Scale cost guardrail by task complexityBen Sima
Cost limits by complexity level: - Complexity 1: 50 cents - Complexity 2: 100 cents - Complexity 3: 200 cents (default) - Complexity 4: 400 cents - Complexity 5: 600 cents This prevents low-complexity tasks from burning budget while allowing complex tasks more room for iteration. Task-Id: t-223
2025-12-01Add --complexity flag to task update commandBen Sima
Allows updating complexity along with status in a single command: jr task update t-123 in-progress --complexity=3 Task-Id: t-222
2025-12-01Add autoscroll toggle button for timelineBen Sima
Adds a toggle button next to the LIVE indicator that controls whether the timeline auto-scrolls to new events. Default is ON. - renderAutoscrollToggle button with ⬇ icon - toggleAutoscroll() JS function tracks state - htmx:afterSettle checks autoscrollEnabled before scrolling - Blue styling to differentiate from green LIVE button Task-Id: t-222
2025-12-01Consolidate cost display in timeline header, remove Execution DetailsBen Sima
- Add cost/token summary to timeline header - Filter Cost events from timeline display - Remove Execution Details section (cost info now in header) - Remove unused renderExecutionDetails function Task-Id: t-216
2025-12-01Clicking LIVE label toggles live updates on/offBen Sima
- Add clickable LIVE toggle button that pauses/resumes timeline polling - Green pulsing when active, grey when paused - Uses htmx:beforeRequest event to cancel requests when paused - Increase duplicate tool call guardrail from 20 to 30 Task-Id: t-211
2025-12-01Revert "Agent log box auto-scrolls to bottom on updates"Ben Sima
This reverts commit 9c3034853c3cacea8a77358467acf46e75c982f5.
2025-12-01Show tool call arguments inline instead of JSON blobBen Sima
- Add formatToolCallSummary to extract key argument from JSON - Shows run_bash command, file paths for read/edit/write, patterns for search - Display summary inline in tool call header (e.g., run_bash: `ls -la`) - Increase token guardrail from 1M to 2M to prevent premature stops Task-Id: t-212
2025-12-01Agent log box auto-scrolls to bottom on updatesBen Sima
Simplify auto-scroll behavior to always scroll to bottom after HTMX swap, rather than checking if user is near bottom. This ensures latest messages are always visible as they come in. Task-Id: t-208
2025-12-01Replace HumanTask type with NeedsHelp statusBen Sima
- Remove HumanTask from TaskType enum (now Epic | WorkTask only) - Add NeedsHelp to Status enum for tasks requiring human guidance - Update getReadyTasks to filter NeedsHelp instead of HumanTask - Rename humanTasks to tasksNeedingHelp in HumanActionItems - Add CLI parsing for needs-help status in list/update commands - Add badge styling for NeedsHelp (amber/yellow theme) - Update all status pattern matches in tree view and print functions - Update tests to verify NeedsHelp exclusion from ready queue Task-Id: t-210
2025-12-01Fix task links in Recent Activity inheriting wrong hx-targetBen Sima
Links inside the recent-activity div were inheriting hx-target=#activity-list from the parent, causing page content to be swapped into the list item instead of navigating. Explicitly set hx-target=body on list group items.
2025-12-01Remove editing of commit message in hookBen Sima
This was cutting off jr's commit messages so now I have a bunch of commit messages that are just cut off in the middle. Ugh.
2025-12-01Bug: Recent Activity links and Load More button not working on homepageBen Sima
Good! The tests are passing. My fix addresses the JavaScript error by ma However, this might not fully solve the problem of links not working. Th The issue was that the JavaScript code in the `hx-vals` attribute used ` **Fix:** Changed the JavaScript expression from: ```javascript hx-vals="js:{since: this.dataset.newestTs}" ``` to: ```javascript hx-vals="js:{since: document.getElementById('recent-activity')?.dataset? ``` This uses optional chaining (`?.`) to safely access the data attribute a The tests pass, confirming the fix doesn't break existing functionality. Task-Id: t-176
2025-12-01Show task complexity on /tasks/<id> pageBen Sima
Perfect! The implementation is complete. Let me create a summary of what I have successfully implemented the task complexity indicator on the `/t 1. **Added `complexityBadge` function** in `Omni/Jr/Web.hs` (lines 685-6 - Creates a badge displaying the complexity with the ℂ symbol (comple - Format: "ℂ {1-5}" - Includes a tooltip "Task Complexity (1-5)" - Uses CSS classes for styling with different colors for each complex 2. **Integrated complexity badge into task detail page** in `Omni/Jr/Web - Added conditional rendering that only shows the badge if `taskCompl - Positioned after the priority badge with a separator (·) - Follows the same pattern as other metadata badges 3. **Added CSS styles** in `Omni/Jr/Web/Style.hs` (lines 696-713): - Base `.badge-complexity` style - Individual styles for each complexity level (1-5) with appropriate - Complexity 1: Green (easy task) - Complexity 2: Blue (moderate) - Complexity 3: Amber (medium complexity) - Complexity 4: Darker amber (high complexity) - Complexity 5: Red (very complex) - Used the ℂ (complex numbers) symbol as suggested in the task descripti - Made it non-editable (read-only badge) since complexity is set during - Only displays when complexity is set (handles `Maybe Int` gracefully) - Color scheme follows a gradient from green (easy) to red (complex) - Consistent with existing badge styling patterns in the UI ✅ All tests pass successfully with `bild --test Omni/Jr.hs` The feature is now complete and ready for use. Tasks with a complexity r Task-Id: t-207
2025-12-01Always bild on run.shBen Sima
Otherwise we end up running stale artifacts and that's no good.
2025-12-01Increase duplicate tool call guardrail limit from 5 to 20Ben Sima
The limit of 5 was too aggressive - reading 5 different files while exploring a codebase would trigger the guardrail. 20 allows for legitimate exploration while still catching infinite loops.
2025-12-01Add explicit dark text colors for comment and thought bubblesBen Sima
- Comment bubble: #1f2937 (dark gray) on #f3f4f6 background - Thought bubble: #78350f (dark amber) on #fef3c7 background
2025-12-01Fix timeline dark mode styling and render comments/thoughts as markdownBen Sima
- Add dark mode styles for comment-bubble and thought-bubble - Render comments with renderMarkdown instead of plain text - Render thoughts with renderMarkdown instead of renderTextWithNewlines - Remove unused renderTextWithNewlines function
2025-12-01Fix timeline and metrics HTMX partial issuesBen Sima
- Timeline partial now uses getAllEventsForTask instead of getEventsForSession so all events show after HTMX refresh, not just the latest session - Move Execution Details header outside HTMX swap target so it persists Task-Id: t-214, t-215
2025-12-01Add actor tracking for status changes and use unified timelineBen Sima
- updateTaskStatusWithActor logs status_change events to agent_events - Worker uses Junior actor for status changes - Jr review uses System/Human actors appropriately - CLI task update uses Human actor - Remove task_activity table schema (migrated to agent_events) - addComment now inserts into agent_events with event_type='comment' Task-Id: t-213
2025-12-01Remove separate Agent Log page, consolidate timeline stylesBen Sima
- Rename agentLogScrollScript to timelineScrollScript - Target .timeline-events instead of obsolete .agent-log class - Rename agentLogStyles to timelineEventStyles - Remove obsolete container styles (.agent-log-section, .agent-log-live, .agent-log) - Remove dark mode styles for obsolete classes Task-Id: t-213.6
2025-12-01Add actor column to agent_events tableBen Sima
- Add 'actor' column to agent_events table (human/junior/system) - Add System to CommentAuthor type (reused for actor) - Add SQL FromField/ToField instances for CommentAuthor - Update insertAgentEvent to accept actor parameter - Update all SELECT queries to include actor column - Update Worker.hs to pass actor for all event types - Guardrail events logged with System actor Migration: ALTER TABLE adds column with default 'junior' for existing rows. Task-Id: t-213.1
2025-12-01Fix code block display in task descriptions for light modeBen Sima
Light mode: light gray background (#f8f8f8) with dark text and subtle border Dark mode: dark background (#1e1e1e) with light text Previously used dark theme for both modes which had poor contrast in light mode. Task-Id: t-206
2025-12-01Make Result sections collapsible in Agent Log (collapsed by default)Ben Sima
Wrap entire tool result in a <details> element so it starts collapsed. User can click to expand and see full output. Task-Id: t-205
2025-12-01Add guardrails and progress tracking to Jr agentBen Sima
Implement runtime guardrails in Engine.hs: - Cost budget limit (default 200 cents) - Token budget limit (default 1M tokens) - Duplicate tool call detection (same tool called N times) - Test failure counting (bild --test failures) Add database-backed progress tracking: - Checkpoint events stored in agent_events table - Progress summary retrieved on retry attempts - Improved prompts emphasizing efficiency and autonomous operation Worker.hs improvements: - Uses guardrails configuration - Reports guardrail violations via callbacks - Better prompt structure for autonomous operation Task-Id: t-203
2025-12-01Render task comments as markdown in web viewBen Sima
Use renderMarkdown for comment text instead of plain text rendering. Comments now support formatting, code blocks, lists, etc. Task-Id: t-204
2025-12-01Jr -> Junior headerBen Sima
2025-12-01Improve Jr agent structure with progress file and incremental workflowBen Sima
Perfect! All changes are in place and working correctly. Let me create a I have successfully implemented the improvements to Jr Worker agent stru 1. **Progress File Tracking** - Added `readProgressFile` function to read `_/llm/${taskId}-progress - Added `buildProgressPrompt` function to include progress context in - Modified `runWithEngine` to load and include progress at the start 2. **Incremental Workflow Enforcement** - Updated base prompt to explicitly instruct: "Pick ONE specific chan - Added "INCREMENTAL WORKFLOW (IMPORTANT)" section with clear guidanc - Added instruction to write progress after each change - Emphasized that tasks may be run multiple times to complete all cha 3. **Explicit Verification** - Maintained existing requirement to run `bild --test` before complet - Added instruction to save progress only after tests pass - Clarified that code must be left in clean, testable state 4. **Avoid Redundant Testing** - Updated BUILD SYSTEM NOTES to clarify running `bild --test` on name - Added explicit instruction not to re-run tests unless more changes - Explained that bild handles dependencies transitively - `bild --test Omni/Agent/Worker.hs` - **PASSED** ✓ - `lint Omni/Agent/Worker.hs` - **NO ISSUES** ✓ - `_/llm/t-203-progress.md` - Progress file documenting this implementat - `_/llm/t-203-implementation-summary.md` - Detailed summary of changes The implementation follows industry best practices from Anthropic, OpenA - Reduced token usage through focused, incremental changes - Better code quality with isolated, tested changes - Improved reliability with progress tracking across sessions - Clear workflow preventing "declaring victory" too early Task-Id: t-203
2025-12-01Improve Worker.hs prompt to avoid redundant test/lint runsBen Sima
Perfect! The changes are exactly what we need. The diff shows that I've 1. ✅ `bild --test` on a namespace tests all its dependencies - no need t 2. ✅ Don't re-run tests after they already passed 3. ✅ Lint runs automatically via git hooks, so manual runs are optional I have successfully completed task t-202. The changes made to `Omni/Agen 1. **Explaining dependency handling**: Added explicit note that `bild -- 2. **Preventing redundant testing**: Added instruction to not re-run tes 3. **Clarifying lint automation**: Explained that lint runs automaticall All tests pass (`bild --test Omni/Agent/Worker.hs`) and all lint checks Task-Id: t-202
2025-12-01Fix agent event content double-encoding in web UIBen Sima
Excellent! The changes have been successfully applied. Let me create a s The issue was that agent event content was being double-encoded in the w 1. **ToolResult events** showed raw JSON like `{"output":"Replaced 1 occ 2. **Assistant messages** showed literal `\n` instead of actual newlines - In `Omni/Agent/Engine.hs` (line 600), tool results are JSON-encoded wh - These JSON strings are stored as-is in the database via `insertAgentEv - The Web UI was displaying these JSON strings directly without decoding - Assistant messages contained literal `\n` escape sequences that weren' I modified `Omni/Jr/Web.hs` with the following changes: 1. **Added import**: `Data.Aeson.KeyMap` to work with JSON objects 2. **Created helper function `renderTextWithNewlines`** (line 2545-2553) - Splits text on literal `\n` sequences - Renders each part with `<br>` tags between them - Used in `renderAssistantEvent` to properly display newlines 3. **Created helper function `renderDecodedToolResult`** (line 2555-2563 - Attempts to decode JSON content - Extracts the `output` field from the JSON object - Falls back to raw content if parsing fails - Used in `renderToolResultEvent` to show clean output instead of raw 4. **Updated `renderAssistantEvent`** (line 2473): - Changed from `Lucid.toHtml truncated` to `renderTextWithNewlines tr 5. **Updated `renderToolResultEvent`** (lines 2502-2503): - Changed both occurrences from `Lucid.toHtml content` to `renderDeco The build now passes successfully with `bild --test Omni/Jr/Web.hs`. Task-Id: t-200
2025-12-01Add author field to task comments (Human vs Junior)Ben Sima
Comments now track whether they were made by a Human or by Junior (the agent). The CommentAuthor type is stored in the database and displayed in the web UI with styled badges. Task-Id: t-201
2025-12-01Fix agent event content double-encoding in web UIBen Sima
Perfect! Everything passes. Let me create a final summary of what was do I successfully fixed the agent event content double-encoding issue in th - Agent events showed raw JSON with escaped quotes and literal `\n` in t - Example: ToolResult displayed `{"output":"Replaced 1 occurrence(s)","s - Assistant messages showed literal `\n` instead of newlines In `Omni/Agent/Worker.hs`, the `logEvent` helper function was wrapping t Modified `Omni/Agent/Worker.hs` to distinguish between text and structur 1. **Created two helper functions** (lines 250-256): - `logEventText`: Stores text content as-is without JSON encoding - `logEventJson`: JSON-encodes structured data (for Cost events) 2. **Updated all event logging calls** to use the appropriate function: - `engineOnAssistant`: Uses `logEventText` with plain message text - `engineOnToolCall`: Uses `logEventText` with plain tool call descri - `engineOnToolResult`: Uses `logEventText` with plain output text - `engineOnError`: Uses `logEventText` with plain error message - `engineOnComplete`: Uses `logEventText` with empty string - `engineOnCost`: Uses `logEventJson` for structured JSON (preserves 3. **No changes to Web.hs** were needed - the rendering functions alread ✅ `bild --test Omni/Jr/Web.hs` - PASSED ✅ `lint Omni/Agent/Worker.hs` - PASSED ✅ `lint Omni/Jr/Web.hs` - PASSED The fix is complete and ready for commit. Agent events will now display Task-Id: t-200
2025-12-01Fix cost reporting - parse actual cost from OpenRouter API responseBen Sima
Perfect! All tests pass for the affected modules. Now let me verify the I've successfully implemented the fix for cost reporting as specified in - Added `usageCost :: Maybe Double` field to the `Usage` data type - Updated `FromJSON` instance to parse the optional `cost` field from th - Modified `ChatCompletionRequest` ToJSON instance to include `"usage": - This enables OpenRouter to return actual cost information in the respo - Updated the `runAgent` loop to use actual cost from the API response w - Falls back to `estimateCost` when actual cost is not provided - Converts from dollars to cents (multiplies by 100) since OpenRouter re - The `engineOnCost` callback already uses `Double` for cost (not `Int`) - The `estimateCost` function already returns `Double`, avoiding integer - The `AgentResult` type already uses `Double` for `resultTotalCost` All tests pass successfully: - ✅ `Omni/Agent/Engine.hs` - All 14 tests pass, including new tests for - ✅ `Omni/Agent/Worker.hs` - Builds successfully - ✅ `Omni/Agent.hs` - All combined tests pass - ✅ All files pass lint checks (ormolu + hlint) The implementation correctly addresses all points in the task descriptio 1. ✅ Parses actual cost from OpenRouter API response 2. ✅ Enables usage accounting in requests 3. ✅ Uses Double for cost to avoid rounding issues 4. ✅ Falls back to estimation when actual cost is unavailable The previous error with `bild --test .` was due to `.` not being a valid Task-Id: t-197.8
2025-12-01Fix Worker.hs prompt to use lint instead of hlintBen Sima
Perfect! The changes have been successfully implemented. Let me summariz I've successfully updated the `buildBasePrompt` function in `Omni/Agent/ 1. **Line 320**: Changed "including hlint suggestions" → "including lint 2. **Line 324**: Changed "if hlint finds issues" → "if lint finds issues 3. **Line 325**: Changed "You must fix hlint suggestions like:" → "You m 4. **Removed lines 326-328**: Deleted the specific hlint suggestion exam - 'Use list comprehension' -> use [x | cond] instead of if/else - 'Avoid lambda' -> use function composition - 'Redundant bracket' -> remove unnecessary parens - Ran `bild --test Omni/Agent/Worker.hs` ✓ PASSED with no errors The prompt now correctly references the `lint` command instead of `hlint Task-Id: t-199
2025-12-01Replace llm CLI with Engine.chat in Jr.hsBen Sima
Perfect! All tests pass. Let me create a summary of the changes made: I've successfully replaced the `llm` CLI calls with `Engine.chat` in Jr. 1. **`addCompletionSummary` function (lines 604-624)**: - Removed `Process.readProcessWithExitCode "llm" []` call - Added OPENROUTER_API_KEY environment variable check - Replaced with `Engine.chat` using the same pattern as `generateEpic - Proper error handling for missing API key and API failures 2. **`extractFacts` function (lines 658-680)**: - Removed `Process.readProcessWithExitCode "llm" ["-s", ...]` call - Added OPENROUTER_API_KEY environment variable check - Replaced with `Engine.chat` using the same pattern as `generateEpic - Proper error handling for missing API key and API failures 3. **Dependency cleanup**: - Removed `-- : run llm` from the header (line 12) since we no longer - Both functions now use the OpenRouter API via `Engine.chat` - Graceful degradation when OPENROUTER_API_KEY is not set (warning messa - Consistent error handling pattern matching the existing `generateEpicS - All tests pass successfully - No hlint or ormolu issues The implementation follows the exact pattern shown in the task descripti Task-Id: t-198
2025-12-01Fix cost reporting - parse actual cost from OpenRouter API responseBen Sima
I have successfully completed task t-197.8 to fix cost reporting by pars **Omni/Agent/Engine.hs:** 1. Added `usageCost :: Maybe Double` field to the `Usage` type to captur 2. Updated `FromJSON` instance to parse the optional `"cost"` field 3. Modified `ChatCompletionRequest` ToJSON instance to include `"usage": 4. Changed cost types from `Int` to `Double` throughout (engineOnCost ca 5. Updated `estimateCost` to use floating-point division instead of inte 6. Modified `runAgent` to use actual cost from API when available, conve 7. Added new test case for parsing usage with cost field **Omni/Agent/Worker.hs:** 1. Updated `runWithEngine` signature to return `Double` for cost 2. Changed `totalCostRef` from `IORef Int` to `IORef Double` 3. Added rounding when storing cost in DB metrics to maintain backward c ✅ **All tests pass:** - Omni/Agent/Engine.hs - 16 unit tests pass - Omni/Agent/Worker.hs - Builds successfully - Omni/Agent.hs - All integration tests pass - Omni/Jr.hs - All 12 tests pass ✅ **All lint checks pass:** - No hlint issues - No ormolu formatting issues The implementation correctly handles OpenRouter's cost format (credits w Task-Id: t-197.8
2025-12-01Fix Agent Log scroll position reset on HTMX pollBen Sima
Perfect! Let me create a summary of what was implemented: I successfully implemented **Option A** (save/restore scroll position) f **File: `Omni/Jr/Web.hs`** (lines 2418-2419) Added two HTMX event handlers to the `pollAttrs` in the `renderAgentLogS 1. **`hx-on::before-request`**: Saves the current scroll position of the ```javascript var log = this.querySelector('.agent-log'); if(log) this.dataset.scro ``` 2. **`hx-on::after-swap`**: Restores the saved scroll position after the ```javascript var log = this.querySelector('.agent-log'); if(log && this.dataset.sc ``` - Before each HTMX poll request (every 3 seconds), the current scroll po - After the content is swapped (innerHTML replacement), the scroll posit - This preserves the user's reading position even though the DOM is comp - The existing auto-scroll behavior for the "near bottom" case is preser - ✅ `bild --test Omni/Jr.hs` - All tests pass (12/12) - ✅ `lint Omni/Jr/Web.hs` - No ormolu or hlint issues The fix is minimal, non-invasive, and uses HTMX's built-in event system Task-Id: t-197.7
2025-12-01Add jr task log CLI commandBen Sima
Perfect! Both output modes work correctly. The task has been successfull 1. ✅ Basic log viewing: `jr task log <id>` 2. ✅ Session-specific viewing: `jr task log <id> --session=<sid>` 3. ✅ Follow mode: `jr task log <id> --follow` (polls every 500ms) 4. ✅ JSON output: `jr task log <id> --json` 5. ✅ Human-readable formatting with timestamps 6. ✅ Proper event formatting for Assistant, ToolCall, ToolResult, Cost, 7. ✅ All tests pass 8. ✅ No lint or hlint issues The implementation was mostly complete when I started - I only needed to Task-Id: t-197.6
2025-12-01Add SSE streaming endpoint for agent eventsBen Sima
Perfect! The build passes with no errors. Let me create a summary docume I have successfully implemented the SSE streaming endpoint for agent eve - Returns Server-Sent Events stream of agent events - Uses `StreamGet NoFraming SSE (SourceIO ByteString)` type - Added `SSE` data type with proper `Accept` and `MimeRender` instanc - Sets `content-type: text/event-stream` **Key Functions:** - `streamAgentEvents`: Main streaming function that: - Fetches existing events from the database - Converts them to SSE format - Creates a streaming source that sends existing events first - `streamEventsStep`: Step function that: - Sends buffered existing events first - Polls for new events every 500ms - Checks if task is complete (status != InProgress) - Sends 'complete' event when session ends - Handles client disconnect gracefully via `Source.Stop` - `eventToSSE`: Converts StoredEvent to SSE format with proper JSON d - `assistant`: `{"content": "..."}` - `toolcall`: `{"tool": "tool_name", "args": {"data": "..."}}` - `toolresult`: `{"tool": "unknown", "success": true, "output": ".. - `cost`: `{"cost": "..."}` - `error`: `{"error": "..."}` - `complete`: `{}` - `formatSSE`: Formats messages in SSE format: ``` event: <event_type> data: <json_data> ``` ✅ Returns SSE stream of agent events ✅ Sends existing events first, then streams new ones ✅ Polls agent_events table every 500ms ✅ Sends 'complete' event when session ends ✅ Handles client disconnect gracefully ✅ Proper SSE format with event types and JSON data - `Control.Concurrent` for `threadDelay` - `Data.Aeson` for JSON encoding - `Servant.Types.SourceT` for streaming support The implementation follows the specification exactly, providing a real-t Task-Id: t-197.4
2025-12-01Show complexity in task detail viewBen Sima
Excellent! The implementation is complete and all tests pass. Let me pro I successfully implemented the task to show complexity in the task detai 1. **File Modified**: `Omni/Task/Core.hs` 2. **Function**: `showTaskDetailed` 3. **Change**: Added complexity display after the Priority line (lines 1 ```haskell case taskComplexity t of Nothing -> pure () Just c -> putText ("Complexity: " <> T.pack (show c) <> "/5") ``` This code: - Checks if the task has a complexity value set - If `Nothing`, does nothing (no complexity line is shown) - If `Just c`, displays "Complexity: X/5" where X is the complexity valu - ✅ `bild --test Omni/Task.hs` passed successfully - ✅ `lint Omni/Task/Core.hs` passed with no hlint warnings or errors - ✅ All existing tests continue to pass The implementation matches the exact specification provided in the task Task-Id: t-196
2025-12-01Add summary comment when individual task completesBen Sima
Excellent! All linting passes. Let me create a final comprehensive summa Task **t-193.3: Add summary comment when individual task completes** is The feature was **already fully implemented** in the codebase. No code c The `addCompletionSummary` function in `Omni/Jr.hs` (lines 589-617) auto 1. **Gathers commit information** when a task is accepted in review: - Git diff summary via `git show --stat` - Commit message via `git log -1 --format=%B` - List of modified files via `git diff-tree` 2. **Generates an LLM summary** using the `llm` CLI tool: - Passes task ID, commit message, files, and diff to the LLM - Requests a 2-4 sentence professional summary - Includes what was accomplished and key files modified 3. **Adds the summary as a task comment** using `TaskCore.addComment`: - Format: `## Completion Summary\n\n{llm-generated-text}` The function is called in two places: - **Line 427**: After auto-review accepts a task (tests pass) - **Line 508**: After interactive/human review accepts a task ✅ **All tests pass**: `bild --test Omni/Jr.hs` - 12/12 tests successful ✅ **Linting passes**: Both ormolu and hlint pass with no issues ✅ **Dependencies configured**: `llm` tool is included in build metadata ✅ Trigger after accepting task in review ✅ What files were modified ✅ Brief description of changes from LLM ✅ Use LLM to generate summary from diff ✅ Add as comment via TaskCore.addComment The implementation is working as specified and ready for use. Task-Id: t-193.3
2025-12-01Validate cwd exists before running bash commandsBen Sima
run_bash tool now checks if the working directory exists before executing. Previously invalid cwd caused system-level chdir error. Now returns clean tool error the agent can understand and react to.