mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-11-05 23:37:25 +00:00
In RPC mode, `shutdownHandler` only set a `shutdownRequested` flag. That flag was checked in two places: after a stdin command was handled and on `agent_settled`. If an extension called `ctx.shutdown()` while the session was idle (for example from a timer), neither check ever ran. The process stayed alive until the client sent another command. Interactive mode already shuts down right away in this case. Changes in `packages/coding-agent/src/modes/rpc/rpc-mode.ts`: - **One check for all paths:** `checkShutdownRequested()` shuts down only when a request is pending, input is attached, no command is being handled, and the session is idle. Each of those ending calls it again: command completion, prompt settle, `agent_settled`, and input attach. - **Idle requests:** the shutdown handler schedules the check on the next tick, so the requesting handler finishes first. The conditions are checked when the tick runs, not when it is scheduled: a stdin command that arrives in between is handled first, and shutdown follows when it finishes. - **Requests during startup:** a request made before input is attached (for example a synchronous `ctx.shutdown()` in `session_start`) is checked once the input reader is attached. - **Requests during a command:** shutdown waits until the command finishes, including extension commands. A `prompt` command returns before `session.prompt()` settles, so it stays counted as in flight until the prompt settles, and the shutdown check runs then. This also fixes an existing ordering problem: an extension command that called `ctx.shutdown()` could exit the process before its `prompt` response was written. - **Repeated requests:** `checkShutdownRequested()` does nothing once shutdown has started, so a second `ctx.shutdown()` does not call `process.exit` in the middle of async cleanup. A second stdin EOF or signal still forces exit, as before. Shutdown requested during a running turn is still handled on `agent_settled`, as before. A request made while an extension-started compaction runs (not idle, no run to settle) still waits for the next command or run; `docs/rpc.md` and `docs/extensions.md` note this. Docs (`docs/rpc.md`, `docs/extensions.md`) and the CHANGELOG are updated. ## Testing - Added three tests to `test/rpc-prompt-response-semantics.test.ts`: - an async `ctx.shutdown()` on an idle session exits; - an extension command that calls `ctx.shutdown()` gets its `prompt` response written before exit; - a command that arrives after an idle request but before the scheduled check runs gets its response written before exit. All three fail without the change and pass with it. - `npm run check` passes. All `test/rpc*` tests pass. - In `./test.sh`, all coding-agent tests pass. The only failures were timeouts in durable/harness tests (`store-storage`, `tools-images`, connection close), which this change does not touch. - Reproduction from the issue: run `pi --mode rpc --no-session -ne -e ./shutdown-probe.mjs` with stdin held open and nothing sent. - Before the change, the process stayed alive until a timeout killed it (exit 124). - After the change, `session_shutdown` fires and the process exits with code 0. - A synchronous `ctx.shutdown()` in `session_start` also exits with code 0. Fixes #11599 Requested by @petrroll --------- Co-authored-by: triagent <triagent@localhost> Co-authored-by: Petr Houška <houskape@gmail.com> |
||
|---|---|---|
| .. | ||
| images | ||
| cli-integration.md | ||
| cli.md | ||
| codemode.md | ||
| compaction.md | ||
| configuration.md | ||
| containerization.md | ||
| custom-provider.md | ||
| docs.json | ||
| environment-variables.md | ||
| extensions.md | ||
| how-pi-works.md | ||
| index.md | ||
| json.md | ||
| keybindings.md | ||
| llama-cpp.md | ||
| mcp.md | ||
| message-types.md | ||
| models-configuration.md | ||
| models.md | ||
| nvidia-rtx-llama-cpp.md | ||
| packages.md | ||
| prompt-templates.md | ||
| providers.md | ||
| quickstart.md | ||
| rpc-commands.md | ||
| rpc-extension-ui.md | ||
| rpc.md | ||
| sdk.md | ||
| security.md | ||
| session-format.md | ||
| sessions.md | ||
| settings.md | ||
| shell-aliases.md | ||
| skills.md | ||
| slash-commands.md | ||
| terminal-setup.md | ||
| termux.md | ||
| themes.md | ||
| tmux.md | ||
| tui.md | ||
| usage.md | ||
| virtual-models.md | ||
| windows.md | ||