Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/coding-agent/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@
- `todo_write` recovery reminders now distinguish rejected payloads from runtime aborts, preserve the available cause, and require durable state reconciliation instead of incorrectly telling the agent to change a valid payload (#3743, #3760).
- Authority-absent Darwin `appendSync` regression coverage now exercises the replace-based race window (destination mutation during successor staging) instead of the retired in-place `O_APPEND` open path, and documents that ctime-only destination transitions are tolerated by exact replacement.
- The legacy interactive footer now uses the session manager's cumulative usage index, so completed task and subagent tokens, premium requests, and estimated costs are included exactly once instead of reporting only the parent agent's assistant messages.
### Fixed

- Hiding the `jobs` status-line segment now also hides the background-job counter. The status line appended a hardcoded `N jobs running` chip after rendering the configured segments, without consulting `statusLine.leftSegments` / `statusLine.rightSegments`, so setting `jobs` to hidden in `/settings` removed only the monitor/cron widget while the async job counter kept rendering with the same icon and color. Every bundled preset keeps `jobs` in `rightSegments`, so default output is unchanged.

## [0.12.10] - 2026-08-03

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -806,8 +806,13 @@ export class StatusLineComponent implements Component {
}
right.push(...actionHints.map(hint => hint.content));

const runningBackgroundJobs =
this.session.getAsyncJobSnapshot()?.running.filter(job => job.metadata?.monitor !== true).length ?? 0;
// Background (non-monitor) jobs are part of the `jobs` widget, so honor its
// placement: hiding the `jobs` segment must hide this counter too.
const jobsSegmentVisible =
effectiveSettings.leftSegments.includes("jobs") || effectiveSettings.rightSegments.includes("jobs");
const runningBackgroundJobs = jobsSegmentVisible
? (this.session.getAsyncJobSnapshot()?.running.filter(job => job.metadata?.monitor !== true).length ?? 0)
: 0;
if (runningBackgroundJobs > 0) {
const icon = theme.icon.agents ? `${theme.icon.agents} ` : "";
const label = `${formatCount("job", runningBackgroundJobs)} running`;
Expand Down
13 changes: 13 additions & 0 deletions packages/coding-agent/test/jobs-segment.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,17 @@ describe("jobs status-line segment", () => {
const rendered = Bun.stripANSI(component.render(120).join("\n"));
expect(rendered).toContain("job running");
});

test("status line drops the legacy job count when the jobs segment is hidden", () => {
const component = new StatusLineComponent(makeStatusLineSession([{ id: "task-1", type: "task" }]));
component.updateSettings({
preset: "custom",
leftSegments: [],
rightSegments: ["cost"],
showSkillHud: false,
});

const rendered = Bun.stripANSI(component.render(120).join("\n"));
expect(rendered).not.toContain("job running");
});
});