#acp commands not working in threads
12 messages · Page 1 of 1 (latest)
Yeah, I’m pretty sure this is a real bug, not a config mistake.
/acp spawn ... --bind here is documented to bind the current Discord channel or thread in place, and spawnAcpSessions is only needed for --thread auto|here, not for --bind here:
https://docs.openclaw.ai/tools/acp-agents
https://docs.openclaw.ai/channels/discord
What it looks like is happening:
- normal inbound thread messages resolve the current-conversation binding correctly
- native Discord
/acpslash commands in that same thread do not resolve that binding the same way - so the slash command gets ACKed and falls back to a generic
"done"reply, or resolves against the parent thread context instead
So the short version is: Discord thread + /acp ... --bind here seems broken for follow-up native /acp commands.
Workarounds for now:
- Prefer
/acp spawn codex --thread hereinstead of--bind hereif you want that thread to be the ACP workspace- this uses the thread-binding path instead
- requires
channels.discord.threadBindings.spawnAcpSessions=true
- Otherwise keep targeting from the parent with explicit
--thread <id>or--session <key>
One quick check first, what does openclaw --version show? If you’re already on the latest build, I’d treat this as GitHub-issue-worthy, because the docs say it should work.
whats the difference between /acp spawn --thread here vs /acp spawn --bind here ?
Short version:
-
/acp spawn ... --thread here- thread-specific
- requires you to already be inside a thread
- binds the ACP session to that thread via the thread-binding path
- on Discord, this path depends on
channels.discord.threadBindings.spawnAcpSessions=true
-
/acp spawn ... --bind here- generic current-conversation binding
- pins whatever conversation you’re in, channel or thread, without creating a child thread
- does not need
spawnAcpSessions
Practical difference:
- in an existing Discord thread, they’re supposed to feel very similar
- but right now, for your bug,
--thread hereis the better workaround because Discord native/acpfollow-ups seem to resolve thread bindings more reliably than current-conversation binds
So for your case, I’d use:
/acp spawn codex --thread here
Docs:
If you want, I can also give you the “when to use which” rule of thumb in one sentence.
your advice are bad, even in a thread , that was spanwed using --thread ehre, any /acp commands are ignored / reutnred done
You’re right, that advice was bad. Sorry. I dug deeper, and this looks broader than --bind here.
I now think native /acp commands in Discord threads are broken in general right now, including threads started with --thread here.
Why I think that:
- the
"Done."reply is the native slash-command fallback when the command got ACKed but no real reply payload was rendered - Discord thread message routing and Discord thread native
/acpslash-command routing go through different code paths - the thread message path appears to resolve bindings differently than the native slash path
So I would not keep tweaking config for this one. It smells like a real bug.
What I’d trust as the current workaround:
- run the
/acplifecycle commands from outside the thread, and target explicitly with--thread <id>or--session <key>
What would help confirm it fast:
- paste
openclaw --version
If you’re on latest, I’d file this as a bug with this repro:
- create or use a Discord thread
- run
/acp spawn codex --thread here - then run
/acp statusin that same thread - result is just
"Done."
Issue link: https://github.com/openclaw/openclaw/issues
If you want, I can write the bug report text for you so you can paste it in directly.
whats the difference between acp.runtime.ttlMinutes vs plugins.entries.acpx.config.timeoutSeconds in openclaw.json
They control different clocks.
-
acp.runtime.ttlMinutes- idle lifetime for ACP runtime workers
- after a session sits unused that long, OpenClaw can clean up the cached runtime/handle
- this is about how long the ACP worker stays warm between commands
- it does not limit a single command/turn
-
plugins.entries.acpx.config.timeoutSeconds- per-turn timeout for the embedded
acpxruntime - if one ACP turn runs longer than this, that turn gets aborted
- this is about how long one command is allowed to run
- default is
120
- per-turn timeout for the embedded
So the mental model is:
ttlMinutes= “how long can this ACP session sit idle before cleanup?”