feat: unify monitors and shells into notifying shells - #1065
Conversation
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>
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Summary by CodeRabbit
WalkthroughManaged commands now use a ChangesManaged command model and state
Shell UI surfaces
Activity and validation
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
Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 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".
There was a problem hiding this comment.
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
📒 Files selected for processing (60)
clients/gui-app/src/__tests__/acceptance/managed-command-s4-output-window.test.tsxclients/gui-app/src/__tests__/acceptance/managed-command-s6-s7-chat-doors.test.tsxclients/gui-app/src/__tests__/acceptance/managed-command-s8-s9-tile-ref-resources.test.tsxclients/gui-app/src/components/chat/__tests__/managed-command-chat-surfaces.test.tsxclients/gui-app/src/components/chat/__tests__/queued-message-reorder-dnd.test.tsclients/gui-app/src/components/chat/__tests__/queued-message-surface.test.tsxclients/gui-app/src/components/chat/__tests__/queued-message-utils.test.tsclients/gui-app/src/components/chat/chat-background-items-panel.tsxclients/gui-app/src/components/chat/chat-queue-utils.tsclients/gui-app/src/components/chat/composer/composer-drag-attachment.tsclients/gui-app/src/components/chat/queued-message-surface.tsxclients/gui-app/src/components/chat/segments/__tests__/autonomous-resume-segment.test.tsxclients/gui-app/src/components/chat/segments/autonomous-resume-segment.tsxclients/gui-app/src/components/epic-canvas/__tests__/chat-tile-queue-edit-steer.test.tsxclients/gui-app/src/components/epic-canvas/__tests__/chat-tile.test.tsxclients/gui-app/src/components/epic-canvas/dnd/dnd.tsclients/gui-app/src/components/epic-canvas/renderers/__tests__/chat-lower-background-spacing.test.tsxclients/gui-app/src/components/epic-canvas/renderers/__tests__/managed-command-output-tile.test.tsxclients/gui-app/src/components/epic-canvas/renderers/chat-tile.tsxclients/gui-app/src/components/epic-canvas/renderers/dead-tile-banner.tsxclients/gui-app/src/components/epic-canvas/renderers/managed-command-output-tile.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-kind-icon.test.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-lifecycle-actions.test.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-menu-drag-out.test.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-notify-icon.test.tsxclients/gui-app/src/components/managed-commands/managed-command-chat-menu.tsxclients/gui-app/src/components/managed-commands/managed-command-kind-icon.tsxclients/gui-app/src/components/managed-commands/managed-command-lifecycle-actions.tsxclients/gui-app/src/components/managed-commands/managed-command-notify-icon.tsxclients/gui-app/src/components/resources/__tests__/resource-monitor-popover.test.tsxclients/gui-app/src/components/resources/resource-monitor-popover.tsxclients/gui-app/src/hooks/managed-command/__tests__/use-managed-command-stop-all.test.tsxclients/gui-app/src/hooks/managed-command/use-managed-command-lifecycle-mutations.tsclients/gui-app/src/lib/host-rpc-policy/host-method-policy-table.tsclients/gui-app/src/lib/managed-commands/managed-command-copy.tsclients/gui-app/src/lib/managed-commands/use-open-managed-command-output.tsclients/gui-app/src/stores/chats/__tests__/chat-queue-reconciler.test.tsclients/gui-app/src/stores/chats/__tests__/chat-session-store.test.tsclients/gui-app/src/stores/chats/__tests__/optimistic-queue.test.tsclients/gui-app/src/stores/chats/__tests__/profile-durability-d1-queue-restamp.test.tsclients/gui-app/src/stores/chats/chat-session-store.tsclients/gui-app/src/stores/epics/canvas/__tests__/managed-command-output-tile-schema.test.tsclients/gui-app/src/stores/epics/canvas/tile-kinds.tsclients/gui-app/src/stores/epics/canvas/tile-schema/managed-command-output-tile.tsclients/gui-app/src/stores/epics/canvas/types.tsclients/gui-app/src/stores/managed-commands/__tests__/managed-command-attention.test.tsclients/gui-app/src/stores/managed-commands/__tests__/managed-command-output-store.test.tsclients/gui-app/src/stores/managed-commands/managed-command-attention-store.tsclients/gui-app/src/stores/managed-commands/managed-commands-for-chat.tsclients/gui-app/src/stores/resources/resources-store.tsprotocol/scripts/compat/compat-exceptions.jsonprotocol/src/host/agent/gui/__tests__/chat-subscribe.test.tsprotocol/src/host/agent/gui/subscribe.tsprotocol/src/host/managed-command/__tests__/managed-command-chat-surfaces.test.tsprotocol/src/host/managed-command/__tests__/managed-command-contracts.test.tsprotocol/src/host/managed-command/unary-schemas.tsprotocol/src/host/resources/__tests__/resources-subscribe.test.tsprotocol/src/host/resources/subscribe.tsprotocol/src/persistence/epic/__tests__/__fixtures__/epic-schema-surface.tsprotocol/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
Signed-off-by: Amiteshwar Randhawa <amiteshwar04@gmail.com>
There was a problem hiding this comment.
💡 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".
…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>
There was a problem hiding this comment.
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
📒 Files selected for processing (5)
clients/gui-app/src/components/epic-canvas/sidebar/epic-sidebar-chat-tree.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-notify-icon.test.tsxclients/gui-app/src/components/managed-commands/managed-command-notify-icon.tsxclients/gui-app/src/hooks/epic/use-epic-activity-status.tsclients/gui-app/src/lib/host-rpc-policy/host-method-policy-table.ts
There was a problem hiding this comment.
💡 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>
There was a problem hiding this comment.
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
📒 Files selected for processing (44)
clients/gui-app/src/__tests__/acceptance/managed-command-s4-output-window.test.tsxclients/gui-app/src/__tests__/acceptance/managed-command-s6-s7-chat-doors.test.tsxclients/gui-app/src/__tests__/acceptance/managed-command-s8-s9-tile-ref-resources.test.tsxclients/gui-app/src/components/chat/__tests__/chat-progress-icon.test.tsxclients/gui-app/src/components/chat/__tests__/managed-command-chat-surfaces.test.tsxclients/gui-app/src/components/chat/__tests__/queued-message-reorder-dnd.test.tsclients/gui-app/src/components/chat/__tests__/queued-message-surface.test.tsxclients/gui-app/src/components/chat/__tests__/queued-message-utils.test.tsclients/gui-app/src/components/chat/chat-background-items-panel.tsxclients/gui-app/src/components/chat/queued-message-surface.tsxclients/gui-app/src/components/epic-canvas/renderers/__tests__/chat-lower-background-spacing.test.tsxclients/gui-app/src/components/epic-canvas/renderers/__tests__/chat-tile-session-state.test.tsclients/gui-app/src/components/epic-canvas/renderers/__tests__/managed-command-output-tile.test.tsxclients/gui-app/src/components/epic-canvas/renderers/managed-command-output-tile.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-lifecycle-actions.test.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-menu-drag-out.test.tsxclients/gui-app/src/components/managed-commands/__tests__/managed-command-monitor-icon.test.tsxclients/gui-app/src/components/managed-commands/managed-command-chat-menu.tsxclients/gui-app/src/components/managed-commands/managed-command-monitor-icon.tsxclients/gui-app/src/components/resources/__tests__/resource-monitor-popover.test.tsxclients/gui-app/src/components/resources/resource-monitor-popover.tsxclients/gui-app/src/hooks/epic/__tests__/use-epic-activity-status.test.tsxclients/gui-app/src/hooks/managed-command/__tests__/use-managed-command-stop-all.test.tsxclients/gui-app/src/lib/managed-commands/managed-command-copy.tsclients/gui-app/src/stores/chats/__tests__/chat-queue-reconciler.test.tsclients/gui-app/src/stores/chats/__tests__/chat-session-store.test.tsclients/gui-app/src/stores/chats/__tests__/optimistic-queue.test.tsclients/gui-app/src/stores/chats/__tests__/profile-durability-d1-queue-restamp.test.tsclients/gui-app/src/stores/epics/canvas/__tests__/managed-command-output-tile-schema.test.tsclients/gui-app/src/stores/epics/canvas/tile-schema/managed-command-output-tile.tsclients/gui-app/src/stores/managed-commands/__tests__/managed-command-attention.test.tsclients/gui-app/src/stores/managed-commands/__tests__/managed-command-output-store.test.tsclients/gui-app/src/stores/resources/resources-store.tsclients/shared/host-transport/__tests__/chat-stream-client.test.tsclients/shared/host-transport/__tests__/resources-stream-client.test.tsprotocol/src/host/agent/gui/__tests__/chat-subscribe.test.tsprotocol/src/host/agent/gui/subscribe.tsprotocol/src/host/managed-command/__tests__/managed-command-chat-surfaces.test.tsprotocol/src/host/managed-command/__tests__/managed-command-contracts.test.tsprotocol/src/host/managed-command/unary-schemas.tsprotocol/src/host/resources/__tests__/resources-subscribe.test.tsprotocol/src/host/resources/subscribe.tsprotocol/src/persistence/epic/__tests__/__fixtures__/epic-schema-surface.tsprotocol/src/persistence/epic/content-blocks.ts
…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>
…cer/quiet-octopus
There was a problem hiding this comment.
💡 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".
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>
There was a problem hiding this comment.
💡 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>
There was a problem hiding this comment.
💡 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>
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 (defaultedfalse— old chats still parse), and theresources.subscribe@1.4owner rows.chat.subscribe@1.6edited in place — the surface is unshipped beyond staging, and fleets deploy matched versions.Shell · <description>rows). The Radar/CirclePlay glyphs now key off the live-mutablenotifyingflag 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."monitor"resume triggers (nomanagedCommandblock) 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