{"id":"chat-resume","repo":"panrafal/paseo-plugins","url":"https://github.com/panrafal/paseo-plugins/tree/main/chat-resume","name":"chat-resume","description":"Composer pills that continue a quota-exhausted agent now, resume after allowance renewal, or prepare a handover to another provider.","categories":["productivity"],"platforms":[],"caveats":["Pills appear only when the latest agent error is a usage-limit / quota exhaustion"],"images":[],"themes":[],"health":{"manifestValid":true,"hasReadme":true,"hasLicense":true,"hasTests":true,"hasTypecheckScript":true,"updatedRecently":true},"scannedAt":"2026-10-15T12:29:30.474Z","addedAt":"2026-09-10T11:29:03+03:00","path":"chat-resume","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":"Composer pills that continue a quota-exhausted agent now, resume after allowance renewal, or prepare a handover to another provider."}],"caveatNodes":[[{"type":"text","text":"Pills appear only when the latest agent error is a usage-limit / quota exhaustion"}]],"manifest":{"id":"chat-resume","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:chat-resume\n</code></pre>\n<p>From a checkout:</p>\n<pre><code class=\"language-bash\">npm install\nnpm run typecheck --workspace=chat-resume\npaseo plugin install /absolute/path/to/paseo-plugins/chat-resume\n</code></pre>\n<p>After source changes:</p>\n<pre><code class=\"language-bash\">paseo plugin reload chat-resume\n</code></pre>","limitationsNotesHtml":"<ul>\n<li>Pills appear when the latest idle or error state is a usage-limit / quota-exhaustion\nmessage, not for context-window overflows or other failures.</li>\n<li>ACP providers that keep no on-disk transcript are read through <code>lastError</code>, the live turn-end\nevent, and the daemon's timeline tail, which also carries a silent turn across a daemon restart.</li>\n<li>A turn that ends silently for another reason also gets the pills.</li>\n<li>A turn whose last tool call is cancelled reads as a deliberate interruption and gets no\n<strong>Continue</strong>, so a turn cut short by a provider process exit mid-tool is missed.</li>\n<li>A turn that legitimately ends on a tool call without a closing message reads as unfinished.</li>\n<li>The handover prompt is edited in a plugin modal, not the native composer, and the app stays\non the source agent after <strong>Send</strong>.</li>\n</ul>","readmeText":"# chat-resume\n\nAdds composer pills to agents that stopped without finishing: a provider usage-limit / quota\nexhaustion — including Claude's \"You've hit your monthly spend limit\" assistant message,\nwhich leaves the agent idle instead of in `error`.\n\nPills are offered when that state is the latest provider error **or** the last assistant\nline in the transcript, both live and when you reopen the thread later. Codex's quota error is\nread from the turn's `task_complete` record, which carries the renewal time.\n\nSome providers stop on quota without any message. An idle agent whose latest turn produced\nno output at all after the user message — no text, tool call, or reasoning, and not\ninterrupted — is treated as quota-exhausted with no known renewal time, so it gets\n**Continue** and **Handover**.\n\n- **Continue** sends a follow-up on the same agent. Shown when the parsed renewal time has\n  already passed, or when the message has no parseable renewal time.\n- **Resume when renewed** creates one heartbeat with `maxRuns: 1`. Shown while the renewal\n  time is still in the future. It runs two minutes after renewal and continues the same\n  agent. Once that time arrives, the pill becomes **Continue**.\n- **Handover** opens a modal with an editable continuation prompt (commands for recovering the\n  source chat through the `paseo` CLI) and a choice of the other ready providers and their\n  models, preferring Claude, Codex, Cursor, OpenCode, Copilot, and Gemini. The mode is matched by\n  permission level (Codex Auto-review → Claude Auto mode, Full Access ↔ Bypass, plan stays plan),\n  falling back to the target provider's default; the effort is matched by level. **Send** starts\n  a new agent with that prompt **in the same workspace**. It carries the source agent's labels plus\n  `chat-resume.source-agent` set to the source agent ID.\n\n## Turns that stopped mid-work\n\nAn agent can also go idle without finishing its turn and without saying why — the daemon\nrestarted, the provider process exited, the machine went down. The plugin reads the tail of the\nagent's timeline (through the daemon, so it covers every provider, including ACP ones with no\non-disk transcript) and treats a turn as unfinished when tool calls ran after the last thing the\nagent said, or when the page shows only work. Trailing thoughts, todo lists, and compactions do\nnot count as work, since they routinely follow a finished turn.\n\nSuch an agent gets a single **Continue** pill (`StepForward`) that asks it to review the\nconversation and the workspace state and pick the work back up. There is no **Handover** and no\nrenewal schedule: nothing about the provider's allowance is known to be wrong. A quota stop\nalways wins over this check, and an agent with a pending permission request is left alone —\nit is waiting for an answer, not stopped.\n\n`paseo.agents.create({ cwd })` always opens a new workspace; handover therefore uses\n`workspaces.ref(id).agents.create` so the new agent stays in the thread you are looking at.\nNo agent is created until **Send** is pressed.\n\nProvider renewal windows are not currently exposed through the public plugin API. The\nplugin reads the latest refreshed agent error and the last transcript assistant message\nfor the exhaustion state and reset time, including times such as `resets 12am (Europe/Warsaw)`.\n\n## Limitations\n\n- Pills appear when the latest idle or error state is a usage-limit / quota-exhaustion\n  message, not for context-window overflows or other failures.\n- ACP providers that keep no on-disk transcript are read through `lastError`, the live turn-end\n  event, and the daemon's timeline tail, which also carries a silent turn across a daemon restart.\n- A turn that ends silently for another reason also gets the pills.\n- A turn whose last tool call is cancelled reads as a deliberate interruption and gets no\n  **Continue**, so a turn cut short by a provider process exit mid-tool is missed.\n- A turn that legitimately ends on a tool call without a closing message reads as unfinished.\n- The handover prompt is edited in a plugin modal, not the native composer, and the app stays\n  on the source agent after **Send**.\n\n## Install\n\n```bash\npaseo plugin add panrafal/paseo-plugins:chat-resume\n```\n\nFrom a checkout:\n\n```bash\nnpm install\nnpm run typecheck --workspace=chat-resume\npaseo plugin install /absolute/path/to/paseo-plugins/chat-resume\n```\n\nAfter source changes:\n\n```bash\npaseo plugin reload chat-resume\n```\n"}