π File detail
utils/collapseBackgroundBashNotifications.ts
π§© .tsπ 85 linesπΎ 2,750 bytesπ text
β Back to All Filesπ― Use case
This file lives under βutils/β, which covers cross-cutting helpers (shell, tempfiles, settings, messages, process input, β¦). On the API surface it exposes collapseBackgroundBashNotifications β mainly functions, hooks, or classes. It composes internal code from constants, tasks, types, fullscreen, and messages (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import { STATUS_TAG, SUMMARY_TAG, TASK_NOTIFICATION_TAG, } from '../constants/xml.js'
π€ Exports (heuristic)
collapseBackgroundBashNotifications
π₯οΈ Source preview
import {
STATUS_TAG,
SUMMARY_TAG,
TASK_NOTIFICATION_TAG,
} from '../constants/xml.js'
import { BACKGROUND_BASH_SUMMARY_PREFIX } from '../tasks/LocalShellTask/LocalShellTask.js'
import type {
NormalizedUserMessage,
RenderableMessage,
} from '../types/message.js'
import { isFullscreenEnvEnabled } from './fullscreen.js'
import { extractTag } from './messages.js'
function isCompletedBackgroundBash(
msg: RenderableMessage,
): msg is NormalizedUserMessage {
if (msg.type !== 'user') return false
const content = msg.message.content[0]
if (content?.type !== 'text') return false
if (!content.text.includes(`<${TASK_NOTIFICATION_TAG}`)) return false
// Only collapse successful completions β failed/killed stay visible individually.
if (extractTag(content.text, STATUS_TAG) !== 'completed') return false
// The prefix constant distinguishes bash-kind LocalShellTask completions from
// agent/workflow/monitor notifications. Monitor-kind completions have their
// own summary wording and deliberately don't collapse here.
return (
extractTag(content.text, SUMMARY_TAG)?.startsWith(
BACKGROUND_BASH_SUMMARY_PREFIX,
) ?? false
)
}
/**
* Collapses consecutive completed-background-bash task-notifications into a
* single synthetic "N background commands completed" notification. Failed/killed
* tasks and agent/workflow notifications are left alone. Monitor stream
* events (enqueueStreamEvent) have no <status> tag and never match.
*
* Pass-through in verbose mode so ctrl+O shows each completion.
*/
export function collapseBackgroundBashNotifications(
messages: RenderableMessage[],
verbose: boolean,
): RenderableMessage[] {
if (!isFullscreenEnvEnabled()) return messages
if (verbose) return messages
const result: RenderableMessage[] = []
let i = 0
while (i < messages.length) {
const msg = messages[i]!
if (isCompletedBackgroundBash(msg)) {
let count = 0
while (i < messages.length && isCompletedBackgroundBash(messages[i]!)) {
count++
i++
}
if (count === 1) {
result.push(msg)
} else {
// Synthesize a task-notification that UserAgentNotificationMessage
// already knows how to render β no new renderer needed.
result.push({
...msg,
message: {
role: 'user',
content: [
{
type: 'text',
text: `<${TASK_NOTIFICATION_TAG}><${STATUS_TAG}>completed</${STATUS_TAG}><${SUMMARY_TAG}>${count} background commands completed</${SUMMARY_TAG}></${TASK_NOTIFICATION_TAG}>`,
},
],
},
})
}
} else {
result.push(msg)
i++
}
}
return result
}