diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json
index d562f76..bfe56ca 100644
--- a/.claude-plugin/plugin.json
+++ b/.claude-plugin/plugin.json
@@ -1,6 +1,6 @@
{
"name": "high-command",
- "version": "1.2.1",
+ "version": "1.2.2",
"description": "See the messages your teammates, named subagents, and other Claude Code sessions send you, grouped by peer with unread counts: a pane, a band above the prompt, and /highcommand.",
"author": { "name": "dot-agi" },
"license": "MIT",
diff --git a/README.md b/README.md
index 2fdb189..482e1b3 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
One inbox for agent-team teammates, named subagents, and other Claude Code sessions.
diff --git a/docs/usage.md b/docs/usage.md index e7838c8..e65ef5f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -61,9 +61,9 @@ A roster or a thread reads from the top down: 6. In a roster, the agent lanes. 7. The dim order note, `Order: observation time. Counts cover retained messages.` -The roster lists peers you received messages from or tried to message: peers with unread messages first, then the peer with the most recent message. In a pane of 90 columns or more, each row is one line of fixed columns under a dim header: the peer, the unread count, the time of the latest message, the sender level, the peer's last reported state with its time, and the latest message. Any `suspicious` and `(not delivered)` marks start the latest message. A narrower pane gives each row two lines (see **Narrow panes** in [Known limits](#known-limits)). `suspicious` and `unverified` show in your theme's warning color, and `(not delivered)` in its error color. The words stay, so a terminal without color loses nothing. On a row with nothing unread, the time, the state, and the message summary are dim. The arrow, the kind of message, and the marks are not. Press a peer, or its digit, to open its thread. The digits follow the roster order, so they move when a new message arrives. Rows past the ninth have no digit. A roster page shows up to 50 peers, with **Previous peers** and **More peers** on one row. When long names and messages would pass Claude Code's drawing limit, a page shows fewer, and a dim line says how many peers moved to the next page. +The roster lists peers you received messages from or tried to message: peers with unread messages first, then the peer with the most recent message. In a pane of 90 columns or more, each row is one line of fixed columns under a dim header: the peer, the unread count, the time of the latest message, the sender level, the peer's last reported state with its time, and the latest message. Any `suspicious` and `(not delivered)` marks start the latest message. A narrower pane gives each row two lines (see **Narrow panes** in [Known limits](#known-limits)). `suspicious` shows in your theme's warning color, and `(not delivered)` in its error color. Sender labels, `unverified sender` too, are plain text: in tmux, each teammate runs in its own pane, so every message can be `unverified sender`, and a color there would hide a real `suspicious` mark. The words stay, so a terminal without color loses nothing. On a row with nothing unread, the time, the state, and the message summary are dim. The arrow, the kind of message, and the marks are not. Press a peer, or its digit, to open its thread. The digits follow the roster order, so they move when a new message arrives. Rows past the ninth have no digit. A roster page shows up to 50 peers, with **Previous peers** and **More peers** on one row. When long names and messages would pass Claude Code's drawing limit, a page shows fewer, and a dim line says how many peers moved to the next page. -A thread starts with **Back**, the peer's last reported state with its source, and a facts line: the sender label, the count of kept messages, the count of new messages, and the page. **Show identity** and **Mark read** follow the facts, or move to a line of their own when the line does not fit. A thread shows up to 20 messages per page with that peer, newest first. When long messages would pass the drawing limit, a thread page shows fewer, and a dim line says how many moved to the next page. Each message starts with `new` while it is new, its time, `←` for a message to you or `→` for a send attempt, and its kind: `message`, `finished`, `failed`, or `send attempted`. The sender label and any `suspicious` mark follow. A dim day line comes before the first message of an earlier day. The summary shows only when the sender wrote one that differs from the first line of the message. A long message shows its first 2,000 characters and says how many more are in the transcript. **Newer** and **Older** page through the kept messages, on one row with the page number and the count of messages on other pages. +A thread starts with **Back**, the peer's last reported state with its source, and a facts line: the word Sender with the sender level, such as `Sender unverified`, the count of kept messages, the count of new messages, and the page. **Show identity** and **Mark read** follow the facts, or move to a line of their own when the line does not fit. A thread shows up to 20 messages per page with that peer, newest first. When long messages would pass the drawing limit, a thread page shows fewer, and a dim line says how many moved to the next page. Each message starts with `new` while it is new, its time, `←` for a message to you or `→` for a send attempt, and its kind: `message`, `finished`, `failed`, or `send attempted`. The sender label and any `suspicious` mark follow. A dim day line comes before the first message of an earlier day. The summary shows only when the sender wrote one that differs from the first line of the message. A long message shows its first 2,000 characters and says how many more are in the transcript. **Newer** and **Older** page through the kept messages, on one row with the page number and the count of messages on other pages. A send shows `send attempted` with the recipient and text that High Command observed. Its reported send result shows on a line of its own, in the error color when the send was not delivered. A dim note above the first send of a page says that sends show observed text and that a reported result is not a receipt. **Show send details** shows the refusal reason, up to 2,000 characters. When available, it also shows the core lines: the recipient, text, and queue outcome that Claude Code itself received for the latest call. A dim note above the core lines says that this evidence covers only the latest traced call. It does not prove that the recipient read the message. **Hide send details** closes them again. `/highcommand` labels sends as attempts. diff --git a/hooks/views.tsx b/hooks/views.tsx index 4bdf1f6..a5b7872 100644 --- a/hooks/views.tsx +++ b/hooks/views.tsx @@ -1,6 +1,6 @@ import type { BoxProps, ButtonProps, ElementConstructor, RenderElement, TextProps } from 'claude-code' -import type { HighCommandAgent, HighCommandCapture, HighCommandEntry, HighCommandTrust } from '../types' +import type { HighCommandAgent, HighCommandCapture, HighCommandEntry } from '../types' import { isNewer, labelOf, unreadTotal, type RosterRow, type Thread } from './inbox' import { LIMITS } from './limits' import { @@ -255,11 +255,6 @@ function laneTitle(model: PaneModel): string { return `Agent observations: ${agentName(model.agents?.find(agent => agent.id === model.laneId), model.laneId)}` } -/** Color `warning` for the weakest sender label, as for `suspicious`; the words stay, so color only adds a signal. */ -function trustColor(trust: HighCommandTrust | undefined): TextProps { - return trust === 'unverified' ? { color: 'warning' } : {} -} - /** * Row 1 of every view: Back where there is a level above, a dim prefix that truncates from its start, the current place * in bold, and the dim key hint when the row and the hint fit `columns`, the band's rule. While the place fits the row @@ -368,7 +363,9 @@ function twoLineRow(ui: HighCommandElements, args: RosterRowArgs, columns: numbe const trust = trustLabel(row.trust) const button = peerButton(ui, args) const marks = dotted([ - trust !== undefined && [styled(Text, trust, trustColor(row.trust))], + // Every sender label is plain text: in tmux each teammate's pane makes every message `unverified sender`, and a + // color there would hide a real `suspicious`. + trust !== undefined && [trust], row.isSuspicious && [