Commit Graph

1504 Commits

Author SHA1 Message Date
Nicolas Lenepveu bc39b9feed fix(orchestrator): inherit workflow default agent profile when auto-starting a profile-less session (#1450) 2026-06-22 11:26:38 +01:00
Carlos Florêncio 738742b43a fix: load feature toggles on mount (#1454) 2026-06-22 11:18:38 +01:00
Carlos Florêncio da45983c4c feat: add native kandev launcher (#1391) 2026-06-20 19:40:15 +01:00
Carlos Florêncio 2b93545a4d ci: fix opencode fork review merge base (#1451) 2026-06-20 19:37:17 +01:00
Carlos Florêncio f4a906884f fix: stop CI auto-fix on non-actionable feedback (#1452) 2026-06-20 19:36:19 +01:00
Carlos Florêncio 7ada858f17 feat: add CI PR automation controls (#1446) 2026-06-20 10:05:25 +01:00
José Almeida 8e55c3c477 feat(web): surface PR merge-conflict & mergeability state in the CI popover (#1448)
* feat(web): surface PR mergeability + conflict state in the CI popover

The CI hover popover showed checks/reviews but nothing about mergeability, so an
unmergeable PR silently dropped its merge button with no reason. Add a mergeability
row that reuses the detail panel's conflict banner + "Resolve conflicts" agent prompt
for dirty PRs, a "Behind base" chip, and a branch-protection note explaining why a
blocked PR is gated. Replace the compact merge split-button+dropdown with an inline
primary + "or <method>" buttons so the menu's detached portal no longer closes the
hover popover.

* feat(web): reflect PR mergeability in status colors and badges

The PR status pill, badge, and chat-input CI chip derived their colour from
checks/reviews only, so a conflicted or blocked PR still read as a green "all good"
check. Map dirty -> red, behind -> amber, and branch-protection blocked -> amber across
getPRStatusColor, the PRStatusIcon badge, and the chip glyph, so the indicators agree
with the popover. Blocked stays sky/in-progress while a requested review is still
outstanding (that's the awaiting-review gate, not a hard block).

* refactor(web): remove dead merge-menu keep-open plumbing

The compact merge control was redesigned to inline buttons (no dropdown portal),
which already fixes the hover popover closing. That leaves the keepOpen ref /
setKeepOpen / onMergeMenuOpenChange / onMenuOpenChange chain threaded through
usePopoverInteractions, PRCIPopover, and PRMergeButton unreachable: the popover
always renders PRMergeButton with compact, and the only DropdownMenu lives in the
non-compact detail-panel path that never passes the callback. Drop the unused
scaffolding (flagged by OpenCode + greptile).

* fix(web): keep CI popover quiet for blocked PRs only awaiting review

PRMergeabilityRow rendered "Blocked by branch protection" for any blocked PR,
including one blocked solely because a requested reviewer hasn't responded. That
contradicted the chip/pill/badge, which deliberately read that case as the calm
"awaiting review" state. Skip the note (render nothing) when isPRAwaitingReview is
true, and narrow blockedReason so an empty checks_state no longer falsely claims a
required status check failed. Flagged by Claude (blocker) and greptile.

* refactor(web): rename mergeability-notice compact prop to popover

The `compact` prop made the chip/text larger (to match the popover's text-xs rows)
while ConflictBanner's `compact` tightened padding — so "compact" rendered bigger,
which reads as inverted. Rename it to `popover` (the variant rendered inside the CI
hover popover) and document that the chip intentionally matches the popover rows.
No visual change. Flagged by cubic.

* fix(web): show default cursor on disabled compact merge alternates

The compact "or <method>" alternates kept cursor-pointer while disabled (during the
~1s merging state); add disabled:cursor-default to match the primary button. Flagged
by OpenCode.
2026-06-19 14:56:24 +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
Carlos Florêncio ec2b4a294c fix: keep start-agent tasks scheduling (#1445) 2026-06-19 12:31:21 +01:00
Carlos Florêncio c30d187440 fix: constrain dialog text inputs (#1437) 2026-06-18 23:03:32 +01:00
Carlos Florêncio 3f0b391fd0 fix: restore debug flag in Vite shell (#1442) 2026-06-18 23:00:33 +01:00
Carlos Florêncio ffda4638e9 fix(web): constrain ci checks popover height (#1441) 2026-06-18 22:28:56 +01:00
Carlos Florêncio f100fc97a5 fix: focus changes panel on git updates (#1436) 2026-06-18 22:16:49 +01:00
Carlos Florêncio 773cd1a5a7 ci: harden opencode same-repo review helper (#1439) 2026-06-18 22:11:40 +01:00
Carlos Florêncio 323aae12df fix: restore SPA favicon assets (#1438) 2026-06-18 21:30:38 +01:00
Carlos Florêncio 2560f194ee ci: harden opencode pr review workflow (#1434) 2026-06-18 19:57:40 +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
github-actions[bot] e1d14a0a13 release: 0.65.0 v0.65.0 2026-06-18 15:44:33 +00:00
Carlos Florêncio e148234e80 fix: backfill running chat turns without prompt frame (#1429) 2026-06-18 16:29:39 +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 74b756f04a fix(web): stop session-tab flicker when same-task sessions have diverged env ids (#1428)
* fix(web): stop session-tab flicker when same-task sessions have diverged env ids

* test(web): fail fast on missing dockview bridge and clear diverged-env interval
2026-06-18 13:49:13 +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
José Almeida 8922a9a2ee fix(backend): prefer local copilot CLI over npx at launch (#1384)
* fix(backend): prefer local copilot CLI over npx at launch

IsInstalled probed the copilot binary for the UI badge but launch always
ran `npx -y @github/copilot`, paying an npm registry round-trip every
start — minutes behind a private registry. Reuse the env-correct binary
check (standalone LookPath, SSH preflight probe) so when copilot is on
PATH the lifecycle runs it directly; containerized runtimes keep npx.

* fix(backend): make SSH native-binary probe non-fatal on transport error

The native-binary probe is an optimisation, not a requirement. A transient
SSH transport error (MaxSessions, reset) made "Verifying agent binary"
abort the launch, blaming copilot before npx was tried. Treat probe
transport errors as a miss and fall through to the required default-command
probe, which reports failures with proper context. Also call
NativeBinaryName() once.

* fix(backend): clear stale native-binary metadata before SSH probe

A pre-existing or stale MetadataKeyNativeBinary in req.Metadata could make
the command builder prefer copilot --acp on an npx-only host even when this
probe misses. Clear it up front so only a positive probe re-sets it.

* refactor(backend): use resolved RuntimeName for native-binary check

buildExecutionFromInstance re-derived the runtime from req.ExecutorType
while promoteWorkspaceExecution read execution.RuntimeName. Use the already
resolved execution.RuntimeName (set from rt.Name()) in both, so the two call
sites are consistent.

* fix(backend): reflect local copilot CLI in profile command preview

The profile setup command preview always rendered `npx -y @github/copilot`
because PreviewAgentCommand built the command without the native-binary
probe. The preview is not bound to an executor, so assume the default
standalone host and probe PATH (mirroring the standalone launch path): show
`copilot --acp` when the CLI is installed, npx otherwise.
2026-06-18 13:07:40 +01:00
Carlos Florêncio 6a7bf92893 docs: refresh feature documentation (#1424) 2026-06-18 12:00:57 +01:00
Carlos Florêncio 2bb239b843 fix: render er diagrams in task plans (#1425) 2026-06-18 12:00:18 +01:00
José Almeida 77f7924004 fix(web): restore diff expansion for committed-source review rows (#1423)
* fix(web): restore diff expansion for committed-source review rows

#1097 narrowed the expansion gate to `source === "uncommitted"` to dodge a
trailing-context crash, which silently dropped expand controls for committed
files — the bulk of a review. The crash is now caught by the reparse guard in
useExpandableDiff, so re-enable expansion for committed rows, fetching the old
side from the repo's base branch (not HEAD, which already has the commits).

Extracts the decision into a pure `resolveDiffExpansion` helper and adds a
multi-repo guard so a committed file never borrows another repo's base branch.

* fix(web): guard diff-expansion base fallback to single-repo tasks

Resolve baseBranchByRepo once in ReviewDiffList (not per row) and only expose a
fallback base branch when the task has exactly one repo, so a committed file
with no repository_name in a multi-repo task no longer borrows an arbitrary
repo's base branch. Addresses Greptile/cubic review feedback.
2026-06-18 11:58:04 +01:00
Carlos Florêncio 4cf2829d77 fix: show quick chat session model options (#1422) 2026-06-18 09:56:29 +01:00
Carlos Florêncio 130ec19587 docs: record PR fixup harness learnings (#1416) 2026-06-17 23:38:37 +01:00
Carlos Florêncio 1f5a551579 ci: clarify opencode review completion (#1420) 2026-06-17 22:50:07 +01:00
github-actions[bot] b13606e86a release: 0.64.0 v0.64.0 2026-06-17 21:18:41 +00:00
Carlos Florêncio 9b2d47f713 ci: avoid unconditional playwright apt install (#1419) 2026-06-17 21:49:57 +01:00
Carlos Florêncio cfb0041f29 fix: cover agent file link review fixes (#1415) 2026-06-17 21:46:23 +01:00
Clément Fiere a71ee2e2c1 fix: open agent file links that carry line-range selectors (#1412) 2026-06-17 20:32:40 +01:00
Carlos Florêncio 67037fd936 ci: add opencode PR review workflow (#1405) 2026-06-17 20:27:16 +01:00
github-actions[bot] 7268c55783 release: 0.63.0 v0.63.0 2026-06-17 19:01:52 +00:00
Carlos Florêncio d8436dfd8f feat: improve passthrough composer and session recovery (#1411) 2026-06-17 19:01:42 +01:00
Carlos Florêncio 1d61727df3 fix: restore missing settings sidebar links (#1413) 2026-06-17 15:26:30 +01:00
Carlos Florêncio bebb46a189 fix: support postgres initial agent setup (#1410) 2026-06-17 09:54:44 +01:00
github-actions[bot] 9ea30d5e3e release: 0.62.0 v0.62.0 2026-06-17 07:12:09 +00:00
Carlos Florêncio d9d4aafb51 fix: preserve office sidebar workspace toggles (#1403) 2026-06-17 08:09:54 +01:00
Carlos Florêncio fcd2cc00e9 fix: open markdown file links with line suffixes (#1404) 2026-06-17 08:08:44 +01:00
Carlos Florêncio f9608ba52d fix: expose kandev mcp tools to pi (#1401) 2026-06-16 23:30:25 +01:00
github-actions[bot] 6f4da4519e release: 0.61.0 v0.61.0 2026-06-16 21:59:24 +00:00
Carlos Florêncio b374b50c4c fix: open root-relative chat file links (#1400) 2026-06-16 22:55:24 +01:00
Carlos Florêncio 9702cffff5 ci: add postgres backend boot smoke test (#1398) 2026-06-16 22:50:14 +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