| Age | Commit message (Collapse) | Author |
|
Use renderMarkdown for comment text instead of plain text rendering.
Comments now support formatting, code blocks, lists, etc.
Task-Id: t-204
|
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
The task **t-193.2: Generate summary comment when epic children
complete
1. ✅ `generateEpicSummary` function that uses LLM to generate
summaries 2. ✅ Integration with `checkEpicCompletion` to trigger
after epic transi 3. ✅ Prompt construction with epic info and child
task details 4. ✅ Comment addition via `TaskCore.addComment` 5. ✅
Error handling for missing API keys and LLM failures
1. ✅ **`getCommitFiles` function** (lines 731-758) - Extracts
and displa
- ✅ All 12 tests pass - ✅ No hlint warnings - ✅ No formatting
issues
The feature is fully functional and ready to use. When all children of
a 1. Transition the epic to Review status 2. Generate an AI summary
using Claude Sonnet 4.5 3. Add that summary as a comment on the epic
task 4. Include information about completed tasks, their commits,
and files m
Task-Id: t-193.2
|
|
Perfect! Let me verify the complete implementation checklist against
the
✅ **1. In Jr.hs, after accepting a task in review, call fact
extraction:
- Line 424: `extractFacts tid commitSha` - called in `autoReview`
aft - Line 504: `extractFacts tid commitSha` - called in
`interactiveRevi
✅ **2. Add extractFacts function:**
- Lines 585-600: Implemented with correct signature `extractFacts
:: - Gets diff using `git show --stat` - Loads task context -
Calls LLM CLI tool with `-s` flag - Handles success/failure cases
✅ **3. Add buildFactExtractionPrompt function:**
- Lines 603-620: Implemented with correct signature - Includes
task ID, title, description - Includes diff summary - Provides
clear instructions for fact extraction - Includes example format
✅ **4. Add parseFacts function:**
- Lines 623-627: Implemented with correct signature - Filters
lines starting with "FACT: " - Calls `addFactFromLine` for each fact
✅ **5. Add addFactFromLine function:**
- Lines 630-636: Implemented with correct signature - Removes "FACT:
" prefix - Parses file list from brackets - Calls `Fact.createFact`
with project="Omni", confidence=0.7, source - Prints confirmation
message
✅ **6. Add parseFiles helper function:**
- Lines 639-649: Implemented to parse `[file1, file2, ...]` format
✅ **7. Import for Omni.Fact module:**
- Line 22: `import qualified Omni.Fact as Fact` already present
✅ **8. Workflow integration:**
- Current: work -> review -> accept -> **fact extraction** ->
done ✅ - Fact extraction happens AFTER status update to Done -
Fact extraction happens BEFORE epic completion check
The implementation is **complete and correct**. All functionality
descri
1. ✅ Facts are extracted after task review acceptance (both auto
and man 2. ✅ LLM is called with proper context (task info + diff)
3. ✅ Facts are parsed and stored with correct metadata (source_task,
con 4. ✅ All tests pass (`bild --test Omni/Agent.hs`) 5. ✅ No
linting errors (`lint Omni/Jr.hs`)
The feature is ready for use and testing. When a task is completed
and a 1. The LLM will be prompted to extract facts 2. Any facts
learned will be added to the knowledge base 3. Each fact will have
`source_task` set to the task ID 4. Facts can be viewed with `jr
facts list`
Task-Id: t-185
|
|
- Add Omni/Agent/Event.hs with AgentEvent types
- Add agent_events table schema and CRUD functions to Core.hs
- Add new callbacks to Engine.hs: onAssistant, onToolResult, onComplete, onError
- Wire event logging into Worker.hs with session tracking
Events are now persisted to SQLite for each agent work session,
enabling visibility into agent reasoning and tool usage.
Task-Id: t-197.1
Task-Id: t-197.2
Task-Id: t-197.3
|
|
- Update OpenRouter model IDs to Claude 4.5 family:
- anthropic/claude-sonnet-4.5 (default) - anthropic/claude-haiku-4.5
(simple tasks) - anthropic/claude-opus-4.5 (complex tasks)
- Remove aider-chat from dev shell (broken, unused) - Simplify
llm package (remove llm-ollama plugin) - Update nixos-unstable for
llm 0.27.1
Task-Id: t-163
|
|
The fix is complete. I added the missing `complexity` column to the
`loa
```sql SELECT id, title, type, parent, namespace, status, priority,
complexity, ```
This matches the expected column order in the `FromRow Task`
instance at
Task-Id: t-195
|
|
All 33 tests pass. Let me verify the testing coverage against the
task c
**Testing Coverage Audit:**
- ✅ JSON roundtrip for Message, ToolCall, FunctionCall - ✅ Tool
schema validation (via encodeToolForApi test) - ✅ LLM config defaults
(defaultLLM tests) - ✅ Error handling for malformed responses
(tested in Usage/AgentResult
- ✅ Each tool has valid JSON schema (5 tests) - ✅ readFileTool
handles missing files - ✅ writeFileTool creates parent directories
(implicitly tested - return - ✅ editFileTool handles no-match case -
✅ runBashTool captures exit codes - ✅ searchCodebaseTool returns
structured results
- ✅ Engine and Tools integrate correctly (new test added) - Tool
execution works end-to-end (runBashTool, searchCodebaseTool tests -
Callbacks are testable (defaultEngineConfig test verifies callbacks fi
The task is complete. Created `Omni/Agent.hs` which provides:
1. Combined test runner for all Engine and Tools tests 2. Re-exports
core types from sub-modules 3. Integration tests verifying Engine
and Tools work together
All 33 tests pass with `bild --test Omni/Agent.hs`.
Task-Id: t-141.7
|
|
All tests pass and lint is clean. Let me verify the final test coverage
**Engine.hs Test Coverage (13 tests):** - ✅ Tool JSON roundtrip -
✅ Message JSON roundtrip - ✅ ToolCall JSON roundtrip (NEW) -
✅ FunctionCall JSON roundtrip (NEW) - ✅ Role JSON roundtrip
for all roles (NEW) - ✅ defaultLLM endpoint & headers - ✅
defaultAgentConfig defaults - ✅ defaultEngineConfig callbacks - ✅
buildToolMap correctness - ✅ Usage JSON parsing - ✅ AgentResult
JSON roundtrip - ✅ estimateCost calculation
**Tools.hs Test Coverage (19 tests):** - ✅ All 5 tool schemas are
valid objects - ✅ allTools contains 5 tools - ✅ ReadFileArgs
parsing - ✅ WriteFileArgs parsing - ✅ EditFileArgs parsing - ✅
RunBashArgs parsing - ✅ SearchCodebaseArgs parsing - ✅ ToolResult
success/failure JSON roundtrip - ✅ readFileTool handles missing files
(NEW) - ✅ editFileTool handles no-match case (NEW) - ✅ runBashTool
captures exit codes (NEW) - ✅ runBashTool captures stdout (NEW) -
✅ searchCodebaseTool returns structured results (NEW)
All unit tests from the checklist are now covered. The integration
and m
Task-Id: t-141.7
|
|
Both ormolu and hlint pass. The task asked specifically to run
`bild --t
Task-Id: t-163
|
|
Both the build test and lint pass. The fix was simple: the `llm`
package
Task-Id: t-163
|
|
The build passes. I updated the llm source from version 0.25 to
0.27.1 i
Task-Id: t-163
|
|
All done. Changes made:
1. **Web.hs**: Removed the retry-notes-section (form for saving notes)
a 2. **Web.hs**: Added hint text "Use comments below to provide
guidance f 3. **Style.hs**: Added `.retry-hint` style for the new
hint text 4. **Kept**: RetryContext.retryNotes field in Core.hs
(backward compat),
Task-Id: t-194
|
|
The build and tests pass. Let me provide a summary of the changes made:
Removed the amp dependency entirely from the codebase:
- Removed `runAmp` function (was running amp subprocess) - Removed
`shouldUseEngine` function (env var check `JR_USE_ENGINE`) - Removed
`monitorLog` and `waitForFile` helpers (for amp.log parsing) - Removed
unused imports: `System.IO`, `Data.Text.IO` - Made `runWithEngine`
the default/only path - Updated error messages from "amp" to "engine" -
Renamed `ampOutput` parameter to `agentOutput` in `formatCommitMessage
- Added `Data.IORef` import for `newIORef`, `modifyIORef'`, `readIORef`
- Removed amp.log parsing code: `LogEntry`, `processLogLine`,
`updateFro - Removed unused imports: `Data.Aeson`,
`Data.ByteString.Lazy`, `Data.Te
- Renamed `activityAmpThreadUrl` to `activityThreadUrl`
- Updated field references from `activityAmpThreadUrl` to
`activityThrea - Updated UI label from "Amp Thread:" to "Session:"
- Updated comment from "amp completes" to "engine completes"
- Updated `Amp.execute` to `Engine.runAgent` - Updated logging section
to describe Engine callbacks instead of amp.lo - Updated integration
test guidance to mock Engine instead of amp binary
Task-Id: t-141.6
|
|
All tests pass. Let me summarize the changes made:
- Added `taskComplexity :: Maybe Int` field to the `Task` data type
(1-5 - Updated SQL schema to include `complexity INTEGER` column -
Updated `FromRow` and `ToRow` instances to handle the new field -
Updated `tasksColumns` migration spec for automatic schema migration
- Updated `saveTask` to include complexity in SQL INSERT - Updated
`createTask` signature to accept `Maybe Int` for complexity
- Added `--complexity=<c>` option to the docopt help string -
Added complexity parsing in `create` command (validates 1-5 range)
- Added complexity parsing in `edit` command - Updated `modifyFn`
in edit to handle complexity updates - Updated all unit tests to
use new `createTask` signature with complexi - Added CLI tests for
`--complexity` flag parsing - Added unit tests for complexity field
storage and persistence
- Updated `selectModel` to use `selectModelByComplexity` based
on task c - Added `selectModelByComplexity :: Maybe Int -> Text`
function with map
- `Nothing` or 3-4 → `anthropic/claude-sonnet-4-20250514` (default)
- 1-2 → `anthropic/claude-haiku` (trivial/low complexity) - 5 →
`anthropic/claude-opus-4-20250514` (expert complexity)
- Updated `createTask` calls to include `Nothing` for complexity
Task-Id: t-141.5
|
|
Implementation complete. Summary of changes to
[Omni/Agent/Worker.hs](fi
1. **Added imports**: `Omni.Agent.Engine`, `Omni.Agent.Tools`,
`System.E
2. **Added `shouldUseEngine`** (L323-327): Checks `JR_USE_ENGINE=1`
envi
3. **Added `runWithEngine`** (L329-409): Native engine implementation
th
- Reads `OPENROUTER_API_KEY` from environment - Builds
`EngineConfig` with cost/activity/tool callbacks - Builds
`AgentConfig` with tools from `Tools.allTools` - Injects AGENTS.md,
facts, retry context - Returns `(ExitCode, Text, Int)` tuple
4. **Added `buildBasePrompt`** and `buildRetryPrompt`** (L411-465):
Help
5. **Added `selectModel`** (L467-471): Model selection (currently
always
6. **Updated `processTask`** (L92-120): Checks feature flag and
routes t
Task-Id: t-141.4
|
|
The implementation is complete. Here's a summary of the changes made:
1. **Updated LLM type** to include `llmExtraHeaders` field for
OpenRoute 2. **Changed `defaultLLM`** to use:
- OpenRouter base URL: `https://openrouter.ai/api/v1` - Default
model: `anthropic/claude-sonnet-4-20250514` - OpenRouter headers:
`HTTP-Referer` and `X-Title`
3. **Updated `chatWithUsage`** to apply extra headers to HTTP requests
4. **Added `case-insensitive` dependency** for proper header handling
5. **Added tests** for OpenRouter configuration 6. **Fixed hlint
suggestions** (Use `</` instead of `<$>`, eta reduce)
Task-Id: t-141.1
|
|
Both `bild --test` passes for Engine.hs and Tools.hs, and lint
passes. T
1. **readFileTool** - Reads file contents with optional line
range 2. **writeFileTool** - Creates/overwrites files (checks
parent dir exist 3. **editFileTool** - Search/replace with optional
replace_all flag 4. **runBashTool** - Executes shell commands, returns
stdout/stderr/exit 5. **searchCodebaseTool** - Ripgrep wrapper with
pattern, path, glob, ca
Plus **ToolResult** type and **allTools** export as required.
Task-Id: t-141.3
|
|
The implementation is complete. Here's what was implemented:
**Types Added:** - `EngineConfig`: Contains LLM provider config and
callbacks (`engineOnC - `AgentResult`: Results of running an agent
(finalMessage, toolCallCoun - `Usage`: Token usage from API responses -
`ChatResult`: Internal type for chat results with usage
**Functions Added:** - `runAgent :: EngineConfig -> AgentConfig
-> Text -> IO (Either Text Ag - `buildToolMap` - Creates a lookup
map from tool list - `executeToolCalls` - Executes tool calls and
returns tool messages - `estimateCost` / `estimateTotalCost` - Cost
estimation helpers - `chatWithUsage` - Chat that returns usage stats -
`defaultEngineConfig` - Default no-op engine configuration
**Loop Logic:** 1. Sends messages to LLM via `chatWithUsage` 2. If
response has tool_calls, executes each tool via `executeToolCalls`
3. Appends tool results as ToolRole messages 4. Repeats until no
tool_calls or maxIterations reached 5. Tracks cost/tokens and calls
callbacks at appropriate points
Task-Id: t-141.2
|
|
The implementation is complete. I created
[Omni/Agent/Engine.hs](file://
- **Types**: `Tool`, `LLM`, `AgentConfig`, `Message`, `Role`,
`ToolCall` - **Functions**: `chat` for OpenAI-compatible HTTP via
http-conduit, `de - **Tests**: JSON roundtrip for Tool, Message;
validation of defaults
All lints pass (hlint + ormolu) and tests pass.
Task-Id: t-141.1
|
|
All tests pass and lint is clean. The implementation is complete:
**Changes made:**
1. **Omni/Task/Core.hs:**
- Added `EpicForReview` data type to hold epic with progress info -
Added `HumanActionItems` data type to group all three categories -
Added `getHumanActionItems` function that returns:
- `failedTasks`: Tasks with retry_attempt >= 3 - `epicsInReview`:
Epics where all children are Done (and has at le - `humanTasks`:
HumanTask type tasks in Open status
2. **Omni/Jr/Web.hs:**
- Updated `InterventionPage` data type to use `HumanActionItems`
- Updated `interventionHandler` to call `getHumanActionItems` -
Rewrote `ToHtml InterventionPage` to show 3 sections with headers -
Added `renderEpicReviewCard` for epic review cards with "Approve &
- Renamed navbar link from "Intervention" to "Human Action"
Task-Id: t-193.5
|
|
The implementation is complete. Here's a summary of what was
implemented
**Changes to [Omni/Jr.hs](file:///home/ben/omni/Omni/Jr.hs):**
1. **`autoReview`** - Now adds a review comment with:
- Commit SHA (short) - Test target (namespace) - Result
(PASSED/FAILED) - Test output (truncated to 1000 chars) when
tests fail
2. **`interactiveReview`** - Now adds a human review comment with:
- Commit SHA (short) - Result (ACCEPTED/REJECTED) - Rejection reason
(when rejected)
3. **`handleConflict`** - Now adds a merge conflict comment with:
- Commit SHA (short) - Attempt number - List of conflicting files
4. **Helper functions added:**
- `buildReviewComment` - Formats auto-review results -
`buildHumanReviewComment` - Formats human review results -
`buildConflictComment` - Formats merge conflict info -
`truncateOutput` - Truncates long test output
Task-Id: t-193.4
|
|
Build and tests pass. The change has been successfully implemented
- Dra
Task-Id: t-192
|
|
Build and tests pass. The dark mode styles for the retry/failure banner
Task-Id: t-191
|
|
The build and tests pass. The dark mode styles for KB fact detail
page f
Task-Id: t-190
|
|
All tests pass. The implementation is complete:
**Summary of changes:**
1. **Omni/Task/Core.hs** - Added helper functions:
- `getBlockingImpact`: Counts how many tasks are transitively
blocked - `getTransitiveDependents`: Gets all tasks that depend
on a task (di - `dependsOnTask`: Helper to check if a task depends
on a given ID wi
2. **Omni/Jr/Web.hs** - Updated blocked page:
- Changed `BlockedPage` type to include blocking impact:
`[(TaskCore. - Updated `blockedHandler` to compute blocking impact
and sort by it - Added `renderBlockedTaskCard` to display tasks with
their blocking - Updated the info message to explain the sorting
3. **Omni/Jr/Web/Style.hs** - Added CSS:
- `.blocking-impact` badge style (light mode) - `.blocking-impact`
dark mode style
Task-Id: t-189
|
|
The AGENTS.md file has been updated correctly. The "Common Commands"
sec
Task-Id: t-188
|
|
Build and tests pass. The fix is complete - task descriptions now
render
Task-Id: t-187
|
|
All checks pass. The implementation is complete:
1. Added imports for `Data.List` and `Omni.Fact` 2. Added
`getRelevantFacts` function that retrieves facts for the task's
3. Added `formatFacts` and `formatFact` functions to format facts
for in 4. Updated `runAmp` to call `getRelevantFacts`, format them,
and append
Task-Id: t-186
|
|
Build and lint both pass. The implementation:
1. Updated `formatTask` in
[Omni/Agent/Worker.hs](file:///home/ben/omni/ 2. Extracted deps
formatting to a separate `formatDeps` helper for consi 3. Added
`formatComments` and `formatComment` helpers that show timestam
Task-Id: t-184
|
|
The build passes. The comments UI is already fully implemented in
the co
1. **Route**: `/tasks/:id/comment` with POST handler (line 226)
2. **Handler**: `taskCommentHandler` (lines 763-766) calls
`TaskCore.add 3. **Form type**: `CommentForm` (lines 374-379)
4. **Display section**: renders in `TaskDetailPage` (lines 1484-1490)
sh
- Comment count in header - Empty message if no comments - Each
comment with text and relative timestamp
5. **Comment form**: textarea with "Post Comment" button (lines
1553-156 6. **Helper function**: `renderComment` (lines 1547-1551)
7. **CSS**: Full styling in `Style.hs` including dark mode (lines
552-58
The implementation is complete and the build passes.
Task-Id: t-183
|
|
The build passes successfully. Let me provide a summary of the
changes m
I implemented the clickable priority dropdown on task detail pages,
mirr
1. **Added new API route** for priority updates:
```haskell "tasks" :> Capture "id" Text :> "priority" :> ReqBody
'[FormUrlEncode ```
2. **Added new types**:
- `PriorityBadgePartial` - partial response for HTMX updates -
`PriorityForm` - form data for priority changes with `FromForm` ins
3. **Added handler** `taskPriorityHandler` that updates task
priority vi
4. **Added priority dropdown components**:
- `priorityBadgeWithForm` - container with clickable badge and
dropdo - `clickablePriorityBadge` - the clickable badge showing
current prio - `priorityDropdownOptions` - dropdown menu with
P0-P4 options - `priorityOption` - individual priority option with
HTMX form
5. **Added JavaScript** `priorityDropdownJs` for dropdown toggle/close
b
6. **Updated task detail page** to use `priorityBadgeWithForm`
instead o
7. **Added `ToHtml` instance** for `PriorityBadgePartial`
1. **Added priority badge styles** for P0-P4 with appropriate colors
2. **Added priority dropdown styles** (mirroring status dropdown)
3. **Added dark mode styles** for priority badges and dropdown
Task-Id: t-182
|
|
The implementation is complete and all tests pass. Here's a summary
of w
1. Added `SortOrder` data type with 5 options: `SortNewest`,
`SortOldest 2. Added helper functions: `parseSortOrder`,
`sortOrderToParam`, `sortOr 3. Updated API routes to include `?sort=`
query param for `/ready`, `/bl 4. Updated page data types to include
`SortOrder` 5. Updated all list handlers to parse sort param and apply
sorting 6. Added `sortDropdown` component that renders a dropdown
with all sort 7. Added `sortOption` helper to render individual sort
options with acti 8. Updated all `ToHtml` instances for list pages
to render the sort drop
1. Added `sortDropdownStyles` for the page header row and sort dropdown
2. Added dark mode styles for the sort dropdown
Task-Id: t-181
|
|
The build and tests pass with no errors. The time range filter
feature f
**Implementation summary:** - Route accepts
`?range=today|week|month|all` query param - `TimeRange` type with
`Today`, `Week`, `Month`, `AllTime` variants - `homeHandler` filters
both tasks and activities by time range - Toggle buttons rendered
with `timeFilterBtn` helper - Full CSS styling in `timeFilterStyles`
with dark mode support - Default selection: "All Time"
Task-Id: t-180
|
|
The implementation is complete. The build passed with `bild --test
Omni/
**Summary of changes:**
1. **Omni/Task/Core.hs**: Added `getGlobalAggregatedMetrics ::
IO Aggreg
2. **Omni/Jr/Web.hs**:
- Updated `HomePage` data type to include `AggregatedMetrics`
paramet - Updated `homeHandler` to fetch global metrics via
`getGlobalAggrega - Updated `ToHtml HomePage` instance to add
two new cards: "Cost" (fo - Added helper functions `metricCard`,
`formatCost`, and `formatDurat
3. **Omni/Jr/Web/Style.hs**: Added `badge-neutral` CSS styling
(gray bor
Task-Id: t-179
|