Commit Graph

1367 Commits

Author SHA1 Message Date
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
Carlos Florêncio c68323c9e0 fix: preserve settings sidebar on refresh (#1303) 2026-06-08 17:40:54 +01:00
Carlos Florêncio 351db61e5b fix: avoid stale sibling PR sync (#1302) 2026-06-08 17:40:16 +01:00
Carlos Florêncio c4133a9e6e fix(web): focus sidebar-created tasks (#1301) 2026-06-08 17:39:37 +01:00
José Almeida 46f20e0dfe fix(web): keep dockview group alive on task switch to stop layout collapse (#1308)
* fix(web): keep dockview group alive on task switch to stop layout collapse

On a fast-path env switch, the incoming session chat was added only after
removeEphemeralPanels closed the outgoing chat. When that chat was the last
surviving panel in its group (e.g. the default layout's chat column), removing
it first emptied — and so destroyed — the group. The captured group id then no
longer existed, and post-#1165 the old `referenceGroup: "sidebar"` fallback is
dead, so addPanel ran with an undefined position: dockview dropped the incoming
chat into the active (terminal) group and collapsed the grid root to a vertical
stack. The corrupted layout was then persisted, so it survived reloads.

Add the incoming session panel before removing the outgoing one, anchored at the
outgoing panel's current index, so the group stays alive throughout the swap.
Removing the panels ahead of the insert point shifts the new panel into the same
final slot, so computeSurvivingIndex is no longer needed.

* docs(web): note the raw-index equivalence assumption in env switch
2026-06-08 17:33:54 +01:00
João Salavisa 2b74f4e189 fix: gate step_complete_kandev tool on per-step signal flag (#1300)
* fix: gate step_complete_kandev tool on per-step signal flag

Two ADR-0015 follow-up bugs:

- "Wait for agent completion signal" checkbox snapped back because
  updateWorkflowStepAction dropped auto_advance_requires_signal from the
  PUT body. Add it to the Pick<>, body builder, BackendWorkflowStep, and
  transformWorkflowStep.
- step_complete_kandev MCP tool was injected into every first-turn
  prompt, polluting context and tempting agents on non-signal-gated
  steps to call it. Replace the static description in
  kandev-context.md with a {step_complete_section} placeholder filled
  only when the current step has auto_advance_requires_signal=true.
  Add orchestrator.Service.StepRequiresCompletionSignal helper and
  thread it through all four InjectKandevContext call sites.

* fix: address PR 1300 review feedback

- Hoist ProcessOnTurnStart above the first-turn MCP wrap so an
  on_turn_start step transition is reflected in the
  auto_advance_requires_signal flag baked into the stored/forwarded
  prompt (coderabbit, cubic).
- Add Service.WorkflowStepRequiresCompletionSignal step-ID variant and
  use it from task_operations.go / autoStartStepPrompt to skip the
  redundant GetTask round-trip at hot first-turn launch sites (claude).
- Add table-driven tests covering every silent-false branch and the
  positive path of both helpers (greptile, claude, cubic).

* docs(sysprompt): document stepCompleteSection trailing newline contract

Address Claude review suggestion on PR 1300: make explicit that the
constant must end with "\n" because the kandev-context.md template inlines
{step_complete_section} immediately before the next bullet, so the
trailing newline is what separates the two list items.

* fix: restore task-id lookup at startTask wrap site

Address PR 1300 review regression: the previous swap to
WorkflowStepRequiresCompletionSignal(ctx, workflowStepID) silently hid
step_complete_kandev on manual starts where the workflowStepID parameter
is empty but the task is already bound to a signal-gated step in the DB.

The `task` variable in scope at this call site is `*v1.Task` (from the
scheduler) and does not carry WorkflowStepID, so the cheaper step-ID
variant is not applicable here — go back through StepRequiresCompletionSignal
so the repo lookup pulls the canonical step.

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-06-08 08:14:52 +01:00