Commit Graph

478 Commits

Author SHA1 Message Date
Carlos Florêncio a30dd39566 fix: avoid stale task worktree repository launches (#1568) 2026-07-01 21:25:05 +01:00
StefanFVogel 4b981bc4c6 feat: add Download option to file browser context menu (#1567) 2026-07-01 21:24:07 +01:00
Jingran e9bc8353cb fix: keep user-selected terminal session active instead of auto-handoff (#1562) 2026-07-01 14:28:36 +01:00
Nicolas Lenepveu 6b81dd1566 feat: add per-watch dispatch sorting to the Linear issue watcher (#1553) 2026-07-01 07:55:28 +01:00
Carlos Florêncio 3743f4b501 fix: preserve nested markdown code fences (#1557) 2026-06-30 22:45:25 +01:00
Carlos Florêncio 7893a5e33e fix: trigger workflow on agent task messages (#1555)
* fix: trigger workflow on agent task messages

* fix: harden agent task message dispatch

* fix: preserve completed task message sessions

* fix: restore review step on task message failure

* test: cover completed task message handoff

* fix: publish task message rollback events

* fix: restore task message session rollback

* fix: avoid orphaned task message rows

* docs: explain task message prompt recording

* fix: harden task message rollback cleanup

* fix: complete task message rollback cleanup

* fix: restore task message dispatch side effects

* fix: restore task state after capture failure

* fix: simplify task message rollback cleanup

* fix: preserve task message rollback snapshots

* fix: restore task message turn-start snapshots

* fix: preserve task message queue snapshots

* fix: fail closed on office task lookup

---------

Co-authored-by: root <root@kandev.ts.net>
2026-06-30 18:28:28 +01:00
Carlos Florêncio 393b750a4e fix: sync archived task websocket removals (#1556)
* fix: sync archived task websocket removals

* fix: address archived task review cleanup

* fix: handle archived office task routes

* fix: share task route pathname normalization

* fix: refresh office task removal views

---------

Co-authored-by: root <root@kandev.ts.net>
2026-06-30 16:40:52 +01:00
Carlos Florêncio 1abb1c914e fix: keep acknowledged agent errors hidden (#1558)
* fix: keep acknowledged agent errors hidden

* fix: address agent error acknowledgement review

* fix: include fallback sessions in error acknowledgements

* test: cover agent error acknowledgement helpers

---------

Co-authored-by: root <root@kandev.ts.net>
2026-06-30 16:29:46 +01:00
Carlos Florêncio ef9807bd72 fix: coalesce ci auto-fix queue rounds (#1552)
* fix: coalesce ci auto-fix queue rounds

* fix: centralize ci auto-fix round cap

* fix: keep ci auto-fix state fresh

* fix: refine ci auto-fix round status

* fix: handle ci auto-fix exhaustion edge cases

* fix: reduce ci auto-fix dispatch complexity

* fix: refresh pending ci auto-fix before direct prompt

* fix: harden ci auto-fix queue replacement

---------

Co-authored-by: root <root@kandev.ts.net>
2026-06-30 01:19:52 +01:00
Carlos Florêncio 5ed975ddbf feat: redirect and toast when focused task is auto-deleted (#1544) 2026-06-29 19:10:08 +01:00
Carlos Florêncio f3b26dbc5a feat: support remote macos ssh hosts (#1534) 2026-06-29 19:06:33 +01:00
Carlos Florêncio d0a032fa60 fix: prefer main for worktree base branches (#1532) 2026-06-29 14:17:14 +01:00
Carlos Florêncio 8ca17e0d6e fix: preserve pinned task sessions (#1517) 2026-06-28 16:10:04 +01:00
Carlos Florêncio 2ec30ef8cb fix: preserve task repo on rename updates (#1511) 2026-06-27 12:46:31 +01:00
Carlos Florêncio 9484bc33d9 fix: prime task create last-used cache before dialog effects (#1509) 2026-06-27 00:01:28 +01:00
Nicolas Lenepveu 5021066d78 feat: bind repository to Linear/Jira/Sentry issue watchers (#1491) 2026-06-25 18:33:15 +01:00
Carlos Florêncio ec5a81f805 fix: debug task dialog selection restore (#1493)
* fix: debug task dialog selection restore

* fix: address task dialog debug review

* fix: address task dialog review feedback

* fix: finish task dialog debug review

* fix: keep portaled task selectors clickable

* test: cover portaled selector option clicks

---------

Co-authored-by: root <root@kandev.ts.net>
2026-06-25 16:06:38 +01:00
Carlos Florêncio 365a3bdd24 fix: recreate github review tasks after reset (#1492) 2026-06-25 14:13:39 +01:00
Carlos Florêncio 4d19fb32f1 feat: link tasks to github references (#1471) 2026-06-23 17:28:52 +01:00
Carlos Florêncio 6126edb203 feat: add subtask completion trigger (#1473) 2026-06-23 16:07:10 +01:00
Carlos Florêncio d58d9d03bb fix: support issue links in remote task dialog (#1462) 2026-06-22 15:16:43 +01:00
Carlos Florêncio 7ada858f17 feat: add CI PR automation controls (#1446) 2026-06-20 10:05:25 +01:00
Carlos Florêncio 2a890c7975 feat: sync task preferences across devices (#1440) 2026-06-19 12:46:46 +01:00
Carlos Florêncio a404e9818b fix(web): preserve kanban card runtime state (#1443) 2026-06-19 12:31:31 +01:00
João Salavisa 2c4887a3ee fix(web): suppress kanban spinner for TODO tasks (#1399)
* fix(web): suppress kanban spinner for TODO tasks

A task moved back into TODO can still carry an active primary session
state (CREATED/STARTING/RUNNING). The kanban card was painting the
blue running-spinner in that case, making queued tasks look like they
were executing.

Add an explicit TODO guard at the top of shouldShowTaskRunningSpinner
so the queued column never shows the spinner, regardless of the
session-state desync. Existing decoupling for IN_PROGRESS/REVIEW/etc.
is untouched.

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

* test: clarify spinner test description excludes TODO

Greptile flagged that "returns true when any task state has an actively
running primary session" overstates the invariant now that TODO
short-circuits to false. Reword to "non-TODO task states" so the
description matches behavior.

* ci: retrigger after artifact expiry

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-18 19:15:59 +01:00
Carlos Florêncio aee1846cd5 feat: remove nextjs production runtime (#1389) 2026-06-18 18:36:48 +01:00
José Almeida 2781556ead perf: tame browser-grinding cumulative diffs during large rebases (#1430)
* perf(backend): cap cumulative diff bytes and file count during large rebases

* perf(web): coalesce cumulative-diff refetches and skip redundant status compares

* feat(web): warn when the changes panel hides files from a capped diff

* fix(backend): enforce cumulative diff total byte budget strictly

* fix(web): keep coalesced refetch timer shared across envKey subscribers

* fix(web): drop unsound git-status SHA fast-path that staled live diffs

* fix(web): cancel coalesced timer on mid-flight drain to avoid duplicate refetch

* refactor(web): move changes-panel banner and helper to a sibling file

* docs(backend): clarify cumulative diff truncated-files-count semantics

* fix(web): tighten useSelectedFileKey mode param to the all|file union
2026-06-18 17:28:21 +01:00
Clément Fiere fce3b421ea fix: split multi-file agent read links and strip line-range selectors (#1426) 2026-06-18 16:28:06 +01:00
José Almeida 3b2e1396fa perf: fix board lag, memory growth, and rebase-driven CPU spikes (#1427)
* perf(kanban): memoize derived board data to stop re-render storms

The board rebuilt the `tasks` array (and `stepOptions`/`sharedProps`) on every
store change, producing fresh object identities that defeated downstream memos
and re-rendered every card on each WebSocket message. Wrap them in useMemo so
the board only re-renders when its inputs actually change.

* perf(session-runtime): bound runtime memory and dedupe git-status compare

Three runtime-store fixes for the crash a heavy rebase triggered:

- Cap shell + terminal output buffers at 2MB (matching the existing process
  buffer) so a chatty shell can't grow the store without limit.
- Purge per-session runtime state (messages, turns, shell/process buffers, and
  the bySessionId maps) when a session is removed; env-scoped maps are dropped
  only once no other session shares the environment.
- Run setGitStatus's deep per-file diff comparison once per update and return
  whether anything changed, instead of recomputing it 2-3x. Under a massive
  rebase (thousands of files, frequent updates) that comparison was the
  dominant CPU cost and drove the render storm.

* refactor(session-runtime): drop now-unused gitStatusWouldMutate

The git-status handler no longer pre-checks for changes (setGitStatus now
returns whether it changed), leaving gitStatusWouldMutate with no callers.

* fix(session-runtime): enforce terminal cap on first and oversized chunks

appendTerminalChunk only evicted when more than one chunk was buffered, so a
single chunk larger than the 2MB cap slipped through untrimmed; the new-terminal
branch also pushed the first chunk without going through the cap at all. Clamp
each chunk to the tail of the cap and route the new-terminal path through
appendTerminalChunk. Addresses CodeRabbit review.
2026-06-18 13:30:41 +01:00
Carlos Florêncio d8436dfd8f feat: improve passthrough composer and session recovery (#1411) 2026-06-17 19:01:42 +01:00
Carlos Florêncio 327f7d4ec0 fix: persist agent error dismissal (#1397) 2026-06-16 22:27:28 +01:00
Carlos Florêncio e930061fe4 fix(web): chat badge, dockview preview routing, and agent-error icon cleanup (#1395) 2026-06-16 20:29:35 +01:00
Carlos Florêncio d3575e2683 fix: restore office sidebar navigation (#1396) 2026-06-16 20:19:13 +01:00
Carlos Florêncio 3bac35b574 feat(web): surface ensure-session errors and persist preset layout changes (#1394) 2026-06-16 15:21:20 +01:00
Carlos Florêncio 61acc82b74 feat: add reset action for integration watches (#1381) 2026-06-15 18:54:16 +01:00
José Almeida 214a8f5cce fix: scope multi-repo file editor open/save to the right repo (#1382)
* fix: scope multi-repo file editor open/save to the right repo

The editor open/save/sync/delete chain dropped the repository_name in
multi-repo task workspaces, so the backend resolved paths against the
bare task root and failed with "file not found". Thread the repo
subpath through openFile, save, sync, and delete, and store it on
FileEditorState.

* fix: pass repo from diff Edit button to multi-repo file editor

The diff/changes "Edit" button opened files without their repository
scope, so multi-repo files resolved against the bare task root and
failed with "file not found". Thread repository_name through the diff
and review toolbars into onOpenFile.

* fix: preserve repo across tab restore and stale syncs

Address review feedback: persisted file tabs dropped the repo subpath,
so a multi-repo file reopened against the bare task root after a browser
refresh. Persist and restore `repo` on StoredFileTab. Also guard the
workspace sync against a tab being swapped to a different repo mid-fetch,
and widen the remaining onOpenFile type declarations to carry repo.

* fix: thread repo into editor panel fallback fetch

Address review feedback: FileEditorPanel's useFileLoader fallback fetch
(triggered when the open-files map is transiently empty, e.g. after a
session switch) called requestFileContent without the repo subpath,
re-introducing the multi-repo "file not found" failure. Record repo on
the panel params and forward it through useFileLoader. Also assert the
full restored-tab shape in the local-storage round-trip test.

* fix: guard editor fetches against stale session/repo races

Address review feedback: file open and the panel fallback fetch could
apply a late response after the user navigated away. openFile now drops
the result if the active session changed mid-fetch (via fetchFileEditorState),
and the panel loader keys its in-flight guard by session+path+repo so a
changed target re-fetches and stale responses are discarded.
2026-06-15 17:59:05 +01:00
Carlos Florêncio fd421848fb feat: add feature toggles settings (#1372) 2026-06-15 13:33:45 +01:00
Carlos Florêncio 3a3fca7f0e feat: add resource metrics topbar (#1373) 2026-06-14 22:33:34 +01:00
Carlos Florêncio a140c5817b fix: preserve recoverable agent errors (#1368) 2026-06-14 21:40:52 +01:00
Carlos Florêncio 010948767a feat: add file-backed prompt attachments (#1367) 2026-06-14 21:40:02 +01:00
Carlos Florêncio 35a12fdb2c fix: distinguish sidebar workspace types (#1364) 2026-06-14 18:27:40 +01:00
Carlos Florêncio 1038d1d5ea fix: show spinner for running review sessions (#1363) 2026-06-14 17:58:52 +01:00
Carlos Florêncio 2dd03b5431 feat: expose ACP session debug metadata (#1359) 2026-06-13 23:38:07 +01:00
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 8d0493d1a4 fix: persist session runtime config (#1346) 2026-06-12 08:56:14 +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 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
Clément Fiere a03d65fdf8 feat(sentry): support self-hosted instances via configurable URL (#1320) 2026-06-10 22:06:42 +01:00