Commit Graph

765 Commits

Author SHA1 Message Date
João Salavisa cda044316e fix(docker): route user shell to container instead of host (#638) 2026-04-18 17:01:53 +01:00
José Almeida 80eacf9e1c fix(web): use UUID fallback for attachments on non-secure contexts (#640) 2026-04-18 15:29:57 +01:00
Carlos Florêncio 8d407eab02 test(web): add e2e tests for tasks list view filters (#612) (#635) 2026-04-18 12:00:17 +01:00
Carlos Florêncio b8034cd06c fix(web): collapse repeated "Resumed agent" boot messages into the last one (#631) 2026-04-18 11:41:03 +01:00
Carlos Florêncio 5b04c9c675 perf: focus-gated git polling to reduce CPU on retained worktrees (#610) 2026-04-18 11:33:04 +01:00
João Salavisa 06cb48b300 fix(docker): use API version negotiation instead of hardcoded 1.41 (#636)
The default Docker API version was hardcoded to 1.41, which fails on
newer Docker daemons that require at least API version 1.44.

Change the default to empty string so the Docker client uses the
existing WithAPIVersionNegotiation() option to auto-negotiate a
compatible version with the daemon.
2026-04-18 11:06:32 +01:00
Carlos Florêncio 820e0b963a ci: use Claude App token for same-repo PRs, fallback for forks (#634) 2026-04-18 11:05:47 +01:00
José Almeida f63a9d5dc5 fix(web): wrap long paths in Discard Changes dialog (#620)
Long file paths could overflow the AlertDialog horizontally, pushing
the action buttons outside the visible area. Add break-words on the
description and overflow-wrap:anywhere on the filename span so paths
wrap mid-string instead of forcing the dialog wider than its max-w.
2026-04-18 10:32:24 +01:00
Carlos Florêncio 74d4d5b77b docs: add Discord link and require e2e tests for UI changes (#630) 2026-04-17 23:40:35 +01:00
Carlos Florêncio 1cdfc04050 ci: pass GITHUB_TOKEN to claude-code-action to bypass OIDC exchange (#629) 2026-04-17 23:27:49 +01:00
Francisco Magalhães cd46516cef fix: ux consistency on archiving and deleting tasks (#627) 2026-04-17 23:20:10 +01:00
Francisco Magalhães 73e58729ba fix: apply display filters in list view (#612) 2026-04-17 23:12:45 +01:00
Carlos Florêncio 1ba35225e6 ci: enable claude review on fork PRs via pull_request_target (#628) 2026-04-17 22:53:44 +01:00
Carlos Florêncio cee5b0ad07 docs: refresh README, roadmap, and workflow templates (#624) 2026-04-17 19:42:12 +01:00
Carlos Florêncio 814efdfa67 fix(cli): isolate dev mode state when running inside a kandev task (#617) 2026-04-17 19:41:29 +01:00
Carlos Florêncio cb8abfed78 fix(web): disable multi-select mode after bulk archive or delete (#623) 2026-04-17 19:36:19 +01:00
João Salavisa f440007efc feat: add confirmation dialog before archiving tasks (#621) 2026-04-17 18:27:10 +01:00
Francisco Magalhães 78d783237b feat: introduce card multi-selection (#573) 2026-04-17 18:16:39 +01:00
dependabot[bot] c970e83a97 chore: bump github.com/jackc/pgx/v5 from 5.8.0 to 5.9.0 in /apps/backend in the go_modules group across 1 directory (#613) 2026-04-17 17:41:46 +01:00
Carlos Florêncio 2e43478e96 release: app v0.34, cli 0.15.0
release / build-web (push) Has been cancelled
release / docker (push) Has been cancelled
release / build-bundles (aarch64-linux-gnu-gcc, arm64, linux, ubuntu-latest, linux-arm64) (push) Has been cancelled
release / build-bundles (amd64, darwin, macos-14, macos-x64) (push) Has been cancelled
release / build-bundles (amd64, linux, ubuntu-latest, linux-x64) (push) Has been cancelled
release / build-bundles (arm64, darwin, macos-14, macos-arm64) (push) Has been cancelled
release / build-bundles (x86_64-w64-mingw32-gcc, amd64, windows, ubuntu-latest, windows-x64) (push) Has been cancelled
release / publish-release (push) Has been cancelled
v0.34
2026-04-17 17:29:23 +01:00
Carlos Florêncio 60614a78a9 fix(web): close file diff tab when uncommitted change is undone (#618) 2026-04-17 16:46:08 +01:00
Carlos Florêncio 28f5beb4e1 fix(orchestrator): stop killing live agents on resume race (#619) 2026-04-17 16:44:24 +01:00
Carlos Florêncio dc827a25d6 fix(github): treat skipped checks as passing and add ready-to-merge status (#616) 2026-04-17 16:33:43 +01:00
José Almeida 6cbf050fa1 fix: prevent agentctl OOM from unbounded diff generation in workspace tracker (#598)
* fix: prevent agentctl OOM from unbounded diff generation in workspace tracker

Add per-file size cap (10MB), binary detection (null-byte in 8KB),
diff output cap (256KB), and total budget (2MB) to workspace tracker
diff enrichment. Strip diff content from event bus path. Surface skip
reasons in frontend. Add pprof endpoints to agentctl.

* fix: address PR review feedback

Close stdout pipe on cmd.Start failure to prevent fd leak.
Limit untracked file read to maxDiffOutputSize (256KB) instead of
maxDiffFileSize (10MB) to reduce peak allocation from ~20MB to ~512KB.

* fix: add filepath.Clean to os.Stat call to satisfy CodeQL path-injection check

* fix: address second round of PR review feedback

Extract all DiffSkipReason strings as named constants. Add diff_skip_reason
to UncommittedFile type removing unsafe cast. Add unit tests for
isBinaryContent, totalDiffBytes, capDiffOutput truncation, and all
enrichUntrackedFileDiffs skip-reason paths.

* fix: use bytes.IndexByte for null-byte check clarity

* fix: show truncation banner when diff has partial content

* fix: revert diff stripping from event bus — frontend needs diffs from this path

E2E tests confirmed the frontend receives git status diffs through the
event bus (agentctl → backend WS → event bus → gateway → frontend).
Stripping diffs broke the changes panel. The per-file size caps in
workspace_git_diff.go already bound the data.

* fix: extract renderDiffContent to keep FileDiffSection under 100-line lint limit

* fix: correct onCommentRun type in renderDiffContent helper

* fix: format long destructuring line for prettier

* fix: move diffSkipReasonLabel to types.ts to keep review-diff-list under 600 lines

Co-authored-by: José Almeida <undefined@users.noreply.github.com>

* fix: coerce optional forceLoad to boolean for renderDiffContent

* fix: shorten className and comment to stay within prettier printWidth

* fix: apply prettier formatting to review-diff-list

* fix: correct off-by-one in untracked file line count

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: José Almeida <undefined@users.noreply.github.com>
2026-04-17 15:16:18 +01:00
Carlos Florêncio 181a64a5fb fix: prevent utility agents settings page crash on null models (#602) 2026-04-17 14:22:34 +01:00
Carlos Florêncio f98727aac9 fix(orchestrator): unstick sessions when agent crashes mid-turn (#609) 2026-04-17 12:29:51 +01:00
João Salavisa 4640bed408 fix(web): validate activeSessionId belongs to activeTaskId before use (#614) 2026-04-17 02:35:12 +01:00
Carlos Florêncio 99a8407dd8 fix: close clarification overlay when agent moves on (#608) 2026-04-16 15:58:01 +01:00
Carlos Florêncio 8ce34da1b7 fix(github): prevent duplicate review tasks via atomic PR reservation (#605) 2026-04-16 14:20:51 +01:00
Carlos Florêncio ce55577e6d feat(web): render short tool-call output inline (#604) 2026-04-16 11:37:15 +01:00
Carlos Florêncio eaba25b80e fix(web): stop panels from opening in the left sidebar group (#603) 2026-04-16 11:36:46 +01:00
Carlos Florêncio 836b48956b fix(web): align top-bar right button heights (#601) 2026-04-16 11:04:23 +01:00
Carlos Florêncio a222854422 feat: associate agent profiles with workflows and steps (#597) 2026-04-16 10:14:45 +01:00
Carlos Florêncio cafbb63845 release: app v0.33, cli 0.14.0
release / build-web (push) Has been cancelled
release / docker (push) Has been cancelled
release / build-bundles (aarch64-linux-gnu-gcc, arm64, linux, ubuntu-latest, linux-arm64) (push) Has been cancelled
release / build-bundles (amd64, darwin, macos-14, macos-x64) (push) Has been cancelled
release / build-bundles (amd64, linux, ubuntu-latest, linux-x64) (push) Has been cancelled
release / build-bundles (arm64, darwin, macos-14, macos-arm64) (push) Has been cancelled
release / build-bundles (x86_64-w64-mingw32-gcc, amd64, windows, ubuntu-latest, windows-x64) (push) Has been cancelled
release / publish-release (push) Has been cancelled
v0.33
2026-04-16 09:59:38 +01:00
João Salavisa f74de1c642 fix: improve plan comment formatting to match code review style (#600)
* fix: improve plan comment formatting to match code review style

- Update formatPlanCommentsAsMarkdown to use code blocks and blockquotes
- Remove duplicate header in chat-input-area.tsx
- Update buildDocumentContext to use consistent formatting
- Fixes duplicate '### Plan Comments' headers and extra separators

* fix: add tests and fix multiline blockquote handling

- Add format.test.ts for formatPlanCommentsAsMarkdown and related functions
- Fix multiline comment text to properly prefix each line with >
- Addresses review feedback about missing tests and broken blockquotes

* fix: export and reuse toBlockquote helper to avoid duplication

* fix: update E2E test to match new plan comment format

The test was expecting 'Comment 1:' which was the old bullet-style format.
Now looks for 'Plan Comments' header instead.
2026-04-16 02:57:41 +01:00
Carlos Florêncio 1e71d048e3 fix: skip ExtraFiles liveness pipe on Windows to fix agentctl startup (#599) 2026-04-15 23:22:15 +01:00
Luan Martins 59d7270056 fix(web): disable resume and show agent selector when profile is deleted (#578) 2026-04-15 22:31:02 +01:00
Carlos Florêncio 1f4451b192 fix(web): add confirmation dialog before deleting agent profile (#596) 2026-04-15 22:16:34 +01:00
José Almeida a2d98f5d3e fix(web): replace mermaid bomb-icon error flood with toast notifications (#594)
* fix(web): replace mermaid bomb-icon error flood with toast notifications

mermaid.render() called without a container leaves orphaned error
elements (with bomb icons) in document.body on parse failures. Clean up
these orphans after every render and show an error toast instead.

* fix(web): address PR review — prevent toast flooding, include error detail, add hook tests

- Add latestRenderId guard in TipTap MermaidNodeView to skip stale
  renders, preventing toast spam on every keystroke
- Include mermaid error message in toast description via CustomEvent detail
- Add useMermaidErrorToast hook tests (event listener + cleanup)

* style(web): format mermaid-error-toast test with prettier

* fix(web): include error message in MermaidBlock toast description
2026-04-15 21:47:42 +01:00
José Almeida 7f9cff0dcb fix(web): fix dock view task-switching regressions (#595)
* fix(web): fix dock view task-switching regressions

Three bugs caused broken UI when switching tasks in the dock view:

1. Environment key migration was dead code — data stored under fallback
   sessionId keys became invisible when the environmentIdBySessionId
   mapping was later set, because migrateEnvKeyedData was never called
   in production (only in tests via registerSessionEnvironment).

2. Orphaned portals leaked on every fast-path session switch — the
   isRestoringLayout guard in setupPortalCleanup blocked portal release
   for panels removed during the fast path, accumulating invisible React
   trees with live WS subscriptions.

3. Chat panel gap during fast-path transition — old session tab was
   removed synchronously but new tab was deferred to a useEffect,
   leaving a brief layout gap.

* fix(web): remove superfluous args in test helper

Address CodeQL finding — createSessionSlice only takes `set`, not
`get` and `api`.

* fix(web): add addPanel test assertions and doc comment

Address claude-review blocker: assert that fast-path creates the
session panel with correct id/params, and skips creation when it
already exists. Add doc comment noting syncEnvironmentMapping
requires the combined store draft.

* test(web): add PanelPortalManager.reconcile tests

Export PanelPortalManager class for testability and add tests covering
reconcile removal, no-op, and listener notification paths.
2026-04-15 21:40:16 +01:00
João Salavisa b3aaa804f1 fix: use dynamic merge-base for git commits to filter main branch commits (#504)
* fix: use dynamic merge-base for git commits to filter main branch commits

When a feature branch is rebased on main, the stored base_commit_sha
becomes outdated. Using git log base_commit..HEAD would include main
branch commits that were merged after the stored base commit.

This fix adds dynamic merge-base calculation using the session's
base_branch (target branch like origin/main). When fetching commits:
- The backend computes git merge-base HEAD target_branch
- This returns only commits not yet merged into the target branch
- Works correctly even after rebases

Changes:
- Extended SessionReader interface with GetSessionBaseBranch method
- Added GetMergeBase to GitOperator for computing merge-base
- Updated git log API to accept target_branch parameter
- Modified wsGitCommits handler to pass target branch for filtering

* fix: update executor_test mock to match new GetGitLog signature

* fix: update remaining mocks to match new GetGitLog signature

* fix: update integration test mock for GetGitLog signature

* fix: address code review feedback

- Use GetOrEnsureExecution in wsGitCommits to recover workspaces after backend restarts
- Fix archive snapshot to use baseBranch for merge-base when baseCommit is empty
- Extended ExecutionLookup interface with GetOrEnsureExecution method

* fix: distinguish not-ready errors from unexpected errors in wsGitCommits

Address CodeRabbit review feedback:
- Use errors.Is() to detect ErrSessionWorkspaceNotReady sentinel error
- Return ready:false gracefully for workspace-not-ready and session-not-ready errors
- Return actual errors for unexpected failures (database errors, etc.)
- Add comprehensive tests for error handling paths
2026-04-15 21:29:59 +01:00
João Salavisa e8c34411ae feat(mcp): add start_agent and local_path params to create_task (#505)
* feat(mcp): add start_agent and local_path params to create_task

Add control over task creation behavior in MCP create_task tool:

- Add start_agent boolean param (default true) to optionally skip
  auto-starting an agent when creating tasks
- Add local_path param for specifying local repository folder path
  when creating top-level tasks (worktree flow)
- Add repository_id and base_branch params for explicit repo config
- Improve tool description with clear guidance on when to use
  parent_id='self' vs creating top-level tasks
- Update backend handler to respect start_agent flag
- Relax description requirement for subtasks when start_agent=false

This fixes the issue where agents creating tasks from plans would
always auto-start immediately and couldn't specify repositories
for top-level tasks.

* test(mcp): add integration tests for source_task_id inheritance paths

Cover the source-task path in resolveTaskRepositories that had no test
coverage at any layer: valid source_task_id inherits repos and missing
source_task_id silently falls through rather than failing.

Co-authored-by: João Salavisa <undefined@users.noreply.github.com>

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: João Salavisa <undefined@users.noreply.github.com>
2026-04-15 21:26:27 +01:00
Carlos Florêncio d3945b00ce fix(web): read session state at call time in comment run to prevent stale queue (#588) 2026-04-15 19:55:57 +01:00
Carlos Florêncio 9d816e7a63 fix(backend): reject session resume when task is archived (#593) 2026-04-15 15:03:11 +01:00
Carlos Florêncio 28069398e7 fix: migrate agent_profiles to drop CHECK(model != '') constraint (#590) 2026-04-15 15:02:27 +01:00
José Almeida 12613130fa fix(web): prevent session failure toast from re-appearing after dismiss (#591)
* fix(web): prevent session failure toast from re-appearing after dismiss

* fix: address PR review feedback — add tests and restore JSDoc
2026-04-15 14:24:12 +01:00
Carlos Florêncio 7fbca75354 fix(mcp): inherit repo and default to worktree executor for MCP-created tasks (#592) 2026-04-15 14:14:19 +01:00
Carlos Florêncio 204fac1cca feat: acp-first profiles, models, and modes (#566) 2026-04-15 13:22:32 +01:00
su f757e07460 fix(backend): always enable cgo on build (#586) 2026-04-15 10:11:27 +01:00
José Almeida e86b6655a3 fix(worktree): handle submodules in worktree creation (#579)
* fix(worktree): handle submodules in worktree creation

Repos with git submodules failed during worktree creation when git-crypt
was also present. The `git checkout HEAD -- .` command in
unlockGitCryptAndCheckout() tried to process submodule gitlink entries,
but git resolved their git dirs relative to the worktree-specific git
dir instead of the common dir, causing "not a git repository" errors.

- Detect submodule paths via `git ls-tree -r HEAD` (mode 160000)
- Exclude submodule paths from git-crypt checkout using :(exclude) pathspecs
- Initialize submodules after worktree creation via `git submodule update --init`
  (non-fatal — unreachable URLs are logged as warnings)
- Add submodule init to all worktree creation paths (git-crypt and non-git-crypt)

* fix(worktree): address review — recursive submodule init, consistent call sites

- Add --recursive to git submodule update --init for nested submodules
- Call initSubmodules unconditionally in git-crypt path (matching manager.go)

* fix(worktree): restore submodule index entries after git-crypt checkout

The :(exclude) pathspec used to skip submodules during git checkout also
prevents their gitlink entries from being written to the index. This
leaves git status showing them as staged deletions.

After checkout, run git reset HEAD for each excluded submodule path to
copy the gitlink entry from HEAD back into the index.

* test(worktree): add git status assertion to submodule unlock test

Validate that the index reset after :(exclude) checkout leaves no
staged deletions for submodule paths.

* fix(worktree): use literal pathspec for submodule exclusion

Use :(literal,exclude) instead of :(exclude) to prevent glob
metacharacters in submodule paths from being interpreted as patterns.

* fix(worktree): fix initSubmodules docstring to match --recursive flag
2026-04-14 15:59:25 +01:00