{"id":"parent-wake","repo":"EPISTEX0/paseo-parent-wake","url":"https://github.com/EPISTEX0/paseo-parent-wake","name":"parent-wake","description":"Wake an orchestrating parent agent on every question and every finished turn of its child agents, not only the first one.","categories":["orchestration"],"platforms":[],"caveats":["Does nothing until an agent carries the parent-wake label; pass notifyOnFinish: false on spawns to avoid a duplicate first wake.","Held messages live in memory; a daemon or plugin restart drops them."],"images":[],"health":{"manifestValid":true,"hasReadme":true,"hasLicense":true,"hasTests":true,"hasTypecheckScript":true,"updatedRecently":true},"scannedAt":"2026-09-18T07:57:42.455Z","addedAt":"2026-09-18T07:49:51Z","version":"0.1.1","security":{"status":"passed","blockingFindings":0,"advisoryFindings":0,"scannedAt":"2026-09-18T07:55:34.572Z","commit":"77c567621419af786dfd99bc6a068a6b9a42ea03"},"author":"EPISTEX0","license":"MIT","paseoVersionRequirement":">=0.8.0","manifest":{"id":"parent-wake","requirements":{"paseo":">=0.8.0"}},"repoMeta":{"stars":0,"defaultBranch":"main","pushedAt":"2026-09-17T14:27:36Z"},"owner":{"login":"EPISTEX0","avatarUrl":"https://avatars.githubusercontent.com/u/171461678?v=4"},"installNotesHtml":"<pre><code class=\"language-bash\">paseo plugin add EPISTEX0/paseo-parent-wake\n</code></pre>\n<p>Plugins must be enabled on the daemon (<strong>Settings → Plugins → Enable plugins</strong>). Requires Paseo 0.8 or later. Server-only: no UI, no network, no filesystem access.</p>\n<p>From a local checkout:</p>\n<pre><code class=\"language-bash\">git clone https://github.com/EPISTEX0/paseo-parent-wake\ncd paseo-parent-wake &#x26;&#x26; npm install &#x26;&#x26; npm run typecheck &#x26;&#x26; npm test\npaseo plugin install \"$PWD\"\n</code></pre>","limitationsNotesHtml":"<ul>\n<li>Events raised while the daemon or the plugin is restarting are not replayed.</li>\n<li>Held messages live in memory; a plugin restart drops them.</li>\n<li>The message format mirrors Paseo 0.8's wording. If Paseo changes it, the parent still gets the ids it needs, only the prose differs.</li>\n<li>If Paseo ever adds a persistent notify option, prefer it and remove this plugin.</li>\n</ul>","readmeText":"# parent-wake\n\nWakes an orchestrating parent agent in [Paseo](https://paseo.sh) on **every** question and **every** finished turn of its child agents, not only the first one.\n\n## Why\n\nWhen an agent spawns another with `create_agent` or `send_agent_prompt`, Paseo's `notifyOnFinish` subscribes the parent once per prompt: the parent hears about the child's permission requests only until the child's first finished (or errored) turn, then the subscription ends. A child that ends a turn early (for example, after delegating to its own subagent) and later asks a question wakes nobody. The parent only finds out when someone else prompts it and it happens to call `list_pending_permissions`.\n\nThis plugin listens to the daemon's lifecycle hooks and keeps waking the parent for as long as the child carries the `paseo.parent-agent-id` label and the parent is not archived.\n\n## Install\n\n```bash\npaseo plugin add EPISTEX0/paseo-parent-wake\n```\n\nPlugins must be enabled on the daemon (**Settings → Plugins → Enable plugins**). Requires Paseo 0.8 or later. Server-only: no UI, no network, no filesystem access.\n\nFrom a local checkout:\n\n```bash\ngit clone https://github.com/EPISTEX0/paseo-parent-wake\ncd paseo-parent-wake && npm install && npm run typecheck && npm test\npaseo plugin install \"$PWD\"\n```\n\n## Setup\n\nThe plugin does nothing until an agent opts in with the label `parent-wake` (any value except `off`, `false`, `0`), on either side:\n\n- **On the parent**, to cover every child it spawns:\n  `update_agent(agentId: <own id>, labels: {\"parent-wake\": \"always\"})`. An agent's own id is in `PASEO_AGENT_ID`.\n- **On a child**, at spawn time:\n  `create_agent(..., labels: {\"parent-wake\": \"always\"}, notifyOnFinish: false)`.\n\nPass `notifyOnFinish: false` on `create_agent` and `send_agent_prompt` once the plugin is active, otherwise the first notification arrives twice (once from Paseo, once from the plugin). Parents without the label keep Paseo's built-in behavior unchanged.\n\n## How it works\n\n- Hooks `agent.permission_requested` and `agent.turn_ended` (`completed` and `failed`; `canceled` is skipped).\n- Sends the parent a `<paseo-system>` message shaped like Paseo's own notification, with a readable first line:\n\n  ```\n  <paseo-system>\n  Lead · run-live-character asks: \"ping?\" — yes / no\n\n  Answer with `respond_to_permission` · agentId: <id> · requestId: <id>\n\n  <permission-request>\n  { ...the request exactly as Paseo reported it... }\n  </permission-request>\n  </paseo-system>\n  ```\n\n  Finished turns read `<title> finished. · agentId: <id>` followed by `<agent-response>` with the last assistant message (capped at 4000 characters); failed turns read `errored: <message>`. Delivered with `activeTurnBehavior: \"steer\"` so a running parent is not interrupted.\n- If the parent itself has a permission pending (for example its own `AskUserQuestion`), the message is held and delivered when that permission is resolved or the parent's turn ends. Sending immediately would clear the parent's pending question.\n- Each permission request id is delivered once.\n\n## Limitations\n\n- Events raised while the daemon or the plugin is restarting are not replayed.\n- Held messages live in memory; a plugin restart drops them.\n- The message format mirrors Paseo 0.8's wording. If Paseo changes it, the parent still gets the ids it needs, only the prose differs.\n- If Paseo ever adds a persistent notify option, prefer it and remove this plugin.\n"}