fix(sessions): stop reporting a dispatched prompt that never landed

`prompt_async` answers 204 as soon as OpenCode forks the run and reports
every later failure only on the session event stream, so an unusable
model, agent, or variant produced a session with no message while the
result still claimed `promptDispatched: true`.

Validate an explicitly requested model, agent, and variant against the
directory's own agent and provider lists before any session, worktree, or
goal is created, and confirm a new user message actually reached the
session before reporting the dispatch. A failed or empty lookup never
turns a valid selection into a rejection.
This commit is contained in:
Bohdan Triapitsyn
2026-08-04 11:08:28 +03:00
parent f710b49854
commit 9d3d5c0852
3 changed files with 255 additions and 21 deletions
@@ -32,7 +32,15 @@ other.
requires observed activity or a newly completed assistant message.
- Timeout and cancellation are failures, never authoritative idle results.
- Validation that protects side effects runs before session creation or
dispatch.
dispatch. An explicitly requested model, agent, or variant is checked against
the directory's own OpenCode agent and provider lists before any session,
worktree, or goal is created, because `prompt_async` accepts an unusable
selection and then fails only on the event stream. A failed or empty lookup
never turns a valid selection into a rejection.
- `promptDispatched` reports an observed dispatch, never an accepted request.
After `prompt_async` the service confirms a new user message reached the
session; when it does not, the result reports `promptDispatched: false` with
`promptError` instead of claiming success.
- Send and fork dispatches without an explicit model/agent/variant reuse the
target session's last user-message selection before falling back to the
configured defaults; only session creation resolves defaults directly.