{"id":"agents-dash-list","repo":"panrafal/paseo-plugins","url":"https://github.com/panrafal/paseo-plugins/tree/main/agents-dash-list","name":"agents-dash-list","description":"Sidebar dashboard of workspaces grouped by waiting, unread, in progress, failing, approved, idle, or closed, with archive and unread actions.","categories":["monitoring","productivity"],"platforms":[],"caveats":["Unread marks stay on the daemon that stored them and do not sync across hosts"],"images":["https://raw.githubusercontent.com/panrafal/paseo-plugins/004c6a80c6aa8e76bb563694c3eee5c2c0b0466f/agents-dash-list/images/agents-dash-list.png"],"themes":[],"health":{"manifestValid":true,"hasReadme":true,"hasLicense":true,"hasTests":false,"hasTypecheckScript":true,"updatedRecently":true},"scannedAt":"2026-10-15T12:29:06.622Z","addedAt":"2026-09-10T11:29:03+03:00","path":"agents-dash-list","version":"0.1.0","security":{"status":"failed","blockingFindings":1,"advisoryFindings":0,"scannedAt":"2026-10-15T12:14:24.405Z","commit":"004c6a80c6aa8e76bb563694c3eee5c2c0b0466f"},"author":"panrafal","license":"MIT","paseoVersionRequirement":">=0.7.2-0","descriptionNodes":[{"type":"text","text":"Sidebar dashboard of workspaces grouped by waiting, unread, in progress, failing, approved, idle, or closed, with archive and unread actions."}],"caveatNodes":[[{"type":"text","text":"Unread marks stay on the daemon that stored them and do not sync across hosts"}]],"manifest":{"id":"agents-dash-list","requirements":{"paseo":">=0.7.2-0"}},"repoMeta":{"stars":6,"defaultBranch":"main","pushedAt":"2026-10-15T04:33:35Z"},"owner":{"login":"panrafal","avatarUrl":"https://avatars.githubusercontent.com/u/1268900?v=4"},"installNotesHtml":"<pre><code class=\"language-bash\">paseo plugin add panrafal/paseo-plugins:agents-dash-list\n</code></pre>\n<p>From a checkout:</p>\n<pre><code class=\"language-bash\">npm install            # from the monorepo root\nnpm run typecheck\npaseo plugin install /absolute/path/to/paseo-plugins/agents-dash-list\npaseo plugin ls        # expect \"running\"\n</code></pre>\n<p>After editing:</p>\n<pre><code class=\"language-bash\">npm run typecheck\npaseo plugin reload agents-dash-list\npaseo plugin logs agents-dash-list\n</code></pre>","limitationsNotesHtml":"<ul>\n<li>The dash only shows a workspace's root agents as pills; subagents running inside their parent's\nworkspace contribute to that workspace's activity but do not get their own pill.</li>\n<li>Pull request state, checks, and review decision are only as fresh as what Paseo's daemon has\nalready synced from the forge; the plugin does not poll the forge itself.</li>\n<li>Unread marks and viewing settings live on the daemon the dash was opened on. Opening the dash\nfrom a different host shows that host's marks and settings instead.</li>\n<li>Workspaces on other hosts show the lettered color square rather than their project icon, and\ntheir workspace labels are colored from the opening host's catalog when the names match.</li>\n</ul>","readmeText":"# agents-dash-list\n\nPaseo plugin that adds an **Agents dash** entry to the app sidebar, next to \"New workspace\",\n\"History\" and \"Schedules\". It lists every workspace on **every host you have configured** and the\nagents inside it, on one screen, grouped by what needs your attention.\n\n![Agents dash](./images/agents-dash-list.png)\n\n## Groups\n\nWorkspaces are sorted into exactly one group, in this order, and within a group by last activity\n(newest first):\n\n| Group | Shown when |\n| --- | --- |\n| Waiting for you | An agent (or the workspace itself) is waiting for a question or permission to be answered. |\n| Unread | An agent finished with new results you have not seen yet, or you marked the workspace unread from the dash. |\n| In progress | An agent is currently working. |\n| Failing | An agent errored, the pull request has a failing check, or a reviewer requested changes. |\n| Approved | The pull request is approved by reviewers and nothing above applies. |\n| Idle | Everything is done and read. |\n| Merged or closed | The pull request was merged or closed. |\n\nOnly non-empty groups are shown. Each group is a bordered section with a bold heading; pressing\nthe heading folds the group shut or open. The Unread and Approved headings also carry an\n**Archive all** button (see below).\n\n## Hosts\n\nEvery host configured in Paseo is read at once and the workspaces are merged into a single feed,\nso a group like \"Waiting for you\" holds whatever is waiting anywhere. Each row names its host on\nthe meta line, opens on that host when pressed, and is archived through that host's own\nconnection.\n\nWhen more than one host is configured the header holds a **Host** picker listing them all with\nworkspace counts; disconnected hosts are listed as `name (offline)`. Pick any number of hosts to\nnarrow the feed. A host that is disconnected or fails to answer is reported in a notice above the\nfeed while the other hosts keep working; only when *none* of the selected hosts answers does the\nwhole screen turn into an error with a Retry.\n\nOn a Paseo older than 0.8 the app exposes no host list, and the dash shows the host it was opened\non exactly as before.\n\n## Project filter\n\nThe header holds a **Project** picker listing every project that has a workspace on a visible\nhost, with workspace counts. Pick any number of projects to show only their workspaces; the count\nin the header then reads `12 of 61 workspaces`, and \"All\" in the picker (or \"Clear filters\" on the\nempty screen) clears the choice.\n\n## Remembered settings\n\nThe host choice, the project choice and the folded groups are remembered between opens and across\napp restarts. They are stored per daemon by the plugin's server entry under\n`$PASEO_HOME/plugin-data/agents-dash-list/settings.json`, so every client of that daemon opens the\ndash the way it was left.\n\n## Row anatomy\n\nEach workspace is one row:\n\n1. **Main line** — the project icon, the workspace name, the time of last activity, and (for the\n   groups that have them) quick-action buttons.\n2. **Meta line** — project name, branch, host, and, when the workspace has a pull request: its\n   state, checks, and review decision. Workspace labels render last, as the same colored chips\n   the built-in sidebar workspace list uses.\n3. **Agents line** — a row of small pills, one per agent, each showing a shortened agent name and\n   an icon for that agent's own activity (waiting, unread, working, failing, idle). Pills are\n   sorted by activity, then by last activity.\n\nPressing the main line navigates to the workspace's first agent (or the workspace itself when it\nhas no agents); pressing an agent pill navigates straight to that agent. Pressing the pull request\nitem on the meta line opens it in the browser instead of navigating.\n\n## Quick actions\n\nQuick actions appear on the groups a glance can settle; the groups with live activity (Waiting,\nIn progress, Failing) are navigate-only:\n\n- **Unread** — Archive.\n- **Approved** — Archive.\n- **Idle** — Mark as unread, Archive.\n- **Merged or closed** — Archive.\n\nArchiving a workspace that has uncommitted changes or unpushed commits asks for confirmation\nfirst, listing what would be left behind.\n\nThe **Unread** and **Approved** headings also offer **Archive all**, which archives every\nworkspace currently in that group. It always asks first: the dialog says how many workspaces go\nand lists the ones that still hold uncommitted changes or unpushed commits. Workspaces are\narchived one after another and a toast reports the outcome, naming any that failed.\n\n## Unread marks\n\n\"Mark as unread\" is a marker owned by this plugin, not by Paseo itself — the built-in sidebar has\nno notion of it. The mark clears automatically the moment the workspace is opened from the dash,\nor the moment the workspace produces newer activity than the mark (a finished run, a new pull\nrequest check, and so on), whichever comes first. Marks are stored per daemon under\n`$PASEO_HOME/plugin-data/agents-dash-list/unread.json` and pruned after 90 days, or when their\nworkspace no longer exists and the dash was able to list *every* host's whole workspace directory\n(a directory too large to enumerate, or a host that did not answer, is never treated as a census,\nso no mark is dropped by mistake). The store is the one belonging to the host the dash was opened\non, and it holds marks for workspaces on the other hosts too.\n\n## How it works\n\n- The client keeps one live mirror per host: `useHosts()` lists the configured hosts and\n  `getPaseoClient(serverId)` borrows each one's API, and the mirror subscribes to that host's\n  workspace and agent directories (the same `list` + `subscribe` streams the rest of the app\n  uses). Mirrors are reconciled as hosts connect and disconnect, so one host dropping does not\n  re-seed the others. The grouped model is recomputed locally whenever any stream changes or an\n  unread mark is set or cleared; each host is indexed separately, since agents and their parents\n  never cross hosts.\n- The server side exposes small RPCs the client can't do itself because they need the daemon's\n  filesystem: reading the workspace-label color catalog, resolving project icons (custom upload\n  or automatic discovery), and reading/writing this plugin's own unread marks and viewing\n  settings — all under `$PASEO_HOME` on the daemon machine (resolved the way the daemon resolves\n  it, including a leading `~`).\n- Project icons in SVG or ICO form only render on web and desktop. React Native cannot decode\n  those containers on iOS or Android, and a plugin cannot bring its own SVG renderer, so on\n  phones and tablets those projects show the same lettered color square Paseo falls back to.\n- Plugin RPC has no cross-host form, so the server side only ever runs on the host the dash was\n  opened on. Project icons are therefore resolved for that host's projects alone — rows from other\n  hosts fall back to the lettered color square — while the label color catalog, unread marks and\n  viewing settings from that one host apply to the whole feed.\n\n## Limitations\n\n- The dash only shows a workspace's root agents as pills; subagents running inside their parent's\n  workspace contribute to that workspace's activity but do not get their own pill.\n- Pull request state, checks, and review decision are only as fresh as what Paseo's daemon has\n  already synced from the forge; the plugin does not poll the forge itself.\n- Unread marks and viewing settings live on the daemon the dash was opened on. Opening the dash\n  from a different host shows that host's marks and settings instead.\n- Workspaces on other hosts show the lettered color square rather than their project icon, and\n  their workspace labels are colored from the opening host's catalog when the names match.\n\n## Install\n\n```bash\npaseo plugin add panrafal/paseo-plugins:agents-dash-list\n```\n\nFrom a checkout:\n\n```bash\nnpm install            # from the monorepo root\nnpm run typecheck\npaseo plugin install /absolute/path/to/paseo-plugins/agents-dash-list\npaseo plugin ls        # expect \"running\"\n```\n\nAfter editing:\n\n```bash\nnpm run typecheck\npaseo plugin reload agents-dash-list\npaseo plugin logs agents-dash-list\n```\n"}