{"id":"schedule-runs","repo":"panrafal/paseo-plugins","url":"https://github.com/panrafal/paseo-plugins/tree/main/schedule-runs","name":"schedule-runs","description":"Sidebar feed of every schedule run with status, workspace, agent, archived state, and the agent's final response.","categories":["monitoring","productivity"],"platforms":[],"caveats":["Read-only feed of existing schedule runs; it does not create, pause, or delete schedules"],"images":["https://raw.githubusercontent.com/panrafal/paseo-plugins/004c6a80c6aa8e76bb563694c3eee5c2c0b0466f/schedule-runs/images/schedule-runs.png"],"themes":[],"health":{"manifestValid":true,"hasReadme":true,"hasLicense":true,"hasTests":false,"hasTypecheckScript":true,"updatedRecently":true},"scannedAt":"2026-10-15T12:34:26.037Z","addedAt":"2026-09-10T11:29:03+03:00","path":"schedule-runs","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 feed of every schedule run with status, workspace, agent, archived state, and the agent's final response."}],"caveatNodes":[[{"type":"text","text":"Read-only feed of existing schedule runs; it does not create, pause, or delete schedules"}]],"manifest":{"id":"schedule-runs","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:schedule-runs\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/schedule-runs\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 schedule-runs\npaseo plugin logs schedule-runs\n</code></pre>","limitationsNotesHtml":"<ul>\n<li>A pull request opened by the agent after Paseo archived the workspace is only found if the\nresponse links to it.</li>\n<li>The Markdown renderer covers common agent output; tables and raw HTML are shown as monospace\ntext rather than laid out.</li>\n<li>The feed is polled, not streamed. A run that just started shows up within 15 seconds.</li>\n<li>Runs whose schedule file is unreadable are skipped with a warning in the plugin logs.</li>\n<li>The plugin never changes schedules; use Paseo's Schedules screen to pause, edit, or run one.</li>\n</ul>","readmeText":"# schedule-runs\n\nPaseo plugin that adds a **Schedule runs** entry to the app sidebar, next to \"New workspace\",\n\"History\" and \"Schedules\". It is one feed of every run that every schedule on the selected host\nhas ever produced: which schedule ran, when, whether it succeeded, which workspace and agent it\ncreated, whether those have since been archived, and the agent's final response.\n\nPaseo's own Schedules screen shows the schedules; this surface shows what came out of them.\n\n![Schedule runs](./images/schedule-runs.png)\n\n## What is listed\n\nEvery run record of every schedule under the daemon's `$PASEO_HOME/schedules` directory, newest\nfirst. Paseo never prunes run records, so the feed is the full history. The server returns the\nnewest 500 runs; the header says \"oldest not shown\" when the daemon holds more.\n\nThe feed is grouped by date, newest group first. The past week gets one group per day (\"Today\",\n\"Yesterday\", then `Fri, Sep 4`), the month before that one group per week starting on Monday\n(`Aug 3 – Aug 9`), the year before that one group per calendar month (`June`, with the year added\nonce it is not the current one), and anything older one group per year. Each heading carries the\nnumber of runs under it, counted after filtering. A run with no usable timestamp lands under\n\"Undated\".\n\nSchedules that prompt an existing agent (Paseo calls them heartbeats) are hidden by default and\nappear when **Show heartbeats** is on. Their runs carry no workspace of their own; the targeted\nagent's workspace is shown instead.\n\n## Row anatomy\n\nEach run is one card:\n\n1. **Main line** — the status glyph (a spinner while running, a check or cross afterwards), the\n   schedule name, and how long ago the run started. Pressing the line expands the card.\n2. **Meta line** — status, elapsed time (still counting while running), the workspace name and\n   branch (a link that opens the workspace), the pull request as `#123` when one is known (a\n   link that opens it in the browser, colored by its state), the agent title, and a small amber archive\n   icon after the workspace or the agent that has been archived (its accessible label reads\n   \"Workspace archived\" or \"Agent archived\"). \"agent gone\" or \"workspace gone\" means the\n   daemon no longer lists it at all.\n3. **Preview** — the first three lines of the final response, or of the error in red.\n\nExpanding a card shows the full response rendered as Markdown (headings, lists, code, quotes,\nemphasis, and links that open in the browser), the error if any, absolute timestamps, the\nduration, and the run, schedule, agent, and workspace ids.\n\nThe header above the list sums the whole feed: how many runs, how many succeeded, how many\nfailed, and how many are running. With filters on, it also says how many are showing.\n\n## Filters\n\n- **Search** — every word must appear, case-insensitively, in the response, the error, the\n  schedule name, the workspace name or branch, or the agent title.\n- **Schedule** — a dropdown listing every schedule with its run count; pick any number. \"All\"\n  clears the selection. Dropdowns open as a popover under their trigger on desktop and as a\n  sheet on phones.\n- **Status** — a dropdown of running, succeeded, failed with counts; pick any number.\n- **Archived** — a dropdown: all runs, hide runs whose agent or workspace was archived, or only\n  those.\n- **Heartbeats** — a toggle that includes schedules that prompt an existing agent.\n\nSchedule, status, archived and heartbeat choices are kept while you navigate around the app and\nreset when the app restarts. The search text is not kept.\n\n## Actions\n\nThe workspace name and the pull request on the meta line are links. The rest sit at the bottom\nof an expanded card:\n\n- **Open #123** — opens the pull request in the browser, when one is known.\n- **Open agent** and **Open workspace** — navigate to the target. They work for archived targets\n  too: Paseo lands on its recovery screen and offers to unarchive. They disappear only when the\n  daemon no longer lists the target at all.\n- **Load from transcript** — offered when the run recorded no response (a run still going, or an\n  older or failed run). It reads the agent's last message straight from its transcript. For an\n  archived agent the daemon reopens the session in history mode to answer, which costs a provider\n  session, so this is never done for the list, only on request. The result is kept for the rest\n  of the app session.\n\n## How it works\n\n- The plugin SDK exposes no schedules API, so the server entry reads the daemon's own records:\n  one JSON file per schedule under `$PASEO_HOME/schedules` (each run record carries the\n  agent's final message as `output`), and the workspace registry at\n  `$PASEO_HOME/projects/workspaces.json`, which is the only place archived workspaces are still\n  listed with their name, branch and `archivedAt`. `PASEO_HOME` is resolved the way the daemon\n  resolves it, including a leading `~`.\n- Agents, archived ones included, come from the SDK's agent directory and are joined to runs by\n  agent id, falling back to the `paseo.schedule-run` label the daemon stamps on every agent a\n  schedule creates.\n- The pull request comes from the SDK's workspace directory while the workspace is open (with\n  its live state), from the registry's auto-archive record once it was archived on merge, and\n  failing both, from the first pull request URL the agent linked in its response (state unknown).\n- Files are re-parsed only when their size or modification time changes; the agent and workspace\n  directories are re-listed at most every 10 seconds. The client polls every 15 seconds and filters locally.\n- Each run's response is cut at 50,000 characters; the expanded view says so when that happened.\n- Everything is scoped to the host you are viewing; switching hosts reloads the feed.\n\n## Limitations\n\n- A pull request opened by the agent after Paseo archived the workspace is only found if the\n  response links to it.\n- The Markdown renderer covers common agent output; tables and raw HTML are shown as monospace\n  text rather than laid out.\n- The feed is polled, not streamed. A run that just started shows up within 15 seconds.\n- Runs whose schedule file is unreadable are skipped with a warning in the plugin logs.\n- The plugin never changes schedules; use Paseo's Schedules screen to pause, edit, or run one.\n\n## Install\n\n```bash\npaseo plugin add panrafal/paseo-plugins:schedule-runs\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/schedule-runs\npaseo plugin ls        # expect \"running\"\n```\n\nAfter editing:\n\n```bash\nnpm run typecheck\npaseo plugin reload schedule-runs\npaseo plugin logs schedule-runs\n```\n"}