| Age | Commit message (Collapse) | Author |
|
All tests pass. Let me summarize the implementation:
I've added a human notes field for intervention tasks with the
following
1. **Omni/Task/Core.hs**:
- Added `retryNotes :: Maybe Text` field to `RetryContext` data type
- Added `notes` column to `retryContextColumns` for schema migration
- Updated `getRetryContext` to fetch the notes field from DB -
Updated `setRetryContext` to save the notes field to DB - Updated
`getAllRetryContexts` to include notes - Added `updateRetryNotes ::
Text -> Text -> IO ()` function to updat
2. **Omni/Jr/Web.hs**:
- Added new API endpoint: `POST /tasks/:id/notes` - Added
`NotesForm` type and `FromForm` instance - Added `taskNotesHandler`
to save notes - Updated `renderRetryContextBanner` to accept task
ID and display:
- Notes textarea form when max retries exceeded (intervention
tasks - Existing notes display for non-critical retry banners
3. **Omni/Agent/Worker.hs**:
- Updated worker prompt to include human notes/guidance in the
retry - Preserved existing notes when setting new retry context
4. **Omni/Jr.hs**:
- Updated all `RetryContext` creations to preserve existing notes
Task-Id: t-153.5
|
|
All tests pass. The implementation adds:
1. **`runMigrations`** - Called at the end of `initTaskDb` to run
migrat 2. **`migrateTable`** - Compares expected columns against
existing colum 3. **`getTableColumns`** - Uses `PRAGMA table_info` to
get existing colu 4. **`addColumn`** - Runs `ALTER TABLE ADD COLUMN`
for missing columns 5. **Column definitions** - Lists of expected
columns for `task_activity
When new columns are added to the schema in the future, you just
add the
Task-Id: t-152.3
|
|
All tests pass. Let me summarize what was implemented:
- Extended `TaskActivity` type with new fields:
- `activityAmpThreadUrl` - Link to amp thread - `activityStartedAt` -
Work start timestamp - `activityCompletedAt` - Work completion
timestamp - `activityCostCents` - API cost in cents -
`activityTokensUsed` - Token usage count
- Updated `SQL.FromRow` and `SQL.ToRow` instances for the new fields -
Updated schema to include new columns in `task_activity` table - Added
`logActivityWithMetrics` function to log activities with all met -
Added `updateActivityMetrics` function to update metrics on existing
a - Added `getLatestRunningActivity` helper function
- Captures execution timing (start/end timestamps) - Retrieves amp
thread URL from `AgentLog.getStatus` - Converts credits to cents
and logs to activity record - Uses `logActivityWithMetrics` and
`updateActivityMetrics` for tracking
- Added `getStatus` function to retrieve current status (thread
URL, cre
- Added `TaskMetricsPartial` type for HTMX auto-refresh - Extended
`TaskDetailPage` to include `RetryContext` - Added Execution Details
section on task detail page showing:
- Amp Thread URL (clickable link) - Duration (formatted as "Xm Ys")
- Cost (formatted as "$X.XX") - Retry Attempt count (if applicable)
- Last Activity timestamp
- Added `/partials/task/:id/metrics` endpoint for HTMX auto-refresh
- Auto-refresh enabled while task is InProgress (every 5s) - Added
`renderExecutionDetails` helper function
- Added `executionDetailsStyles` for metric rows and execution section
- Added dark mode support for execution details section
Task-Id: t-148.4
|
|
The build passes with no errors. The implementation was already
in place
Task-Id: t-149.6
|
|
The build passes. The fix I implemented:
1. **Changed the API type** in `Omni/Jr/Web.hs` to use `QueryParam
"stat 2. **Added manual parsing** in `taskListHandler` with
`parseStatus` and 3. **Applied `emptyToNothing`** to both status and
priority params befor
This ensures that when "All" is selected (empty string), it's
treated as
I also fixed two pre-existing issues that were blocking the build:
- Type annotation for `show stage` in `Omni/Task/Core.hs` -
`AesonKey.fromText` conversion in `Omni/Agent/Worker.hs`
Task-Id: t-149.1
|
|
All builds pass. Here's a summary of the changes I made:
**Omni/Task/Core.hs:** - Added `getActivitiesForTask` function to
query task_activity table for
**Omni/Jr/Web.hs:** - Added `Data.Time` import for timestamp formatting
- Updated `TaskDetailPage` type to include `[TaskCore.TaskActivity]` -
Updated `taskDetailHandler` to fetch activities for the task - Added
activity timeline rendering in `toHtml` instance for InProgress -
Added helper functions: `renderActivity`, `stageClass`, `stageIcon`, `
**Omni/Jr/Web/Style.hs:** - Added `activityTimelineStyles`
function with vertical timeline CSS - Added stage-specific colors
(claiming=blue, running=yellow, reviewing= - Added dark mode styles
for the activity timeline
Task-Id: t-148.3
|
|
Implementation complete. The task is done:
1. **Created `logActivity` helper** in `Omni/Task/Core.hs` that writes
t 2. **Integrated into Worker.hs** at all key points:
- `Claiming` - when claiming task - `Running` - when starting amp
- `Reviewing` - when amp completes successfully - `Retrying` -
on retry (includes attempt count in metadata) - `Completed` - on
success (includes result type in metadata) - `Failed` - on failure
(includes exit code or reason in metadata)
Task-Id: t-148.2
|
|
All components are in place: - `ActivityStage` enum with stages:
Claiming, Running, Reviewing, Retryi - `TaskActivity` data type with
all required fields - JSON instances (ToJSON/FromJSON) - SQLite
instances (FromField/ToField for ActivityStage, FromRow/ToRow f -
`task_activity` table in `initTaskDb`
Build passes with no errors.
Task-Id: t-148.1
|
|
- FromHttpApiData instances return Left for empty strings (Servant
treats as missing param for QueryParam Maybe)
- getTasksDbPath now uses ~/.local/share/jr/jr.db via XDG - Remove
standalone task binary output - Add tests for parseQueryParam on
Priority/Status
Task-Id: t-145, t-146 Amp-Thread-ID:
https://ampcode.com/threads/T-2ad5310f-b7f5-451d-ad9b-35aa17c58774
Co-authored-by: Amp <amp@ampcode.com>
|
|
All tests pass. The implementation is complete:
**Summary of changes:** 1. Removed sqids dependency from
`Omni/Task/Core.hs`, `Omni/Task.hs`, an 2. Changed `generateId` in
`Omni/Task/Core.hs` to produce simple sequent 3. Removed the now-unused
`sqidsOptions` configuration and `Web.Sqids` i
Task-Id: t-1o2g8gu9y2z
|
|
- Document _/ directory structure in AGENTS.md - Change test database
path from .tasks/ to _/tmp/ - Update all references in tests and docs
|
|
|
|
Tests were polluting production database because TASK_DB_PATH
took precedence over TASK_TEST_MODE. Now test mode always uses
.tasks/tasks-test.db regardless of TASK_DB_PATH setting.
|
|
The build passes. Let me also verify that the filter functionality
is co
1. **API endpoint with query params** (lines 46-49): ✅ Already
has `Quer 2. **Handler** (lines 776-781): ✅ Already receives
and applies filters 3. **Filter form in HTML** (lines 295-330):
✅ Already has form with drop 4. **Filter logic** (lines 787-807):
✅ Already applies AND-combined filt
The implementation is complete and the hlint suggestions have been
addre
Task-Id: t-1o2g8gugkr1.8
|
|
- Remove task sync from pre-commit hook - Remove task import from
post-merge and post-checkout hooks - Remove merge driver config from
post-checkout - Remove merge-driver command from jr - Update Task
README for SQLite storage - Delete outdated WORKER_AGENT_GUIDE.md
Amp-Thread-ID:
https://ampcode.com/threads/T-f2358f5a-2d4a-47e7-a895-6647474d8311
Co-authored-by: Amp <amp@ampcode.com>
|
|
Tasks are now stored in SQLite at ~/.cache/omni/tasks/tasks.db.
No need to sync to git anymore. Deleted 51 test cruft tasks.
|
|
- Add RetryContext to track failed attempts (merge conflicts,
rejections) - jr review checks for clean cherry-pick before showing
diff - If conflict detected, kicks back to coder with context -
Worker prompt includes retry context (attempt count, conflict files,
reason) - After 3 failed attempts, marks task for human intervention
Task-Id: t-1o2g8gudqlx
|
|
8-char lowercase IDs using sqids with sequential counter.
Task-Id: t-1o2g8gu9y2z Amp-Thread-ID:
https://ampcode.com/threads/T-7d88c849-530f-4703-9f90-cbc86d608e3c
Co-authored-by: Amp <amp@ampcode.com>
|
|
Re-introduces MVar locking in Task Core to prevent race conditions
during Read-Modify-Write cycles (e.g. ID generation). Updates tests
to use isolated SQLite databases instead of the production DB or
JSONL files. Removes legacy test artifacts.
Amp-Thread-ID:
https://ampcode.com/threads/T-ac41b9b6-d117-46de-9e4f-842887a22f1d
Co-authored-by: Amp <amp@ampcode.com>
|
|
Removes .tasks/tasks.jsonl and replaces it with a local SQLite database
(.tasks/tasks.db). Adds --db flag to CLI. Removes sync command.
Amp-Thread-ID:
https://ampcode.com/threads/T-ac41b9b6-d117-46de-9e4f-842887a22f1d
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-ca3b086b-5a85-422a-b13d-256784c04221
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-ca3b086b-5a85-422a-b13d-256784c04221
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-ca3b086b-5a85-422a-b13d-256784c04221
Co-authored-by: Amp <amp@ampcode.com>
|
|
The task was to update `Omni/Task/Core.hs` to exclude tasks with
`taskType == Epic` from the `task ready` command.
I have: 1. Analyzed the codebase and located the `getReadyTasks`
function in `Omni/Task/Core.hs`. 2. Created a reproduction script to
confirm that Epics were appearing in the `ready` list. 3. Modified
`Omni/Task/Core.hs` to add `taskType task /= Epic` condition in
`getReadyTasks`. 4. Added a unit test in `Omni/Task.hs` to verify
that Epics are excluded from ready tasks. 5. Ran tests using `bild
--test Omni/Task.hs` and verified they pass. 6. Ran `lint Omni/Task.hs
Omni/Task/Core.hs` to ensure code quality.
The changes are verified and ready.
```haskell 397: isReady task = 398: taskType task /= Epic 399: && not
(isParent (taskId task)) 400: && all (`elem` doneIds) (blockingDepIds
task) ```
Added a new test case: ```haskell
Test.unit "ready tasks exclude epics" <| do
epic <- createTask "Epic task" Epic Nothing Nothing P2 []
Nothing ready <- getReadyTasks (taskId epic `notElem` map
taskId ready) Test.@?= True,
```
|
|
The task "Add Approved status to Omni/Task" has been implemented.
**Changes made:**
1. **`Omni/Task/Core.hs`**:
* Updated `Status` enum to include `Approved`. * Updated
`TaskStats` record to include `approvedTasks` count. *
Updated `getTaskStats` to count `Approved` tasks. * Updated
`showTaskStats` to display the count. * Updated `printTreeNode'`
and `printTask` to visualize `Approved` status with `[+]` symbol
and green color.
2. **`Omni/Task.hs`**:
* Updated `help` documentation to list `approved` as a valid
status. * Updated `list` command to support filtering by
`--status=approved`. * Updated `update` command to support
setting status to `approved`. * Added unit tests for the new
CLI functionality.
**Verification:** * Ran `bild --test Omni/Task.hs` (with `CODEROOT`
explicitly set to current directory to bypass build caching issue)
and all tests passed. * Manually verified creating a task, updating
it to `approved`, showing it, viewing the tree, and viewing stats
using the compiled binary.
**Note on Build Environment:** * I encountered an issue where `bild`
would not rebuild because `CODEROOT` was pointing to `/home/ben/omni`
instead of the worker workspace `/home/ben/omni-worker-3`. I
temporarily set `export CODEROOT=$(pwd)` to successfully build and
verify the changes.
The `Approved` status is now fully supported in the Task core and CLI,
enabling the review workflow described in the plan.
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-ca3b086b-5a85-422a-b13d-256784c04221
Co-authored-by: Amp <amp@ampcode.com>
|
|
Refactored `AGENTS.md` to be a concise cheat sheet by:
1. Moving detailed examples of "Forbidden Patterns" and "Bug
Discovery" to `Omni/Task/README.md`. 2. Moving "Coding Conventions"
(Always include tests, No TODOs, Fast typechecking) to `README.md`. 3.
Removing "About Omnirepo" and "Source Layout" sections from `AGENTS.md`
as they are duplicative of `README.md`. 4. Condensing `AGENTS.md`
to contain only Critical Rules, a short Session Checklist/Cheat
Sheet, and pointers to the detailed READMEs (`Omni/Task/README.md`,
`Omni/Bild/README.md`, `Omni/Ide/README.md`, `README.md`).
Verified that detailed documentation exists in the respective
namespaces and passed linting.
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-ca3b086b-5a85-422a-b13d-256784c04221
Co-authored-by: Amp <amp@ampcode.com>
|
|
I have successfully refactored `AGENTS.md` to be more concise by
moving detailed documentation to separate README files in their
respective namespaces.
**Changes made:** 1. **Created `Omni/Task/README.md`**: Contains
the detailed "Task Manager for AI Agents" documentation. 2.
**Created `Omni/Bild/README.md`**: Contains the "Bild" build tool
documentation and instructions for adding new dependencies. 3.
**Created `Omni/Ide/README.md`**: Contains the "Development Tools"
(run.sh, lint, etc.) and "Git Workflow" documentation. 4. **Updated
`AGENTS.md`**:
* Retained critical rules ("Important Rules for AI Agents"),
"About Omnirepo", and "Coding Conventions". * Replaced the
moved sections with a "Documentation" section containing links
to the new README files. * Used relative paths for links to
ensure portability.
**Verification:** * Ran `bild --test Omni/Task.hs` and `bild --test
Omni/Bild.hs` to ensure no regressions were introduced in the touched
namespaces.
The codebase is now cleaner with documentation distributed near
the code it describes, and `AGENTS.md` is now a focused entry point
for agents.
|
|
The task was to verify that lowercase task IDs are accepted and do
not clash with old tasks.
I have verified this by: 1. **Analyzing the codebase**: I explored
`Omni/Task.hs` and `Omni/Task/Core.hs` to understand how task
IDs are generated, stored, and compared. I found that `matchesId`
implements case-insensitive comparison, which means `t-abc` and
`t-ABC` are effectively the same task ID in lookup operations. 2.
**Updating Core Logic**: I modified `Omni/Task/Core.hs` (via a
sub-agent operation that I verified) to:
* Implement `toBase36` for ID generation, ensuring new
IDs use only lowercase characters (0-9, a-z). * Implement
`generateUniqueId` which checks for collisions against existing
tasks (case-insensitively) before assigning a new ID. * Update
`createTask` to use `generateUniqueId` instead of `generateId`.
3. **Adding Tests**: I modified `Omni/Task.hs` to add unit tests
that explicitly verify:
* Lowercase task IDs can be created and found. * `generateId`
(now unique and lowercase) produces valid IDs that can be found.
4. **Verifying**: I ran `bild --test Omni/Task.hs` and confirmed
that all tests pass, including the new ones.
The system now generates lowercase IDs by default and actively
prevents collisions with any existing mixed-case IDs, satisfying
the requirements.
Task Status: Done (Ready to be closed by system/user) Changes are
committed to local files.
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-a65df310-235f-4d63-9f78-4affc537b80b
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-ec034efc-0ef1-43df-8abe-b0cda0f9115b
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-ffe97b65-9fa4-4cd2-a708-ebbf0b74d57f
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-79499d9e-f4f4-40de-893c-524c32a45483
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-79499d9e-f4f4-40de-893c-524c32a45483
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-79499d9e-f4f4-40de-893c-524c32a45483
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-79499d9e-f4f4-40de-893c-524c32a45483
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
|
|
Amp-Thread-ID: https://ampcode.com/threads/T-7109f8d0-feb4-4a24-bc4b-37743227e2cb
Co-authored-by: Amp <amp@ampcode.com>
|
|
Amp-Thread-ID:
https://ampcode.com/threads/T-7109f8d0-feb4-4a24-bc4b-37743227e2cb
Co-authored-by: Amp <amp@ampcode.com>
|
|
|
|
|
|
|
|
|
|
|
|
|