diff --git a/src/sandbox/index.test.ts b/src/sandbox/index.test.ts index 7546870..504bd4f 100644 --- a/src/sandbox/index.test.ts +++ b/src/sandbox/index.test.ts @@ -445,6 +445,7 @@ describe('streamSandboxPrompt seam', () => { harness: 'opencode', effort: 'high', history: [{ role: 'assistant', content: 'prior' }], + requireVisibleAssistantOutput: true, })) { out.push(e) } @@ -460,6 +461,7 @@ describe('streamSandboxPrompt seam', () => { baseUrl: 'https://router', }) expect(opts.backend.profile.extensions.opencode.reasoningEffort).toBe('high') + expect(opts.requireVisibleAssistantOutput).toBe(true) }) it('omits the model when provider resolution yields nothing', async () => { diff --git a/src/sandbox/index.ts b/src/sandbox/index.ts index e1ea10d..5265a4f 100644 --- a/src/sandbox/index.ts +++ b/src/sandbox/index.ts @@ -1504,6 +1504,7 @@ export interface StreamSandboxPromptOptions { extraMcp?: Record signal?: AbortSignal timeoutMs?: number + requireVisibleAssistantOutput?: boolean // When true, an interactive question event throws instead of yielding — // detached (cron/mission-step) runs have no consumer to answer it. disallowQuestions?: boolean @@ -1542,6 +1543,9 @@ export async function* streamSandboxPrompt( lastEventId: options?.lastEventId, ...(options?.signal ? { signal: options.signal } : {}), ...(options?.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}), + ...(options?.requireVisibleAssistantOutput !== undefined + ? { requireVisibleAssistantOutput: options.requireVisibleAssistantOutput } + : {}), backend: { type: harness, profile: profileWithEffort,