Repository navigation
Closed as not planned
Closed as not planned
Copy link
Description
Bug Description
In opencode web mode, child sessions created via POST /session?directory=/path return HTTP 200 with Content-Length: 0 (empty body) on subsequent POST /session/{id}/message calls. Child sessions created without the directory query parameter work correctly.
Environment
- OpenCode: 1.1.51
- Mode:
opencode web - Platform: Linux x86_64
Steps to Reproduce
AUTH="Basic $(echo -n 'opencode:<password>' | base64)"
PARENT="<any_existing_session_id>"
# 1. Create child session WITH directory
CHILD=$(curl -s -H "Authorization: $AUTH" -H "Content-Type: application/json" \
-X POST "http://localhost:4096/session?directory=/home/user/project" \
-d "{\"parentID\": \"$PARENT\"}")
CHILD_ID=$(echo $CHILD | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
# 2. Send prompt — returns empty body
curl -v -H "Authorization: $AUTH" -H "Content-Type: application/json" \
-X POST "http://localhost:4096/session/$CHILD_ID/message" \
-d '{"agent":"sisyphus-junior","parts":[{"type":"text","text":"hello"}]}'
# → HTTP 200, Content-Length: 0, empty bodyComparison: Without directory
# Create child session WITHOUT directory
CHILD2=$(curl -s -H "Authorization: $AUTH" -H "Content-Type: application/json" \
-X POST "http://localhost:4096/session" \
-d "{\"parentID\": \"$PARENT\"}")
CHILD2_ID=$(echo $CHILD2 | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
# Send prompt — returns full response
curl -s -H "Authorization: $AUTH" -H "Content-Type: application/json" \
-X POST "http://localhost:4096/session/$CHILD2_ID/message" \
-d '{"agent":"sisyphus-junior","parts":[{"type":"text","text":"hello"}]}'
# → HTTP 200, body = 1261 bytes (valid JSON)Controlled Experiment Results
Only variable changed is the directory parameter. Everything else (parent session, prompt body, auth) is identical:
POST /session → prompt ✅ body=1261 bytes
POST /session?directory=/home/user/project → prompt ❌ body=0 bytes
POST /session?directory=/home/user → prompt ❌ body=0 bytes
Impact
The oh-my-opencode plugin passes directory when creating subagent sessions to ensure subagents operate in the correct project directory. This bug causes delegate_task (and call_omo_agent, look_at) to fail 100% of the time in opencode web mode. TUI mode is unaffected (presumably uses in-process transport rather than HTTP).
Metadata
Metadata
Assignees
Labels
No labels
Activity
github-actions commentedon Feb 5, 2026
This issue might be a duplicate of existing issues. Please check:
Feel free to ignore if none of these address your specific case.
fix: resolve child session directory and add XDG-compliant skill paths (
majiayu000 commentedon Mar 13, 2026
Hi, I've been investigating this and I believe I found the root cause.
Root Cause
The server middleware (
server.ts) resolves theInstancecontext from?directory=query param or falls back toprocess.cwd()for every request. When a session is created viaPOST /session?directory=/path, the session storesdirectory=/pathandprojectIDfor that directory.However, when
POST /session/{id}/messageis called without?directory=, the middleware defaults toprocess.cwd(), creating anInstancecontext for the wrong directory. SinceInstance.state()(used bySessionPrompt,Agent, etc.) is scoped per-directory, the prompt processing runs under the wrong project context. Any error thrown is silently swallowed by Hono'sstream()handler, resulting in HTTP 200 with an empty body.Fix
The session route handlers that process prompts (
message,prompt_async,command,shell,summarize) should re-enter the correctInstancecontext using the session's storeddirectorybefore processing:This is safe because
Instance.provide()caches instances by directory — if the correct instance already exists (which it will for sessions created under the current server's CWD), the cached instance is reused with zero overhead.I have a working implementation with all 5 affected routes fixed. TypeScript compiles cleanly and all 1286 existing tests pass. Happy to open a PR if this approach looks right.
github-actions commentedon Jul 3, 2026
To stay organized issues are automatically closed after 60 days of no activity. If the issue is still relevant please open a new one.