Files
paseo/plugin-examples/lifecycle-actions
Mohamed BoudraandJacek Tomaszewski af6ca46ae3 fix(plugin)!: drop the always-empty timeline from agent.turn.after (#9573)
agent.turn.after no longer declares timeline; plugins read the turn with
timeline.refetch({ direction: "tail", limit: 1, wholeTurns: true }) filtered by event.turnId.
Plugins built against the old SDK keep receiving timeline: [] behind COMPAT(pluginTurnTimeline).

Closes #9315

Co-authored-by: Jacek Tomaszewski <jacek@fullstack.house>
2026-11-13 15:22:53 +07:00
..

Lifecycle actions

Small callbacks using the existing SDK:

  • Send Try again. when the latest output contains out of credits, except to background agents.
  • Decline a shell request matching rm -rf; approve exactly git status; leave other requests alone.
  • Inject PASEO_HOOK_CREATE_EXAMPLE=created on creation and PASEO_HOOK_OPEN_EXAMPLE=opened on each session opening.
  • Change requested Codex agents to Claude Haiku before creation.
  • Create a worktree when a directory creation request is titled Isolated lifecycle example.

This is a demonstration plugin: installing it enables all these behaviors on its host. Install it alongside lifecycle-logger on a test daemon with plugins enabled:

paseo plugin install /absolute/path/to/plugin-examples/lifecycle-actions
paseo plugin install /absolute/path/to/plugin-examples/lifecycle-logger
paseo plugin logs lifecycle-logger

Outside the Paseo repository, server/inspect.ts needs @getpaseo/protocol installed for its type imports. Add it to your plugin development dependencies at the same version as @getpaseo/plugin before installing this example.

Copy the callbacks you need into your own plugin. The follow-up example sends a new message; it does not replay attachments or undo previous tool effects. If the provider keeps returning the matching phrase, it keeps sending follow-ups. Add limits or delay in your plugin when your workflow needs them. The command regex illustrates a policy; it does not parse shell syntax or cover every deletion command.

server/inspect.ts joins provider text chunks and excludes earlier turns and the current user prompt from the phrase match. The failing-first regression test records the split text observed with a real Claude agent.

See agent configuration for a focused example that injects MCP servers and changes Codex sandbox and approval options while preserving other settings.

See the lifecycle reference for the API.