Skip to content

feat(jetbrains): add background agents and subagent avatars - #14311

Merged
kirillk merged 5 commits into
mainfrom
quiet-quokka
Sep 21, 2026
Merged

kirillk merged 5 commits into
mainfrom
quiet-quokka

Conversation

@kirillk

@kirillk kirillk commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Issue

No linked issue. This was scoped directly as JetBrains feature parity with the VS Code background-agent experience.

Context

The JetBrains plugin had no equivalent of the VS Code background-agents strip, no way to promote a running foreground subagent into the background, and no stable visual identity for child agents across the UI. This PR adds the complete background-job lifecycle and gives each subagent the same deterministic generated identity used by VS Code.

What Changed

Background Agent Lifecycle

  • Add shared background-job DTOs and RPC operations for listing, cancelling, and promoting jobs.
  • Poll the CLI background-jobs endpoint through one shared flow per directory/root session, using a faster cadence while jobs are active and a slower cadence after they settle.
  • Probe the CLI background-subagent capability independently of load progress so unsupported or disabled CLIs do not expose a promotion action that will always fail.
  • Derive frontend rows from backend jobs, keep permission-based Needs Input state live, and support stop, stop all, dismiss, clear finished, open, and open all actions.
  • Add Continue in background to active foreground task cards when the capability is available.

Session Header UI

  • Add a retained, collapsible background-agent strip below the session title using the same shared chrome as the to-do strip.
  • Keep every row constrained to the viewport width with no horizontal scrolling.
  • Cap the expanded body at five visible agents and show a vertical scrollbar for additional rows.
  • Pin each row action to the east edge while the avatar, title, and status stay left-aligned and vertically centered.
  • Keep actions visible for long titles rather than allowing row content to push them outside the viewport.
  • Show no terminal glyph or reserved empty space for cancelled agents; completed and failed agents retain their semantic status glyphs.
  • Preserve retained row components and logical ordering as running agents settle.

Generated Subagent Identities

  • Port the VS Code deterministic avatar algorithm, including ID hashing, symmetric dot geometry, sibling-aware color allocation, and the 1.4-second staggered pulse.
  • Animate avatars while foreground tasks or background jobs are running, then restore the same static identity when work settles.
  • Reuse the identity on foreground task cards, background rows, board messages, and read-only subagent editor tabs.
  • Add a public IntelliJ FileIconProvider integration so Kilo virtual-file kind icons reach editor tabs instead of falling back to the unknown-file question-mark icon.
  • Keep editor-tab avatars static. Dynamic tab activity would require a separate lifecycle-aware status bridge and presentation invalidation path; task cards and background rows already own that live state.
  • Make cached subagent title/color presentation data safe for IntelliJ background icon and VFS lookups.

Settings

Rename the Kilo Swarm settings group to Extended agents while keeping the existing Swarm toggle unchanged. No additional background-agent setting is added because the current CLI exposes the feature through its experimental capability rather than a configuration key.

Implementation Constraints

The cancel, promote, capability, and background-job routes are newer than the pinned generated OpenAPI client. The backend therefore uses plain HTTP for these calls, matching the existing session-board boundary, while keeping shared DTO serialization isolated from frontend/backend classloaders.

Needs Input currently reflects pending child permissions. Child questions are not routed through the JetBrains controller today, so question-based waiting remains a known limitation.

How To Test

  1. Start multiple foreground and background subagents in one session.
  2. Confirm each child receives a stable, distinct avatar and running children animate without changing the recognizable lit pattern.
  3. Promote a running foreground task and confirm its identity remains consistent in the background strip.
  4. Confirm the strip tracks the tool-window width, keeps row actions visible, and switches to vertical scrolling after five rows.
  5. Complete, cancel, and fail agents. Confirm avatars become static, status text remains visible, completed/error glyphs remain, and cancelled rows reserve no blank status slot.
  6. Open child transcripts and confirm editor tabs show generated subagent avatars instead of the generic unknown-file icon.
  7. Confirm Stop, Stop all, Dismiss, Clear finished, Open, and Open all target the correct jobs/sessions.
  8. Disable the CLI background-subagent capability and confirm Continue in background is not offered.

Verification

  • ./gradlew typecheck passes from packages/kilo-jetbrains/.
  • ./gradlew test passes across frontend, backend, and shared modules: 347 test suites with zero failures.
  • The commit hook also passed the repository-wide TypeScript typecheck and the JetBrains typecheck.
  • ./gradlew detekt remains non-blocking because the repository has thousands of pre-existing baseline findings and no configured baseline; the documented JetBrains quality gates are typecheck and tests.

Screenshots / Video

Screen Shot 2026-09-21 at 12 49 35 PM GIF Recording 2026-09-21 at 12 50 34 PM

Checklist

  • Issue linked above, or exception explained
  • Tests and verification described
  • Final screenshots/video attached
  • Changeset considered: JetBrains releases use the jetbrains/v* changelog flow rather than .changeset
  • Human diff review completed

Port VS Code's background-agents feature to the JetBrains plugin: a
collapsible strip in the session header that lists running/finished
background subagents, alongside a shared Strip base class the to-do
strip now also uses.

- New shared BackgroundJobDto and KiloSessionRpcApi.backgroundJobs /
  cancelBackgroundJob / promoteBackgroundJob.
- Backend polls GET /kilocode/background-jobs (adaptive 1s/5s cadence,
  one poller shared across subscribers via shareIn) and posts
  cancel/promote via raw OkHttp, matching the sessionBoard precedent
  for routes newer than the generated client.
- SessionModel.backgroundAgents / dismissBackgroundAgents feed a new
  BackgroundAgentsUpdated event; SessionController keeps the "needs
  input" badge live off the existing pending-permission tracking.
- Strip (shared base), TodoStrip (extracted, now always visible
  instead of hidden inside the collapsible header body), and
  BackgroundAgentStrip (new): hover fill matching the collapsed
  session-view card header, horizontal-only scrolling for long
  content, full-row click to expand/collapse and to open a row's
  transcript, hidden entirely when there are no agents.
- TaskToolView gets a "Continue in background" action, gated live on
  GET /experimental/capabilities (backgroundSubagents) so it never
  offers a promote that would fail against a CLI with the background-
  subagent kill switch off.
- Agent Behavior settings: renamed the "Kilo Swarm" group to "Extended
  agents" (Swarm row unchanged); no new toggle yet, since background
  subagents have no CLI config key today, only an env var the pinned
  CLI can't be configured through from a setting.

Tests: pure derivation (BackgroundAgentsTest), shared strip mechanics
(StripTest), agent strip behavior + stress/leak (BackgroundAgentStrip*
Test), controller wiring (BackgroundAgentControllerTest), CLI parsing
and backend polling/HTTP (KiloCliDataParserTest, KiloBackendSession
ManagerBackgroundJobsTest, KiloBackendAppServiceTest), and the
capability-gated promote button (TaskToolViewTest).
@kilo-code-bot

kilo-code-bot Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (5 files)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/Strip.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/AgentAvatarTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStripTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TaskToolViewTest.kt
Resolved since the previous review (5)
  • BackgroundAgentStrip.kt KDoc now matches the success/error-only terminal glyph.
  • Strip.kt scroller reports width 0 in both modes, so a long title no longer drives header width in vertical mode.
  • AgentAvatarTest, TaskToolViewTest, and BackgroundAgentStripTest now render icons to a BufferedImage and compare pixels, so the color-resolver assertions exercise the override instead of relying on reference inequality.
Previous Review Summaries (4 snapshots, latest commit 79ae22f)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 79ae22f)

Status: 5 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 5

Fix these issues in Kilo Cloud

Issue Details (click to expand)

SUGGESTION

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt 277 Stale KDoc: claims a cancelled row keeps a sized blank glyph, but statusIcon returns null for CANCELLED and the slot is reclaimed
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/Strip.kt 198 Vertical-mode scroller reports the content's unclipped width as its preferred/minimum width, re-introducing content-driven header width that horizontal mode pins to 0
packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/AgentAvatarTest.kt 115 Color-override test is vacuous (assertNotNull on icons that always exist)
packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TaskToolViewTest.kt 134 Resolver/distinctness tests rely on reference inequality that holds by construction, so the resolver is not verified
packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStripTest.kt 359 Resolver test relies on reference inequality that holds by construction
Files Reviewed (25 files)
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/AgentAvatar.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/board/BoardAvatars.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/board/SessionBoardDialog.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/subagent/SubagentSessionEditorKind.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/subagent/SubagentTitleCache.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/SessionHeaderPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/Strip.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/ViewFactory.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/TaskToolView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/ui/UiStyle.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/vfs/KiloFileIconProvider.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/AgentAvatarTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/board/BoardAvatarsTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/subagent/SubagentSessionEditorKindTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStripTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/StripTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TaskToolViewStressTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TaskToolViewTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/vfs/KiloFileIconProviderTest.kt

Previous review (commit 905f933)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (3 files)
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloAppRpcApiImpl.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStripTest.kt

Previous review (commit 0bfcf75)

Status: 3 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 2

Fix these issues in Kilo Cloud

Issue Details (click to expand)

WARNING

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt 179 setComponentZOrder reorders the AWT component array, but Stack lays out from its own entries list, so the active-first reorder still does not take effect visually

SUGGESTION

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt 202 New rowOrder() test-only seam reads body.components, which is not the layout source of truth; also disallowed by the package AGENTS.md test-seam rule
packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloAppRpcApiImpl.kt 152 Private dto helper is now unused after state() switched to combine

The 4 findings from the previous review are resolved in 0bfcf75 (job-flow eviction, capability probe moved off the load path, no-op update guard).

Files Reviewed (9 files)
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloAppState.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendAppService.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloAppRpcApiImpl.kt - 1 issue
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendAppServiceTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerBackgroundJobsTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt - 2 issues
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStripTest.kt

Previous review (commit cfe8d2a)

Status: 4 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 2
SUGGESTION 2

Fix these issues in Kilo Cloud

Issue Details (click to expand)

WARNING

File Line Issue
packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt 361 jobFlows cache is never evicted; each session retains its shared flow and replay cache for the manager's lifetime
packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendAppService.kt 443 Capability fetch runs inside the load's coroutineScope/withTimeout, so a hung optional request can fail the whole connection load

SUGGESTION

File Line Issue
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt 90 Strip repaints on every header update even when the agent list is unchanged
packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt 159 Existing rows are never reordered, so active-first ordering only applies to newly created rows
Files Reviewed (43 files)
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloAppState.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendAppService.kt - 1 issue
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt - 1 issue
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloAppRpcApiImpl.kt
  • packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloSessionRpcApiImpl.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendAppServiceTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerBackgroundJobsTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.kt
  • packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionUi.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/background/BackgroundAgent.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/background/BackgroundAgents.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/controller/SessionController.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/model/SessionModel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/model/SessionModelEvent.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStrip.kt - 2 issues
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/SessionHeaderPanel.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/Strip.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/TodoStrip.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/BackgroundPromote.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/ViewFactory.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/TaskToolView.kt
  • packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/settings/agents/AgentBehaviorSettingsUi.kt
  • packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/background/BackgroundAgentsTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/controller/BackgroundAgentControllerTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/controller/SessionControllerTestBase.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStripStressTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/BackgroundAgentStripTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/SessionHeaderPanelTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/header/StripTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TaskToolViewTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/settings/agents/AgentBehaviorSettingsUiTest.kt
  • packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeSessionRpcApi.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloSessionRpcApi.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/dto/BackgroundJobDto.kt
  • packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/dto/KiloAppStateDto.kt

Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

- Evict the per-(directory, session) background-jobs flow cache when
  sharing stops, and clear it in stop(). WhileSubscribed halts the
  poller but retains the SharedFlow and its replayed jobs list, so the
  map previously grew with every session opened during an IDE run.
- Take the capability probe off the load's critical path. It ran inside
  the load's coroutineScope, and since the generated client's call is
  blocking, a timeout could not release it — structured concurrency
  would wait on the socket and fail an otherwise-successful load. It
  now runs after Ready and publishes into a separate capabilities
  StateFlow, so it is also no longer part of AppData: folding it in
  churned AppData's identity, which updateConfig/refreshConfigState use
  to detect a concurrent reload, silently cancelling a config write.
  Also rethrow CancellationException instead of swallowing it.
- Skip the agents strip update when the list is unchanged. The header
  re-syncs on every HeaderUpdated as tokens stream, so the retained
  strip was revalidating and repainting in the streaming hot path.
- Reorder existing agent rows. Rows were updated in place, so a
  finished agent kept its slot above still-active ones instead of
  honoring BackgroundAgents.order's active-first intent.

Tests: no-op update makes no dirty/invalid regions via a tracking
RepaintManager, finished agents drop below active ones, a hung
capability probe still reaches Ready, and the jobs flow still serves
and shares one poller after the last collector left. The two strip
tests were confirmed to fail without their fixes.
The previous reorder used setComponentZOrder, which reorders the AWT
component array — but Stack lays out from its own entries list, so the
active-first order never took effect visually. Re-add each row instead:
Stack's addLayoutComponent re-appends, which is what actually moves a
row in the layout.

The earlier test passed against the broken fix because rowOrder() read
body.components, the array Stack's layout does not consult. Replaced
that test-only seam with an assertion on real laid-out y positions,
which is the layout's actual output, and confirmed it fails without the
fix. Also drop the dto() helper in KiloAppRpcApiImpl, unused since
state() moved to combine().
@marius-kilocode

Copy link
Copy Markdown
Collaborator

Screenshots would be nice :)

@kirillk

kirillk commented Sep 21, 2026

Copy link
Copy Markdown
Contributor Author

Screenshots would be nice :)

Will add, it was WIP on Friday, just wanted the badge.

Give subagents deterministic animated identities across task cards, background rows, boards, and editor tabs. Keep background-agent actions visible with width-tracking rows and a five-row vertical scroll cap.
@kirillk kirillk changed the title feat(jetbrains): add background agents strip to the session header feat(jetbrains): add background agents and subagent avatars Sep 21, 2026
Prevent long agent titles from influencing strip width, align the status documentation with cancellation behavior, and replace tautological icon tests with rendered-pixel assertions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants