opencode-session-restart/README.md
emidab 007f4fed6d feat: add session_restart tool plugin
Registers a session_restart tool that spawns a fresh child session on
the current project, prompts it with a focused task (+ optional notes)
via promptAsync, and aborts the current session by default so a single
focused task continues in a clean context window instead of compacting.
Includes an experimental.compaction.autocontinue hook to reject the
synthetic continue turn after compaction (default on).
2026-09-15 21:32:43 +00:00

59 lines
No EOL
2.9 KiB
Markdown

# opencode-session-restart
opencode plugin that lets the agent restart a session into a fresh child session with a clean context window and a focused prompt, dodging context compaction loss.
When a session runs long enough to trigger compaction, opencode summarizes the conversation into a prompt and keeps going — fidelity you did not choose. This plugin gives the agent a first-class escape hatch: start a new child session on the same project, prompt it with a curated fresh prompt, and (by default) freeze the old session. The single focused task continues in a fresh window.
## Install
Add the plugin to your opencode config:
```json
{
"plugin": ["opencode-session-restart"]
}
```
or from a local clone:
```json
{
"plugin": [["/path/to/opencode-session-restart", { "abort_current": true }]]
}
```
## What it does
The plugin registers one tool, `session_restart`, that the agent can call when the session is getting long:
- Creates a child session (via the SDK `session.create` with `parentID`), so it shows up in the session tree under the original.
- Immediately prompts it (via `session.promptAsync`) with the focused `task` plus optional carry-over `notes` and a fresh-start preamble that tells the new session not to reconstruct the old conversation and to orient itself from the working tree.
- Aborts the current session by default, so only the restarted session stays active.
- Returns the new session ID so the agent can tell you where to switch.
### Tool arguments
| argument | type | default | description |
| --------------- | ------- | ------- | ----------- |
| `task` | string | — | The single focused task for the restarted session, written as a fresh prompt. |
| `notes` | string | — | Durable context to carry over: decisions, constraints, files touched, unfinished steps. Omit to rely on the working tree only. |
| `model` | string | current | `"providerID/modelID"` for the restarted session. |
| `agent` | string | current | Agent for the restarted session. |
| `abort_current` | boolean | `true` | Abort this session after restarting. |
### Notes on behavior
- The new session keeps the fresh prompt as its user-turn text and immediately starts working. On-disk state (git status, staged or uncommitted changes) carries over because it is the same project directory.
- `abort_current` freezes the original session after the new one is started. Because abort cancels the current agent turn, the tool's returned text may not be delivered to the old session — the side effects (create + prompt) complete first.
- `disable_compaction_continue` (default `true`) rejects the synthetic "continue" turn opencode would append after a compaction, so a compaction that does slip through never silently continues. Set it to `false` to keep stock behavior.
## Development
```bash
bun install
bunx tsc --noEmit
```
## License
MIT