feat: simplify thread-bound session spawning

This commit is contained in:
Peter Steinberger
2026-05-02 04:52:17 +01:00
parent 5ac0ff1812
commit 8612af754b
53 changed files with 892 additions and 219 deletions

View File

@@ -109,7 +109,7 @@ Thread binding config is channel-adapter specific. Example for Discord:
discord: {
threadBindings: {
enabled: true,
spawnAcpSessions: true,
spawnSessions: true,
},
},
},
@@ -118,7 +118,7 @@ Thread binding config is channel-adapter specific. Example for Discord:
If thread-bound ACP spawn does not work, verify the adapter feature flag first:
- Discord: `channels.discord.threadBindings.spawnAcpSessions=true`
- Discord: `channels.discord.threadBindings.spawnSessions=true`
Current-conversation binds do not require child-thread creation. They require an active conversation context and a channel adapter that exposes ACP conversation bindings.

View File

@@ -279,7 +279,7 @@ Examples:
<Accordion title="Binding rules and exclusivity">
- `--bind here` and `--thread ...` are mutually exclusive.
- `--bind here` only works on channels that advertise current-conversation binding; OpenClaw returns a clear unsupported message otherwise. Bindings persist across gateway restarts.
- On Discord, `spawnAcpSessions` is only required when OpenClaw needs to create a child thread for `--thread auto|here` — not for `--bind here`.
- On Discord, `spawnSessions` gates child thread creation for `--thread auto|here` — not `--bind here`.
- If you spawn to a different ACP agent without `--cwd`, OpenClaw inherits the **target agent's** workspace by default. Missing inherited paths (`ENOENT`/`ENOTDIR`) fall back to the backend default; other access errors (e.g. `EACCES`) surface as spawn errors.
- Gateway management commands stay local in bound conversations — `/acp ...` commands are handled by OpenClaw even when normal follow-up text routes to the bound ACP session; `/status` and `/unfocus` also stay local whenever command handling is enabled for that surface.
@@ -297,9 +297,9 @@ Examples:
- `acp.enabled=true`
- `acp.dispatch.enabled` is on by default (set `false` to pause automatic ACP thread dispatch; explicit `sessions_spawn({ runtime: "acp" })` calls still work).
- Channel-adapter ACP thread-spawn flag enabled (adapter-specific):
- Discord: `channels.discord.threadBindings.spawnAcpSessions=true`
- Telegram: `channels.telegram.threadBindings.spawnAcpSessions=true`
- Channel-adapter thread session spawns enabled (default: `true`):
- Discord: `channels.discord.threadBindings.spawnSessions=true`
- Telegram: `channels.telegram.threadBindings.spawnSessions=true`
Thread binding support is adapter-specific. If the active channel
adapter does not support thread bindings, OpenClaw returns a clear
@@ -592,8 +592,8 @@ Two ways to start an ACP session:
- On non-thread binding surfaces, default behavior is effectively `off`.
- Thread-bound spawn requires channel policy support:
- Discord: `channels.discord.threadBindings.spawnAcpSessions=true`
- Telegram: `channels.telegram.threadBindings.spawnAcpSessions=true`
- Discord: `channels.discord.threadBindings.spawnSessions=true`
- Telegram: `channels.telegram.threadBindings.spawnSessions=true`
- Use `--bind here` when you want to pin the current conversation without creating a child thread.
</Tab>

View File

@@ -26,8 +26,10 @@ Primary goals:
default. For heavy or repetitive tasks, set a cheaper model for sub-agents
and keep your main agent on a higher-quality model. Configure via
`agents.defaults.subagents.model` or per-agent overrides. When a child
genuinely needs the requester's current transcript, the agent can request
`context: "fork"` on that one spawn.
genuinely needs the requester's current transcript, the agent can request
`context: "fork"` on that one spawn. Thread-bound subagent sessions default
to `context: "fork"` because they branch the current conversation into a
follow-up thread.
</Note>
## Slash command
@@ -179,7 +181,7 @@ session to confirm the effective tool list.
`require` rejects spawn unless the target child runtime is sandboxed.
</ParamField>
<ParamField path="context" type='"isolated" | "fork"' default="isolated">
`fork` branches the requester's current transcript into the child session. Native sub-agents only. Use `fork` only when the child needs the current transcript.
`fork` branches the requester's current transcript into the child session. Native sub-agents only. Thread-bound spawns default to `fork`; non-thread spawns default to `isolated`.
</ParamField>
<Warning>
@@ -203,7 +205,7 @@ persistent thread-bound subagent sessions (`sessions_spawn` with
`channels.discord.threadBindings.enabled`,
`channels.discord.threadBindings.idleHours`,
`channels.discord.threadBindings.maxAgeHours`, and
`channels.discord.threadBindings.spawnSubagentSessions`.
`channels.discord.threadBindings.spawnSessions`.
### Quick flow