| Age | Commit message (Collapse) | Author |
|
|
|
Timeline tool display:
- Grep/search: ✓ Grep pattern in filepath
- Read file: ✓ Read filepath @start-end
- Edit file: ✓ Edit filepath
- Bash: ϟ command (lightning bolt prompt)
- Tool results only shown for meaningful output
New search_and_read tool:
- Combines search + read in one operation
- Uses ripgrep --context for surrounding lines
- More efficient than separate search then read
Worker prompt updated to prefer search_and_read over
separate search + read_file calls
|
|
timelineScrollScript now checks autoscrollEnabled before scrolling
|
|
- Add ComplexityForm and ComplexityBadgePartial types
- Add /tasks/:id/complexity POST endpoint
- Add complexityBadgeWithForm component with dropdown
- Add complexity dropdown JS for keyboard navigation
- Add CSS styles for complexity dropdown
- Always show complexity badge (Set Complexity if none)
Task-Id: t-219
|
|
- Components.hs: Fix escaped quotes in renderFormattedJson
- Style.hs: Use overflowWrap instead of wordBreak for breakWord value
|
|
- 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
|
|
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.
|
|
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>
|
|
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
|
|
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
|
|
- 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
|
|
- 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
|
|
This reverts commit 9c3034853c3cacea8a77358467acf46e75c982f5.
|
|
- 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
|
|
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
|
|
- 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
|
|
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.
|
|
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
|
|
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
|
|
- Comment bubble: #1f2937 (dark gray) on #f3f4f6 background - Thought
bubble: #78350f (dark amber) on #fef3c7 background
|
|
- 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
|
|
- 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
|
|
- 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
|
|
- 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
|
|
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
|
|
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
|
|
Use renderMarkdown for comment text instead of plain text rendering.
Comments now support formatting, code blocks, lists, etc.
Task-Id: t-204
|
|
|
|
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! 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
|
|
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
|
|
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 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
|
|
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
|
|
Build and tests pass. The fix is complete - task descriptions now
render
Task-Id: t-187
|
|
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
|