Commit Graph

1372 Commits

Author SHA1 Message Date
Carlos Florêncio e983cb1be1 feat: show session config in message metadata (#1354) 2026-06-13 22:32:12 +01:00
Carlos Florêncio f444fba455 perf(chat): eliminate redundant re-renders and markdown re-parsing (#1357) 2026-06-13 19:26:54 +01:00
Carlos Florêncio 224383c557 chore: improve PR fixup and E2E harness guidance (#1351) 2026-06-13 18:59:44 +01:00
José Almeida 42556971ef feat(web): tabbed multi-PR CI popover for topbar button and chat status chip (#1356)
* feat(web): tabbed multi-PR CI popover for topbar button and chat status chip

* test(e2e): cover multi-PR CI popover tabs, chip aggregate, and dropdown

* fix(web): address multi-PR popover review feedback

- suppress hover popover while the PR dropdown is open (no stacked overlays)
- repo-scope tab testids so same-number PRs on different repos stay unique
- guard non-array taskPRs store value in PRStatusChip (same as PRTaskIcon)
- add tablist/tab/aria-selected semantics to the popover tabs

* fix(web): warm default PR only, skip terminal PRs, add tabpanel ARIA

- chip background-sync warms pickDefaultPR (the tab the popover opens), not list head
- PRFeedbackWarmer skips merged/closed PRs (no wasted fetches in topbar path)
- tabpanel role + aria-controls/labelledby wire tabs to the panel

* fix(web): complete ARIA tabs keyboard model in multi-PR popover

- roving tabindex: only the active tab in the page tab order
- ArrowLeft/ArrowRight move selection + focus within the tablist (wrapping)
- stable useId-scoped tabpanel id so every tab's aria-controls resolves
- document topbar-only scoping of prCheckGroup e2e helpers

* refactor(web): skip duplicate rank call for first PR in pickDefaultPR
2026-06-12 19:34:27 +01:00
José Almeida d145874e3b perf(web): eliminate sidebar close lag with many tasks (#1355)
* perf(web): eliminate sidebar close lag with many tasks

Closing the app sidebar unmounted the entire task list in the same frame
the width animation started, so close lag scaled with task count.

- Keep the Tasks grow-section mounted but CSS-hidden in rail mode:
  collapse is now O(1) and reopening is instant (no remount).
- Memoize onToggleGroup so TaskSwitcher's memo() holds; an inline arrow
  re-rendered every task row on each sidebar render.
- Animate only width (transition-[width]) instead of transition-all.
- content-visibility:auto on task blocks skips layout/paint for rows
  outside the sidebar scrollport in long lists.

* test(web): add round-trip collapse/expand assertion to sidebar section test
2026-06-12 14:49:23 +01:00
github-actions[bot] a92a8ac469 release: 0.58.0 v0.58.0 2026-06-12 09:24:31 +00:00
Carlos Florêncio 7eec66836b fix: hide sidebar footer urls on hover (#1348) 2026-06-12 09:50:35 +01:00
Nicolas Lenepveu ede3e20300 fix(web): restore Sentry entry in settings integrations nav (#1350) 2026-06-12 08:56:46 +01:00
Carlos Florêncio 8d0493d1a4 fix: persist session runtime config (#1346) 2026-06-12 08:56:14 +01:00
Carlos Florêncio 418beaf11b fix: move changes stage action to file icon slot (#1349) 2026-06-12 08:54:50 +01:00
Nicolas Lenepveu 66e2ed226d fix(orchestrator): apply max inflight cap to Sentry watcher tasks (#1326) 2026-06-11 23:13:56 +01:00
Carlos Florêncio 283e3514d1 docs: update readme and e2e skill with missing executors, integrations, agents (#1347) 2026-06-11 23:05:08 +01:00
Carlos Florêncio 0d69fc1078 fix(office): route setup cancel to homepage (#1333) 2026-06-11 22:41:35 +01:00
Carlos Florêncio 7c336e6567 feat(terminal): indicate pending close state (#1334) 2026-06-11 22:28:07 +01:00
Carlos Florêncio 1ba3f086d6 fix(web): update session tab title on model changes (#1335) 2026-06-11 22:27:06 +01:00
Carlos Florêncio 326297c3e7 fix(agent): avoid oversized env spawn failures (#1344) 2026-06-11 22:25:58 +01:00
Carlos Florêncio 83b112a388 fix(web): restore default layout during session preparation (#1343) 2026-06-11 22:23:48 +01:00
Carlos Florêncio 0a4ba464a7 fix(web): suppress archive success toast (#1345) 2026-06-11 22:23:38 +01:00
Carlos Florêncio 575da3c81a fix: reset xterm before terminal reconnect (#1342) 2026-06-11 21:17:47 +01:00
Carlos Florêncio c7b1c106e8 fix: de-flake e2e resume flicker, WS-subscribe race, and agent-boot contention (#1338) 2026-06-11 21:15:56 +01:00
João Salavisa fc01fa37cb fix(linear): match issue identifier (ENG-123) in search (#1340)
* fix(linear): match issue identifier (ENG-123) in search

Linear's `searchableContent` filter never matches the issue identifier
(team key + number), so a query like `ENG-123` from the Linear view
returned no results. When the query parses as a `TEAM-NUM` identifier,
OR-combine the content match with `{team.key.eq, number.eq}` so the
exact issue surfaces while other filters keep AND-joining. Lowercase
inputs (`eng-123`) are normalized to the upper-case team key.

Fixes #1339

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(linear): mention ID in search box placeholder

Reflect the backend's new identifier-aware search by hinting at it in
the search input on `/linear`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* docs(linear): explain why identifier search keeps both OR branches

claude[bot] flagged the searchableContent branch in the identifier OR
as functionally dead and the surrounding comment as a sentence fragment.
The branch is intentional — it catches cross-references like "duplicate
of ENG-123" pasted into another issue's title or description, which the
exact team+number branch would miss. Rewrite the comment to explain
that, fixing the fragment in the same change.

* fix(linear): use canonical identifier form in searchableContent OR branch

greptile flagged that the `searchableContent.contains` branch in the
identifier OR was sent verbatim from user input. When the user typed
`eng-123`, Linear's case-sensitive `contains` filter would miss
cross-references written in the canonical form `ENG-123`. Normalise
the contains value to the same upper-cased identifier we use for the
exact `team+number` branch, and lock that behaviour in
`TestBuildIssueFilter_IdentifierLowercase`.

* fix(linear): use containsIgnoreCase for searchableContent

@carlosflorencio flagged that canonicalising the identifier OR branch
to upper case meant lowercase literal references (e.g. "see eng-123"
pasted into a description) no longer matched. The previous round had
swapped the other way at greptile's request to fix uppercase
references. Both directions are right — the underlying issue is that
Linear's `contains` filter is case-sensitive. Switch the whole
`searchableContent` filter (identifier OR branch and the non-identifier
free-text path) to `containsIgnoreCase`, so casing of the user input
and of the indexed text no longer matters in either direction.

Free-text search is now case-insensitive too, which is the intuitive
default for a search box.

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 19:15:52 +01:00
Carlos Florêncio 40a94e1ff2 docs: add sentry to integrations list (#1337) 2026-06-11 16:02:45 +01:00
Carlos Florêncio 68a9f77b15 fix(harness): harden pr-state and e2e guidance (#1331) 2026-06-11 15:51:51 +01:00
João Salavisa a4a6bce577 fix(task): cascade-archive child tasks on workflow delete (#1332)
* fix(task): cascade-archive child tasks on workflow delete

Tasks pointing at a deleted workflow_id silently became unreachable
because the FK on tasks.workflow_id was dropped to support ephemeral
quick-chat tasks, so SQLite cannot CASCADE. Service.DeleteWorkflow
now archives every active child task before removing the workflow,
re-using the existing ArchiveTask path (events, worktree cleanup,
agent stop). Frontend confirm copy and button label updated to reflect
the new behavior.

Closes #1279

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(task): make workflow-delete cascade race-safe

Address review feedback (Greptile, Claude, cubic): ArchiveTask now returns
a typed ErrTaskAlreadyArchived sentinel so DeleteWorkflow can swallow the
TOCTOU race where a task is archived between ListTasks and ArchiveTask.
Without the sentinel, that race would propagate as an opaque error and
leave the workflow row intact even though every task in the snapshot was
already in the desired state.

Tests:
- TestService_DeleteWorkflow_SkipsConcurrentlyArchivedTask covers the
  sentinel-skip path through the cascade.
- TestService_DeleteWorkflow_PartialArchiveErrorPreservesWorkflow covers
  the fail-fast contract on a real (non-sentinel) error: workflow row
  survives, previously-archived tasks stay archived, retry is safe.
- TestService_ArchiveTask_ReturnsAlreadyArchivedSentinel locks in the
  sentinel-error contract DeleteWorkflow relies on.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 15:41:09 +01:00
github-actions[bot] dfca24ee31 release: 0.57.0 v0.57.0 2026-06-11 14:36:10 +00:00
Nicolas Lenepveu 5d3ddff8b6 fix(task): reap active sessions when archiving a task (#1275) 2026-06-11 14:51:34 +01:00
Carlos Florêncio 817fbee0e5 test(e2e): de-flake review-watch, port-forward, and pr-list specs (#1330) 2026-06-11 13:54:44 +01:00
João Salavisa 672f2b1f26 feat(stats): add avg turn duration and messages per turn (#1328)
* feat(stats): add avg turn duration and messages per turn to averages card

Adds two new metrics to the workspace stats Averages card: mean turn
duration and mean message count per turn. Both exclude outliers — turns
shorter than 1s (no-op/aborted), longer than 1h (zombie turns where
completed_at was backfilled across an agent restart), and turns with no
messages — so the displayed means reflect typical work rather than tail
skew. On a ~4k-turn sample the filter drops avg duration from ~1062s to
~289s.

* fix(stats): exclude exact 1h turns and use Tooltip for averages help text

Address PR feedback: the BETWEEN bound was inclusive so turns exactly at
the 1h ceiling were retained, contradicting the documented half-open
range. Also swap the title attribute on the new Averages rows for the
shared Tooltip component so the help text is reachable via keyboard and
screen readers.

* fix(stats): align turn-row zero state with em-dash convention

Address PR feedback: avg_messages_per_turn rendered "0.0" while
avg_turn_duration_ms rendered "—" under the same empty-data condition.
Also corrects the GetGlobalStats docstring to acknowledge that
clean_turn_agg adds one correlated per-turn lookup on top of the four
single-scan CTEs.

* test(stats): cover exact 1h turn boundary in clean-turn exclusion test

Add a turn of exactly 3,600,000ms (cleanTurnMaxDurationMs) to
TestGetGlobalStats_CleanTurnExcludesOutliers so the exclusive upper
bound is exercised directly, not just via the 2h zombie turn that
sits well above the boundary.

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-06-11 13:45:16 +01:00
Carlos Florêncio 8e4ee65b31 fix: improve sidebar action layout (#1323) 2026-06-11 13:44:52 +01:00
Carlos Florêncio 800d71f3d1 fix: correct sidebar workspace switcher routing and selection persistence (#1329) 2026-06-11 12:02:25 +01:00
Carlos Florêncio 00500cca05 fix(acp): persist session model and drop composite id logic (#1327) 2026-06-11 11:07:22 +01:00
Carlos Florêncio b0482285aa fix: improve archive switch reliability (#1325) 2026-06-11 09:50:52 +01:00
Clément Fiere a03d65fdf8 feat(sentry): support self-hosted instances via configurable URL (#1320) 2026-06-10 22:06:42 +01:00
Carlos Florêncio dd182acfd2 fix(acp): bound long session resumes and restore legacy model surfaces (#1324) 2026-06-10 21:20:28 +01:00
Carlos Florêncio bb15fcf474 fix(web): show open PR status when task has merged and open PRs (#1322) 2026-06-09 17:53:59 +01:00
Carlos Florêncio b3da5f9af1 feat(web): add session handoff via agent tab context menu (#1317) 2026-06-09 16:42:05 +01:00
Carlos Florêncio 71bf90d9e0 fix: default new task executor to worktree (#1321) 2026-06-09 16:40:27 +01:00
Nicolas Lenepveu 63434f29cf fix(orchestrator): deliver initial prompt to passthrough start_agent (#1306) 2026-06-09 09:36:13 +01:00
Carlos Florêncio 525e932df7 fix: keep utility default agent and model paired (#1318) 2026-06-09 00:05:26 +01:00
Carlos Florêncio 68e7fc7c27 fix(acp): handle config-option-only model state (#1319) 2026-06-09 00:04:40 +01:00
Carlos Florêncio 64140ae942 fix(acpdbg): read claude agent models and modes from configOptions (#1310) 2026-06-08 22:44:02 +01:00
Carlos Florêncio ec40bf0b87 fix: contain settings page overscroll (#1316) 2026-06-08 22:42:14 +01:00
Carlos Florêncio d78a1a4370 fix: default changes panel to tree view (#1314) 2026-06-08 21:22:39 +01:00
Carlos Florêncio 3e92d3abc6 fix: allow office mcp mode for existing tasks (#1315) 2026-06-08 21:22:30 +01:00
Carlos Florêncio e806464117 fix: quote record skill description (#1313) 2026-06-08 20:08:57 +01:00
Carlos Florêncio 2b068fbbf2 fix: clarify required automation fields (#1312) 2026-06-08 20:06:02 +01:00
José Almeida 5d6fe29293 fix(web): collapse dockview workflow stepper to current step when cramped (#1309)
* fix(web): collapse dockview workflow stepper to current step when cramped

On narrow windows the full workflow step indicator outgrew the top-bar
center track and rendered beneath the right-side action buttons. Switch
the grid so the breadcrumb takes only its content width and the center
track absorbs the real leftover space, then collapse the stepper to a
minimal current-step view (via the shared useToolbarCollapsed hook) only
when the full version genuinely cannot fit.

* fix(web): stabilize stepper test id and drop margin skewing collapse

Move data-testid="workflow-stepper" to the persistent outer container so
the e2e locator resolves in both expanded and collapsed modes, and remove
mx-2 from the w-full measuring container (it overflowed the wrapper and
shifted the collapse threshold by ~8px); the grid gap-2 already spaces the
columns.

* refactor(web): trim verbose stepper collapse comment

* fix(web): tag archived minimal badge with stepper test id

Give the archived branch of MinimalWorkflowStepper the same
workflow-stepper-minimal test id as the current-step branch so collapsed
mode is detectable for archived tasks, and tighten two comments.

* test(web): collapse multi-line comments in stepper test to single lines

* fix(web): drop aria-current on minimal stepper no-current fallback

When no step is current the minimal view falls back to the first step;
it should not claim aria-current="step", matching the expanded path where
no step is marked current in that case.
2026-06-08 19:34:40 +01:00
Carlos Florêncio fc4bf8a40c feat: add checkout service make targets (#1311) 2026-06-08 19:30:21 +01:00
Nicolas Lenepveu aac2afbf93 fix(agent-settings): stop reseeding agent profiles the user deleted (#1305) 2026-06-08 17:49:34 +01:00
Carlos Florêncio 637123f84f feat: allow remote external mcp access (#1307) 2026-06-08 17:41:29 +01:00