Skip to content

feat: unify monitors and shells into notifying shells - #1065

Merged
AmiteshwarRandhawa merged 35 commits into
mainfrom
traycer/quiet-octopus
Aug 9, 2026
Merged

AmiteshwarRandhawa merged 35 commits into
mainfrom
traycer/quiet-octopus

Conversation

@AmiteshwarRandhawa

Copy link
Copy Markdown
Contributor

What

Unifies monitors and shells into one entity: the shell. The "monitor" | "shell" kind is deleted from the protocol and UI; what used to be a monitor is a shell with notifications on, and "monitor" survives as a role word, not a schema concept.

  • managedCommandSchema.kind → notifying: boolean; same swap on the chat queue item (nullable), the persisted resume-divider trigger (defaulted false — old chats still parse), and the resources.subscribe@1.4 owner rows. chat.subscribe@1.6 edited in place — the surface is unshipped beyond staging, and fleets deploy matched versions.
  • GUI: "Shell" is the only entity noun ("Shells" menu, Shell · <description> rows). The Radar/CirclePlay glyphs now key off the live-mutable notifying flag and swap in place when an agent retunes a shell. Attention badges fire on nonzero exit / signal death / spawn failure only — never a clean exit — and acknowledgement is keyed to the ending itself, so record churn around an already-seen failure (e.g. the agent muting a dead shell) cannot re-light the badge.
  • Kind-only "monitor" resume triggers (no managedCommand block) keep the name "Monitor": their live producer is Claude Code's own Monitor tool, which is a different thing from a Traycer shell.

Why

The kind bundled delivery timing, respawn policy, and UI news-worthiness into one immutable label, and the delivery cadence it implied was too noisy in practice. The host side (traycerai/traycer-internal PR opened alongside) makes the notification behavior a live-tunable per-shell config; this PR is the wire and GUI half of that model.

🤖 Generated with Claude Code

AmiteshwarRandhawa and others added 19 commits August 5, 2026 21:55
Protocol: the managed-command queue item gains delivery/targetTurnId and a
steering status (all defaulted; the chat.subscribe line carrying the variant
is still unshipped, so old rows rehydrate as the next-turn fallback).

GUI: the chat becomes the home for its monitors and shells - a floating
top-right menu (presence keyed to existence, attention badge acknowledged by
opening, rows with lifecycle controls, drag a row out to place or move its
output window), the epic sidebar list is gone, the Background panel folds
managed rows into its one list with a Stop all that genuinely stops them,
and the output window follows the terminal font settings.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
Review round: Stop all now offers and sends each of its two halves on that
half's own capability, so a reconnecting chat keeps the one-click stop for
runaway monitors (the harness half is simply skipped); the aggregated stop
fails once with the real host error when no client can be built instead of
manufacturing N identical rejections; the output-tile timeline test binds to
the exposed log role rather than a test id.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
… in tests

A managed-command chip in the new steering state locked its controls with no
visible reason - the label logic still assumed only pending|paused could
occur. The handover window now reads "Delivering", so the closed cancel
lever explains itself. The new Stop all assertions bind to the button's role
and accessible name per house guidelines.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
…ments

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>

# Conflicts:
#	clients/gui-app/src/__tests__/acceptance/managed-command-s5-sidebar.test.tsx
#	clients/gui-app/src/__tests__/acceptance/managed-command-s8-s9-tile-ref-resources.test.tsx
#	clients/gui-app/src/components/epic-canvas/sidebar/__tests__/managed-command-sidebar.test.tsx
The badge floated over the transcript's top-right corner, which put it
where the reading happens and gave it a plate of its own to stay legible
over live text. It now sits in the workspace-controls row under the
composer, next to the host, workspace and context-usage chips - the other
per-chat facts a person checks between turns - and wears their styling:
no plate, no border, dimmed until hovered, popover opening upward.

It rides the row's leading cell rather than becoming a third grid column:
the usage chip's pinned breakdown spans the row with `col-span-full`,
which only works while it is a direct child of ComposerWorkspaceRow's
two-column grid. `justify-between` parks the menu at that cell's trailing
edge, so it reads as the chip's left-hand neighbour and the workspace
selector gives up width first when the row is tight.

Presence rule is unchanged: nothing renders while the chat owns no
commands, and the menu never unmounts under an open popover.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
b8ee4e2 taught BackgroundItemsPanel to read the tile's bound host and to
mint a managed-command "Stop all" mutation, but four suites that render it
still stood outside <TabHostProvider> or mocked the lifecycle-mutations
module without `useManagedCommandStopAll`; the chat-tile suites likewise
mocked the stream-runtime context without the support probe the monitors
menu makes. Each render threw where the panel used to be inert.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
…l rule

The delete confirmation survives its popover (same focus-outside guard as the
notifications bell); the popover caps to the viewport and scrolls; the
trigger's accessible name carries what its counts count; drag ids are unique
per mounted row so the same chat open twice cannot cross wires; endings that
arrive while the menu is open count as seen; the delivery pulse announces the
visible label; Stop all is one button with one in-flight state; plus
unavailable-host coverage and native disabled assertions.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
The same chat can be open in two canvas tiles, and each panel owned its own
mutation observer - the second tile's button stayed live while the first
tile's batch ran and could re-submit the same command ids. The button now
reads the batch's in-flight state through useIsMutating, shared across every
mounted panel.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
…h state

The shared pending read exists for the same chat open in two tiles - an
app-wide key let one chat's batch disable every other chat's button, so the
mutation key now carries the chat id. Per-row stops also go dead during the
batch: a row press mid-batch re-sent a stop the batch already carries.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
…ble name

Every suite that mocks the lifecycle-mutations module now exports the shared
pending read, and the acceptance suite's trigger query prefix-matches the
accessible name that carries live counts.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
Gated at the shared lifecycle action - which reads the batch state off the
command's own chat id - so the menu row, the output window, and the panel row
follow one rule instead of each surface re-implementing it; the panel's own
belt-and-suspenders hiding rule collapses away.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
A digest aimed at the running turn read identically to a next-turn one;
"Will deliver" - the delivery-vocabulary sibling of the prompt rows' "Will
steer" - tells the user the cancel window is the current turn.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
…m is gone

The standalone managedCommand.subscribeList existed to serve a global panel
that no longer exists; every consumer is chat-scoped. chat.subscribe snapshots
now carry managedCommands (default [], never null-checked - an old host and an
empty chat both truthfully read as none) and a dedicated whole-set
managedCommandsChanged frame carries updates, deliberately not riding
turnStateChanged because a command's lifecycle is not a turn transition.

Because chat.subscribe is tab-host-bound, a chat tile now reads its own
host's commands by construction - the cross-host defect where a tile bound to
one host rendered another host's list is unrepresentable. The list stream
mount, store, registry, factory override, stale-list plumbing and the menu's
now-unrepresentable host-too-old branch are deleted; the re-entry path for a
future epic-wide list is documented where the method lived.

Output-window tab titles narrow: with no epic-wide list, a window whose
owning chat has no live session falls back to its persisted name until one
opens.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>

# Conflicts:
#	clients/gui-app/src/hooks/managed-command/__tests__/use-managed-command-stop-all.test.tsx
#	clients/gui-app/src/hooks/managed-command/use-managed-command-lifecycle-mutations.ts
Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
Every shell row in the resources popover now tucks behind the row of the
agent that created it - a GUI chat or a TUI agent, uniformly. While the
creator's program runs, its existing owner row is the parent; otherwise a
Synthetic Agent Row stands in: the agent's title and chat glyph, click
navigates to the agent, no metrics or kill affordance of its own, alive
only while at least one of its shells runs. A shell whose creator cannot
be resolved stays flat at the task level, as before.

Collapsed parents state the whole subtree (program + shells) and sort by
it; expanded they drop to their own usage while shell sub-rows carry
theirs. Shell rows are now always clickable - the output window is a pure
commandId+hostId pointer, so opening one needs no surviving tile payload.

Kill targeting counts only rows on screen: Select all no longer reaps a
shell tucked behind a collapsed parent. The wire carries the one new fact
this needs, managedCommand.createdByAgentId, defaulted on parse so a host
from before the field degrades to the flat list instead of failing every
frame.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
@coderabbitai

coderabbitai Bot commented Aug 8, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Summary by CodeRabbit

  • New Features

    • Managed commands are now presented consistently as Shells across menus, queues, output windows, resource lists, and canvas tiles.
    • Shell activity appears in chat and workspace activity indicators while running.
    • Added clear visual indicators for monitoring-enabled and non-monitoring shells.
    • Improved deletion, stopping, failure, and output messaging for shell workflows.
    • Shell attention notifications remain accurate across updates and reappear for later failures.
  • Bug Fixes

    • Improved handling of legacy monitor data and missing monitoring information.
    • Prevented unrelated updates from incorrectly re-triggering attention alerts.

Walkthrough

Managed commands now use a monitoring flag instead of monitor or shell kind metadata. GUI surfaces use Shell labels and monitoring-state icons. Attention tracking uses command-ending identities. Running shells contribute background activity indicators. Tests cover protocol, persistence, UI, activity, and compatibility behavior.

Changes

Managed command model and state

Layer / File(s) Summary
Protocol and persistence contracts
protocol/src/host/managed-command/*, protocol/src/host/resources/*, protocol/src/persistence/epic/*
Managed-command schemas replace kind with monitoring. Queue, resource-owner, resume-trigger, and persisted schemas retain compatibility defaults where defined.
Copy and attention state
clients/gui-app/src/lib/managed-commands/*, clients/gui-app/src/stores/managed-commands/*, clients/gui-app/src/stores/resources/resources-store.ts
Shell-specific copy replaces kind-based labels. Attention detection uses exit outcomes and ending identities instead of command kind and update timestamps.

Shell UI surfaces

Layer / File(s) Summary
Shell menus, queue items, and output windows
clients/gui-app/src/components/chat/*, clients/gui-app/src/components/managed-commands/*, clients/gui-app/src/components/epic-canvas/renderers/*
Chat rows, queued badges, resume segments, menus, and output tiles use Shell terminology and monitoring-state icons.
Resource rows and lifecycle messages
clients/gui-app/src/components/resources/resource-monitor-popover.tsx, clients/gui-app/src/components/managed-commands/managed-command-lifecycle-actions.tsx, clients/gui-app/src/hooks/managed-command/*
Resource labels, deletion messages, stop-all errors, and output descriptions refer to shells and shell output.

Activity and validation

Layer / File(s) Summary
Background activity state
clients/gui-app/src/components/epic-canvas/renderers/chat-tile-session-state.ts, clients/gui-app/src/components/epic-canvas/sidebar/epic-sidebar-chat-tree.tsx, clients/gui-app/src/hooks/epic/use-epic-activity-status.ts
Idle chats report background activity when a managed command is running. Sidebar archive status excludes shell activity.
Acceptance and contract coverage
clients/gui-app/src/__tests__/acceptance/*, clients/gui-app/src/components/**/__tests__/*, protocol/src/**/__tests__/*, clients/shared/host-transport/__tests__/*
Fixtures and assertions use monitoring. Tests cover Shell labels, output doors, glyph changes, attention behavior, activity precedence, resource validation, and legacy triggers.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant HostProtocol
  participant ChatSession
  participant ShellMenu
  participant OutputWindow
  HostProtocol->>ChatSession: deliver managed command with monitoring
  ChatSession->>ShellMenu: render Shell row and monitoring icon
  ShellMenu->>OutputWindow: open shell output
  OutputWindow->>ChatSession: read live shell state
Loading

Possibly related PRs

Suggested reviewers: hdkshingala

Poem

A rabbit saw Shells replace the old kind,
With Radar and Play glyphs neatly aligned.
Ending keys kept alerts in tune,
Background hops lit up the room.
“Clean Shell labels!” the rabbit cheered,
“The output doors are clear!”

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 49.12% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: unifying monitors and shells into notifying shells.
Description check ✅ Passed The description directly explains the protocol, GUI, compatibility, and attention-state changes in the pull request.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch traycer/quiet-octopus

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: df7fe77b8e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread protocol/src/persistence/epic/content-blocks.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@clients/gui-app/src/components/chat/queued-message-surface.tsx`:
- Around line 664-669: Update the documentation comment near the queued-message
surface to describe the actual legacy-delivery fallback implemented by the
`notifying === null` branch in the rendering logic: no glyph is rendered. Remove
the claim that legacy deliveries receive a neutral terminal glyph, while
preserving the explanation of the shell label and click behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e4f4ca18-a846-4a32-96b3-1ea1fd12fb78

📥 Commits

Reviewing files that changed from the base of the PR and between 6c45acd and df7fe77.

📒 Files selected for processing (60)
  • clients/gui-app/src/__tests__/acceptance/managed-command-s4-output-window.test.tsx
  • clients/gui-app/src/__tests__/acceptance/managed-command-s6-s7-chat-doors.test.tsx
  • clients/gui-app/src/__tests__/acceptance/managed-command-s8-s9-tile-ref-resources.test.tsx
  • clients/gui-app/src/components/chat/__tests__/managed-command-chat-surfaces.test.tsx
  • clients/gui-app/src/components/chat/__tests__/queued-message-reorder-dnd.test.ts
  • clients/gui-app/src/components/chat/__tests__/queued-message-surface.test.tsx
  • clients/gui-app/src/components/chat/__tests__/queued-message-utils.test.ts
  • clients/gui-app/src/components/chat/chat-background-items-panel.tsx
  • clients/gui-app/src/components/chat/chat-queue-utils.ts
  • clients/gui-app/src/components/chat/composer/composer-drag-attachment.ts
  • clients/gui-app/src/components/chat/queued-message-surface.tsx
  • clients/gui-app/src/components/chat/segments/__tests__/autonomous-resume-segment.test.tsx
  • clients/gui-app/src/components/chat/segments/autonomous-resume-segment.tsx
  • clients/gui-app/src/components/epic-canvas/__tests__/chat-tile-queue-edit-steer.test.tsx
  • clients/gui-app/src/components/epic-canvas/__tests__/chat-tile.test.tsx
  • clients/gui-app/src/components/epic-canvas/dnd/dnd.ts
  • clients/gui-app/src/components/epic-canvas/renderers/__tests__/chat-lower-background-spacing.test.tsx
  • clients/gui-app/src/components/epic-canvas/renderers/__tests__/managed-command-output-tile.test.tsx
  • clients/gui-app/src/components/epic-canvas/renderers/chat-tile.tsx
  • clients/gui-app/src/components/epic-canvas/renderers/dead-tile-banner.tsx
  • clients/gui-app/src/components/epic-canvas/renderers/managed-command-output-tile.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-kind-icon.test.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-lifecycle-actions.test.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-menu-drag-out.test.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-notify-icon.test.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-chat-menu.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-kind-icon.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-lifecycle-actions.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-notify-icon.tsx
  • clients/gui-app/src/components/resources/__tests__/resource-monitor-popover.test.tsx
  • clients/gui-app/src/components/resources/resource-monitor-popover.tsx
  • clients/gui-app/src/hooks/managed-command/__tests__/use-managed-command-stop-all.test.tsx
  • clients/gui-app/src/hooks/managed-command/use-managed-command-lifecycle-mutations.ts
  • clients/gui-app/src/lib/host-rpc-policy/host-method-policy-table.ts
  • clients/gui-app/src/lib/managed-commands/managed-command-copy.ts
  • clients/gui-app/src/lib/managed-commands/use-open-managed-command-output.ts
  • clients/gui-app/src/stores/chats/__tests__/chat-queue-reconciler.test.ts
  • clients/gui-app/src/stores/chats/__tests__/chat-session-store.test.ts
  • clients/gui-app/src/stores/chats/__tests__/optimistic-queue.test.ts
  • clients/gui-app/src/stores/chats/__tests__/profile-durability-d1-queue-restamp.test.ts
  • clients/gui-app/src/stores/chats/chat-session-store.ts
  • clients/gui-app/src/stores/epics/canvas/__tests__/managed-command-output-tile-schema.test.ts
  • clients/gui-app/src/stores/epics/canvas/tile-kinds.ts
  • clients/gui-app/src/stores/epics/canvas/tile-schema/managed-command-output-tile.ts
  • clients/gui-app/src/stores/epics/canvas/types.ts
  • clients/gui-app/src/stores/managed-commands/__tests__/managed-command-attention.test.ts
  • clients/gui-app/src/stores/managed-commands/__tests__/managed-command-output-store.test.ts
  • clients/gui-app/src/stores/managed-commands/managed-command-attention-store.ts
  • clients/gui-app/src/stores/managed-commands/managed-commands-for-chat.ts
  • clients/gui-app/src/stores/resources/resources-store.ts
  • protocol/scripts/compat/compat-exceptions.json
  • protocol/src/host/agent/gui/__tests__/chat-subscribe.test.ts
  • protocol/src/host/agent/gui/subscribe.ts
  • protocol/src/host/managed-command/__tests__/managed-command-chat-surfaces.test.ts
  • protocol/src/host/managed-command/__tests__/managed-command-contracts.test.ts
  • protocol/src/host/managed-command/unary-schemas.ts
  • protocol/src/host/resources/__tests__/resources-subscribe.test.ts
  • protocol/src/host/resources/subscribe.ts
  • protocol/src/persistence/epic/__tests__/__fixtures__/epic-schema-surface.ts
  • protocol/src/persistence/epic/content-blocks.ts
💤 Files with no reviewable changes (2)
  • clients/gui-app/src/components/managed-commands/tests/managed-command-kind-icon.test.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-kind-icon.tsx

Comment thread clients/gui-app/src/components/chat/queued-message-surface.tsx

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a3f9133d46

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread protocol/src/host/managed-command/unary-schemas.ts Outdated
…field

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
A chat whose only live thing is a shell read as fully idle: the activity
chokepoint never consulted managed commands, and a shell outlives the turn
that started it. A running shell now reads as background activity from the
one chokepoint, so canvas chat tabs, sidebar rows, and the Task tab strip
all pick it up. Only running shells count - an exited, stopped, or
interrupted shell is a durable record, not activity - and an active turn
still wins.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
…e honesty

Three follow-ups from local review of the running-shell indicator:

- The sidebar archive gate reads a shell-free activity indicator again. The
  widened chokepoint had silently made a running shell block Archive, while
  the host allows it (AgentActivityTracker does not track shells) - the gate's
  own honesty rule. The row's progress icon keeps the shell-aware read.
- The notify glyph speaks its state (role img, Notifying / Not notifying).
  Post-unification every label is the constant Shell, so the glyph is the
  only carrier of the flag; aria-hidden made it invisible to screen readers.
- The epic aggregation's doc states its warm-session-only coverage for
  shells; cold-chat coverage needs the host activity plane to learn about
  managed commands (follow-up, deliberately not faked client-side).

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@clients/gui-app/src/components/managed-commands/__tests__/managed-command-notify-icon.test.tsx`:
- Around line 60-75: Update the managed-command notify icon test to import
screen from Testing Library and replace the container.querySelector SVG lookups
with screen.getByRole("img", { name: "Notifying" }) and screen.getByRole("img",
{ name: "Not notifying" }), while preserving the existing class assertion.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8d69c98d-1014-4b74-ac0c-07176de103df

📥 Commits

Reviewing files that changed from the base of the PR and between 8048070 and f79a875.

📒 Files selected for processing (5)
  • clients/gui-app/src/components/epic-canvas/sidebar/epic-sidebar-chat-tree.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-notify-icon.test.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-notify-icon.tsx
  • clients/gui-app/src/hooks/epic/use-epic-activity-status.ts
  • clients/gui-app/src/lib/host-rpc-policy/host-method-policy-table.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f79a875bdf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

The agent-facing flag is now monitor and the wire field is monitoring -
intent-shaped naming (monitor this PR -> monitor: true) settled in the
unification's vocabulary review. In-place wire edit on the staging-only
fleet, matching the rest of the branch. The monitor icon speaks its state
(Monitoring / Not monitoring) now that every label is the constant Shell.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@clients/gui-app/src/components/managed-commands/__tests__/managed-command-monitor-icon.test.tsx`:
- Around line 64-74: Update the managed-command monitor icon test to import
screen and use screen.getByRole("img", { name: "Monitoring" }) and
screen.getByRole("img", { name: "Not monitoring" }) for accessibility
assertions. Retain the existing DOM selector assertions for the icon glyph and
data-monitor-icon attributes.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 20eb0cc5-02ff-498a-a587-c333a8c327d4

📥 Commits

Reviewing files that changed from the base of the PR and between f79a875 and b1f4114.

📒 Files selected for processing (44)
  • clients/gui-app/src/__tests__/acceptance/managed-command-s4-output-window.test.tsx
  • clients/gui-app/src/__tests__/acceptance/managed-command-s6-s7-chat-doors.test.tsx
  • clients/gui-app/src/__tests__/acceptance/managed-command-s8-s9-tile-ref-resources.test.tsx
  • clients/gui-app/src/components/chat/__tests__/chat-progress-icon.test.tsx
  • clients/gui-app/src/components/chat/__tests__/managed-command-chat-surfaces.test.tsx
  • clients/gui-app/src/components/chat/__tests__/queued-message-reorder-dnd.test.ts
  • clients/gui-app/src/components/chat/__tests__/queued-message-surface.test.tsx
  • clients/gui-app/src/components/chat/__tests__/queued-message-utils.test.ts
  • clients/gui-app/src/components/chat/chat-background-items-panel.tsx
  • clients/gui-app/src/components/chat/queued-message-surface.tsx
  • clients/gui-app/src/components/epic-canvas/renderers/__tests__/chat-lower-background-spacing.test.tsx
  • clients/gui-app/src/components/epic-canvas/renderers/__tests__/chat-tile-session-state.test.ts
  • clients/gui-app/src/components/epic-canvas/renderers/__tests__/managed-command-output-tile.test.tsx
  • clients/gui-app/src/components/epic-canvas/renderers/managed-command-output-tile.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-lifecycle-actions.test.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-menu-drag-out.test.tsx
  • clients/gui-app/src/components/managed-commands/__tests__/managed-command-monitor-icon.test.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-chat-menu.tsx
  • clients/gui-app/src/components/managed-commands/managed-command-monitor-icon.tsx
  • clients/gui-app/src/components/resources/__tests__/resource-monitor-popover.test.tsx
  • clients/gui-app/src/components/resources/resource-monitor-popover.tsx
  • clients/gui-app/src/hooks/epic/__tests__/use-epic-activity-status.test.tsx
  • clients/gui-app/src/hooks/managed-command/__tests__/use-managed-command-stop-all.test.tsx
  • clients/gui-app/src/lib/managed-commands/managed-command-copy.ts
  • clients/gui-app/src/stores/chats/__tests__/chat-queue-reconciler.test.ts
  • clients/gui-app/src/stores/chats/__tests__/chat-session-store.test.ts
  • clients/gui-app/src/stores/chats/__tests__/optimistic-queue.test.ts
  • clients/gui-app/src/stores/chats/__tests__/profile-durability-d1-queue-restamp.test.ts
  • clients/gui-app/src/stores/epics/canvas/__tests__/managed-command-output-tile-schema.test.ts
  • clients/gui-app/src/stores/epics/canvas/tile-schema/managed-command-output-tile.ts
  • clients/gui-app/src/stores/managed-commands/__tests__/managed-command-attention.test.ts
  • clients/gui-app/src/stores/managed-commands/__tests__/managed-command-output-store.test.ts
  • clients/gui-app/src/stores/resources/resources-store.ts
  • clients/shared/host-transport/__tests__/chat-stream-client.test.ts
  • clients/shared/host-transport/__tests__/resources-stream-client.test.ts
  • protocol/src/host/agent/gui/__tests__/chat-subscribe.test.ts
  • protocol/src/host/agent/gui/subscribe.ts
  • protocol/src/host/managed-command/__tests__/managed-command-chat-surfaces.test.ts
  • protocol/src/host/managed-command/__tests__/managed-command-contracts.test.ts
  • protocol/src/host/managed-command/unary-schemas.ts
  • protocol/src/host/resources/__tests__/resources-subscribe.test.ts
  • protocol/src/host/resources/subscribe.ts
  • protocol/src/persistence/epic/__tests__/__fixtures__/epic-schema-surface.ts
  • protocol/src/persistence/epic/content-blocks.ts

AmiteshwarRandhawa and others added 5 commits August 9, 2026 20:31
…ll a job

The sidebar's archive affordance read chat activity with shells stripped out,
because the host used to permit archiving a chat whose only live thing was a
shell. The host now refuses that archive, so the shim would offer an action the
host bounces - the exact dishonesty the gate's own comment forbids. It reads
the shell-aware indicator again.

In the background-items panel the managed rows carried a constant "SHELL" pill
beside a title that already says Shell. The slot now carries the only state that
separates two shell rows: it reads MONITORING when the shell is monitoring, and
is absent otherwise, so an empty slot is what makes the pill mean something.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
A person watching a shell run in the composer's Background panel could not
place its output window from there - they had to find the same shell again in
the chat's Shells menu, the only surface whose rows drag out. The panel's
managed rows now carry the same dnd payload, so the canvas needs no new drop
handling and one window per command still holds: a second drop moves the tile
it already opened rather than making another.

Clicking still opens the window wherever the door puts it, and the hover stop
stays outside the drag handle. The menu's drag-out once broke because its
popover unmounted the source mid-gesture and dnd-kit reads a drag's payload
live off the draggable that started it; this panel is inline, and the new
suite pins that the row is still mounted at the drop.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
The Shells surface named every shell "Shell" and spent a pill on the monitor
flag. Product settled the other way: the entity noun follows the state, so a
shell with monitoring on is titled "Monitor · deploy watcher" and one with it
off "Shell · db migration". The flag is live-tunable, so the name changes under
a row that stays put - which is the point, because the rename is how a shell
that stopped being a watcher says so.

`managedCommandTitle` takes the flag, which reaches every title site through
the command it already receives: Background-panel rows, the chat's Shells menu,
the output window's header and its canvas tab, the delete confirmation, and the
resource monitor's owner rows (the owner frame carries `monitoring` precisely so
one process tree is not labelled two ways). The resume divider follows the flag
too, for triggers that carry a managed-command block; a kind-only "monitor"
trigger is Claude Code's own Monitor tool and keeps its own name untouched.

The MONITORING pill is gone from the Background panel: the title says it now, so
the pill was a second fact and was none. And with the state in visible text, the
row/header glyphs go decorative - announcing "Monitoring" beside a title that
already says Monitor reads it out twice. The queued-delivery chip is the one
exception, since its label is the constant "Shell output": there the glyph is
still the only carrier and keeps speaking.

"Shells" stays the umbrella - the container, the output window's own name, the
resource monitor's kind column - because a monitor IS a shell.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 90fd75c931

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread clients/gui-app/src/components/chat/chat-background-items-panel.tsx
Comment thread protocol/src/persistence/epic/content-blocks.ts
Brings shells nested under their creator in the resource monitor onto the
branch that had since renamed the monitor vocabulary (notifying -> monitoring)
and made the shell's noun follow its monitor state. Conflicts resolved as the
union of both: the feature's createdByAgentId plumbing and synthetic
creator-row tests, in the receiving branch's vocabulary.

A monitoring shell now reads "Monitor · deploy watcher", so the nesting
tests address their rows by that label.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 9, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f20ae2ed3f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…ng it

The monitor's kill affordance treated a managed shell row like any other
process tree and raw-signalled it through `resources.kill`. The supervisor
then recorded `exited (signal SIGTERM)` - a crash, as far as every reader of
that status is concerned - which lit the chat's attention badge and invited
the agent to restart the shell the human had just asked it to stop.

A shell row now carries the supervisor's Stop instead, the same button the
Shells surfaces use, driving `managedCommand.stop`. Individual processes
nested UNDER a shell keep the raw kill: killing one pid out of a tree really
is process-level intent. Selection mode carries the split too - selected
shells are stopped, selected processes killed, and the action button names
both verbs so it cannot promise one act and perform the other.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 9, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8f932dd488

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

The stop-not-kill change put this file in the lint-affected set, and the
function's pre-existing fifth parameter fails max-params at the CI gate.

Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
@AmiteshwarRandhawa
AmiteshwarRandhawa merged commit e8206d4 into main Aug 9, 2026
20 checks passed
@AmiteshwarRandhawa
AmiteshwarRandhawa deleted the traycer/quiet-octopus branch August 9, 2026 20:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant