summaryrefslogtreecommitdiff
path: root/Omni
AgeCommit message (Collapse)Author
2025-11-30Remove amp dependency entirelyBen Sima
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
2025-11-30Add task complexity field and model selectionBen Sima
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
2025-11-30Replace amp subprocess with native Engine in WorkerBen Sima
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
2025-11-30Define Tool protocol and LLM provider abstractionBen Sima
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
2025-11-29Implement core coding tools (read, write, bash, search)Ben Sima
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
2025-11-29Implement agent loop with tool executionBen Sima
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
2025-11-29Define Tool protocol and LLM provider abstractionBen Sima
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
2025-11-29Expand intervention page to show all human action itemsBen Sima
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
2025-11-29Store agent review notes as task commentsBen Sima
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
2025-11-29Add Draft status option to task detail status dropdownBen Sima
Build and tests pass. The change has been successfully implemented - Dra Task-Id: t-192
2025-11-29Add dark mode styles for retry/failure banner on task detail pagesBen Sima
Build and tests pass. The dark mode styles for the retry/failure banner Task-Id: t-191
2025-11-29Add dark mode styles for KB fact detail page form elementsBen Sima
The build and tests pass. The dark mode styles for KB fact detail page f Task-Id: t-190
2025-11-29Sort /blocked page by blocking impact (transitive dependents)Ben Sima
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
2025-11-29Render task descriptions as markdown (not just epics)Ben Sima
Build and tests pass. The fix is complete - task descriptions now render Task-Id: t-187
2025-11-29Inject relevant facts into coder agent contextBen Sima
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
2025-11-29Inject task comments into agent context during work and reviewBen Sima
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
2025-11-29Add comments UI to task detail web pagesBen Sima
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
2025-11-29Add clickable priority dropdown on task detail pagesBen Sima
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
2025-11-29Add sorting options to task list pagesBen Sima
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
2025-11-29Add time range filter to homepage Task Status sectionBen Sima
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
2025-11-29Add cost and duration metrics to homepage Task Status sectionBen Sima
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
2025-11-29Fix Cancel button on description edit formBen Sima
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
2025-11-29Remove background and border from breadcrumbsBen Sima
Build and tests pass. I've removed the background and border from `.brea Task-Id: t-177
2025-11-29Inline description editing with HTMX view/edit swapBen Sima
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
2025-11-29Fix dark mode contrast for homepage stat card numbersBen Sima
Build and tests passed with no errors. Task-Id: t-174
2025-11-29Fix navbar dropdown click-to-toggle behaviorBen Sima
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
2025-11-29Add breadcrumbs navigation for task hierarchyBen Sima
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
2025-11-29Compact task detail metadata into inline Gerrit-style layoutBen Sima
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
2025-11-29Fix dark theme description text invisible on task detail pageBen Sima
The fix is complete. The build and tests pass. The change adds `color "# Task-Id: t-170
2025-11-29Fix Recent Activity pagination and refresh bugsBen Sima
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
2025-11-29Fix nullable SQL fieldBen Sima
2025-11-28Use HTMX hx-boost for smoother page navigationBen Sima
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
2025-11-28Add description edit form to task detail page in web UIBen Sima
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
2025-11-28Add comments field to tasks for providing extra contextBen Sima
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
2025-11-28Make task description a required field on createBen Sima
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
2025-11-28Fix llm tool installation - update nixpkgs hash in Biz/Bild.nixBen Sima
Done. I've updated the nixos-unstable hash in [Sources.json](/home/ben/o Task-Id: t-163
2025-11-28Fix llm tool installation - update nixpkgs hash in Biz/Bild.nixBen Sima
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
2025-11-28Fix llm tool installation - update nixpkgs hash in Biz/Bild.nixBen Sima
The build passed. The task was to update nixpkgs hash in Biz/Bild.nix, b Task-Id: t-163
2025-11-28Truncate task title to 52 characters in commit message subject lineBen Sima
The build and tests pass. The change is complete - the task title in com Task-Id: t-159
2025-11-28Remove Jr Dashboard header from homepageBen Sima
The build and tests pass. The "Jr Dashboard" header has been removed fro Task-Id: t-154.6
2025-11-28Add pagination to Recent Activity with HTMX load more buttonBen Sima
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
2025-11-28Add create fact form in web UIBen Sima
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
2025-11-28Add fact detail/edit view in web UIBen Sima
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
2025-11-28Create /kb web page listing facts with confidence scoresBen Sima
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
2025-11-28Implement jr facts list/show/add/delete CLI commandsBen Sima
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
2025-11-28Add Omni/Fact.hs core module with CRUD operationsBen Sima
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
2025-11-28Fix web UI bug in search filterBen Sima
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
2025-11-27Add Draft status for tasks not ready for jr to pickupBen Sima
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
2025-11-27Add Omni/Fact.hs core module with CRUD operationsBen Sima
The Omni/Fact.hs module is complete with CRUD operations: - **createFact**: Create a new fact with project, content, related files - **getFact**: Retrieve a fact by ID - **getAllFacts**: Get all facts from the database - **getFactsByProject**: Get facts filtered by project - **getFactsByFile**: Get facts related to a specific file - **updateFact**: Update an existing fact's content, related files, and - **deleteFact**: Delete a fact by ID The module properly re-exports the `Fact` data type from `Omni.Task.Core Task-Id: t-158.2
2025-11-27Exclude tasks with retry >= 3 from ready queueBen Sima
Tasks that have failed 3 or more times need human intervention and should not appear in the ready queue. This prevents infinite retry loops. Task-Id: t-164 Amp-Thread-ID: https://ampcode.com/threads/T-4c8bc88f-f8f9-4921-96e5-3b68552c0bc0 Co-authored-by: Amp <amp@ampcode.com>