| Age | Commit message (Collapse) | Author |
|
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
|
|
The fix is complete:
1. Changed the Cancel element from `<a href="#">` to `<button
type="butt 2. Added button reset styling (transparent background,
no border, underl
The `<button>` element works better with HTMX because it doesn't
have th
Task-Id: t-178
|
|
Build and tests pass. I've removed the background and border from
`.brea
Task-Id: t-177
|
|
The implementation is complete. Here's a summary of the changes:
**Omni/Jr/Web.hs:** 1. Added new API routes for
`/tasks/:id/description/view` and `/tasks/:i 2. Added
`DescriptionViewPartial` and `DescriptionEditPartial` data
type 3. Added `ToHtml` instances for both partials with HTMX
attributes for v 4. Added handlers: `descriptionViewHandler`,
`descriptionEditHandler`, ` 5. Updated the TaskDetailPage render to
use the view partial instead of
**Omni/Jr/Web/Style.hs:** 1. Added `.description-block` container
styles 2. Added `.description-header` flex styles for header with
title and edi 3. Added `.edit-link` and `.cancel-link` styles (12px
font, blue for edi 4. Added dark mode overrides for the links
Task-Id: t-175
|
|
Build and tests passed with no errors.
Task-Id: t-174
|
|
The build passed with no errors. The implementation adds:
1. JavaScript click-toggle handler for navbar dropdowns (closes
all, the 2. Click-outside-to-close behavior 3. CSS rule for
`.navbar-dropdown.open` state to show dropdown content
Task-Id: t-173
|
|
The implementation is complete. Here's a summary of the changes made:
1. Added `Breadcrumb` data type and `Breadcrumbs` type alias
2. Added `pageBodyWithCrumbs` function that renders the page with
breadc 3. Added `renderBreadcrumbs` function to render the breadcrumb
navigatio 4. Added `getAncestors` helper to traverse task parent chain
5. Added `taskBreadcrumbs` helper to build breadcrumbs including parent
Updated all page ToHtml instances to use breadcrumbs: -
`ReadyQueuePage`: Jr > Ready Queue - `BlockedPage`: Jr > Blocked -
`InterventionPage`: Jr > Needs Intervention - `KBPage`: Jr > Knowledge
Base - `FactDetailPage`: Jr > Knowledge Base > Fact #N - `EpicsPage`:
Jr > Epics - `TaskListPage`: Jr > Tasks - `TaskDetailPage`: Jr >
Tasks > (parent chain) > task-id - `TaskReviewPage`: Jr > Tasks >
task-id > Review - `TaskDiffPage`: Jr > Tasks > task-id > Diff (short
hash) - `StatsPage`: Jr > Stats - `HomePage`: Uses regular `pageBody`
(no breadcrumbs)
Added `breadcrumbStyles` function with CSS for: -
`.breadcrumb-container`: Light gray background, subtle bottom border -
`.breadcrumb-list`: Flex layout with wrapping - `.breadcrumb-item`:
Flex items with gap - `.breadcrumb-sep`: Gray separator ">" -
`.breadcrumb-current`: Current page label (no link) - Link styling
for breadcrumb links
Added dark mode overrides for breadcrumbs in `darkModeStyles`.
Task-Id: t-172
|
|
The implementation is complete. Here's a summary of changes:
**Omni/Jr/Web.hs:** - Added `metaSep` helper function for the `·`
separator - Added top-level `priorityDesc` function mapping priority
levels to hum - Replaced the vertical `detail-row` layout with compact
inline `task-me
- Primary line: ID · Type · Status · Priority · Namespace
(optional) - Secondary line: Parent (optional) · Created · Updated
- Removed the shadowing local `priorityDesc` from the `where` clause
**Omni/Jr/Web/Style.hs:** - Added `taskMetaStyles` function with
styles for `.task-meta`, `.task-m - Added dark mode overrides for the
new task-meta classes - Registered `taskMetaStyles` in the stylesheet
Task-Id: t-171
|
|
The fix is complete. The build and tests pass. The change adds `color
"#
Task-Id: t-170
|
|
Build and tests pass. The implementation is complete:
**Summary of changes to
[Omni/Jr/Web.hs](file:///home/ben/omni/Omni/Jr/W
1. Added `Data.Time.Clock.POSIX` import for `posixSecondsToUTCTime` and
2. Replaced `RecentActivityPartial` with two new types:
- `RecentActivityNewPartial` - for auto-refresh (prepends new items)
- `RecentActivityMorePartial` - for "Load More" pagination
3. Updated API routes:
- `/partials/recent-activity-new?since=<unix-ts>` - returns new
items - `/partials/recent-activity-more?offset=<n>` - returns
paginated old
4. Updated `HomePage` render with proper HTMX attributes:
- Added `#recent-activity` ID and `data-newest-ts` attribute
- Added `#activity-list` ID for the list container - Added
`#activity-load-more` ID for the button - Updated hx-targets and
hx-swap attributes
5. Added `taskToUnixTs` helper function
6. Created two new ToHtml instances with OOB updates for button
replacem
Task-Id: t-169
|
|
|
|
The build and tests pass. The `hx-boost="true"` is already
implemented o
```haskell pageBody content =
Lucid.body_ [Lucid.makeAttribute "hx-boost" "true"] <| do
navbar content
```
This means: - All anchor tags (`<a>`) and forms within the body
will automatically u - Page content will be swapped via AJAX without
full page reloads - Scroll position is preserved, making navigation
feel snappier
The task appears to have already been implemented correctly. The
build p
Task-Id: t-151.5
|
|
The build and tests pass. The implementation adds a description
edit for
1. An expandable `<details>` section similar to the existing Epic
design 2. A textarea for editing the description 3. HTMX `hx-post`
for seamless update (with `hx-swap="none"` since the e 4. Also shows
"No description yet." message when description is empty (p
Task-Id: t-168
|
|
All tests pass. Here's a summary of the changes I made:
1. **Added `Comment` data type** in `Omni/Task/Core.hs` with
`commentTex 2. **Added `taskComments` field** to the `Task` type
to store a list of 3. **Updated database schema** with a `comments
TEXT` column (stored as 4. **Added SQL instances** for `[Comment]`
to serialize/deserialize 5. **Added `addComment` function** to
add timestamped comments to tasks 6. **Added CLI command** `task
comment <id> <message> [--json]` 7. **Updated `showTaskDetailed`**
to display comments in the detailed vi 8. **Added unit tests**
for comments functionality 9. **Added CLI tests** for the comment
command 10. **Fixed dependent files** (`Omni/Agent/Worker.hs` and
`Omni/Jr/Web.h
Task-Id: t-167
|
|
All tests pass. The changes are complete:
**Summary of changes:** 1. **Omni/Task/Core.hs**: Changed
`taskDescription` from `Maybe Text` to 2. **Omni/Task.hs**:
Made `--description` required on CLI `create` (pani
3. **Omni/Task/RaceTest.hs**: Updated test to provide descriptions
Task-Id: t-165
|
|
Done. I've updated the nixos-unstable hash in
[Sources.json](/home/ben/o
Task-Id: t-163
|
|
The fix is complete. Changed `python311.withPackages` to
`unstable.pytho
1. `python312` has the proper `llm` override defined in
Python.nix 2. `python311` only overrides `llm-ollama` and
`llm-sentence-transformer 3. Using `unstable` is consistent with
other AI tools in the same sectio
Task-Id: t-163
|
|
The build passed. The task was to update nixpkgs hash in Biz/Bild.nix,
b
Task-Id: t-163
|
|
The build and tests pass. The change is complete - the task title
in com
Task-Id: t-159
|
|
The build and tests pass. The "Jr Dashboard" header has been removed
fro
Task-Id: t-154.6
|
|
The implementation is complete. Here's a summary:
**Changes made:** 1. **API**: Added `QueryParam "offset" Int` to the
`/partials/recent-act 2. **Data types**:
- Updated `HomePage` to include a `Bool` for whether there are
more t - Updated `RecentActivityPartial` to include `nextOffset ::
Int` and
3. **Homepage rendering**: Shows a "Load More" button when there
are mor 4. **Partial rendering**: The `RecentActivityPartial` now
shows a "Load 5. **Handler**: `recentActivityHandler` now supports
pagination with off 6. **Styling**: Added CSS for `.load-more-btn`
and `.btn-secondary` clas
The HTMX integration uses: - `hx-get` to fetch the next page with
offset - `hx-target="closest .recent-activity"` to target the parent
container - `hx-swap="beforeend"` to append new items (including
another Load More
Task-Id: t-151.4
|
|
The build passes with no errors. The AGENTS.md update adds the
instructi
Task-Id: t-158.8
|
|
All tests pass. The create fact form has been added to the web
UI. Here'
1. **Added `FactCreateForm` data type** - New form type to handle the
cr 2. **Added API route** - `POST /kb/create` endpoint that accepts
the for 3. **Added handler** - `factCreateHandler` that creates a
new fact using 4. **Added form UI** - A collapsible form on the KB
page with fields for
- Project (required) - Fact Content (required textarea) - Related
Files (optional, comma-separated) - Confidence level (0.0-1.0,
default 0.8)
5. **Added CSS styles** - Styling for the create fact section in
both li
Task-Id: t-158.6
|
|
All tests pass with no warnings. The implementation is complete:
1. **Added new routes** (`/kb/:id`, `/kb/:id/edit`, `/kb/:id/delete`)
to 2. **Created `FactDetailPage` data type** with `FactDetailFound`
and `Fa 3. **Created `FactEditForm`** data type for handling
form submissions 4. **Added handlers** (`factDetailHandler`,
`factEditHandler`, `factDele 5. **Added `ToHtml` instance for
`FactDetailPage`** with:
- Detail view showing project, confidence, created date - Editable
content textarea - Related files input - Confidence slider -
Source task link - Danger zone with delete button
6. **Updated KB listing** to make facts clickable links to their
detail 7. **Added CSS styles** for form elements, buttons, danger zone,
and err
Task-Id: t-158.5
|
|
The implementation is complete. The `/kb` web page now:
1. Fetches all facts from the database via `Fact.getAllFacts`
2. Displays each fact in a card showing:
- Fact ID - Confidence score as a colored badge (green ≥80%,
yellow ≥50%, red < - Project name - Fact content - Related files
(if any) - Source task link (if any)
Task-Id: t-158.4
|
|
The build and tests pass. The hlint suggestions have been fixed:
1. Changed `Text.pack <$>` to `Text.pack </` on line 528 2. Replaced
the case expression with `maybe Fact.getAllFacts Fact.getFac 3. Changed
`Text.pack <$>` to `Text.pack </` on line 555
Task-Id: t-158.3
|
|
All task management commands should go through the jr CLI wrapper.
|
|
The build passes now. The task was to add `Omni/Fact.hs` with CRUD
opera
- `createFact` - Creates a new fact - `getFact` - Gets a fact by ID -
`getAllFacts` - Gets all facts - `getFactsByProject` - Gets facts
for a project - `getFactsByFile` - Gets facts related to a file -
`updateFact` - Updates an existing fact - `deleteFact` - Deletes a
fact by ID
The actual fix needed was completing the pattern matches in
`Omni/Jr/Web
Task-Id: t-158.2
|
|
This allows Servant's QueryParam Maybe to treat Left as "parameter not
provided", so the 'All' filter option (which sends empty string value)
now works correctly instead of causing an "Invalid priority" error.
Task-Id: t-146
|
|
All changes are in place. The build and tests pass. The implementation
i
1. **Added `Draft` to Status enum** - First in sequence: `Draft |
Open | 2. **Excluded Draft from getReadyTasks** - Uses `taskStatus
t `elem` [Op 3. **CLI support** - `task update <id> draft` works,
`task list --status 4. **Display coloring** - Draft shows in gray
with `[.]` indicator in tr 5. **TaskStats** - Added `draftTasks`
field and display in stats output 6. **Tests** - Added unit test for
draft exclusion from ready tasks and
Task-Id: t-166
|