Skip to content

Commit a8fb073

Browse files
committed
fix(opencode): persist fresh retry sessions
1 parent a27de0d commit a8fb073

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

apps/sim/app/api/tools/opencode/prompt/route.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,55 @@ describe('POST /api/tools/opencode/prompt', () => {
293293
},
294294
})
295295
})
296+
297+
it('stores and returns the fresh session id when the retry prompt fails', async () => {
298+
mockGetStoredOpenCodeSession.mockResolvedValue({
299+
sessionId: 'stale-session',
300+
repository: 'repo-a',
301+
updatedAt: '2026-03-25T00:00:00.000Z',
302+
})
303+
mockPromptOpenCodeSession
304+
.mockRejectedValueOnce(new Error('session not found'))
305+
.mockRejectedValueOnce(new Error('provider unavailable'))
306+
mockShouldRetryWithFreshOpenCodeSession.mockReturnValue(true)
307+
mockCreateOpenCodeSession.mockResolvedValue({ id: 'fresh-session' })
308+
309+
const request = createMockRequest('POST', {
310+
repository: 'repo-a',
311+
providerId: 'provider-a',
312+
modelId: 'model-a',
313+
prompt: 'retry please',
314+
_context: {
315+
workspaceId: 'ws-1',
316+
workflowId: 'wf-1',
317+
userId: 'user-123',
318+
},
319+
})
320+
321+
const response = await POST(request as never)
322+
const data = await response.json()
323+
324+
expect(response.status).toBe(200)
325+
expect(mockPromptOpenCodeSession).toHaveBeenCalledTimes(2)
326+
expect(mockStoreOpenCodeSession).toHaveBeenCalledWith(
327+
'ws-1',
328+
'memory-key',
329+
expect.objectContaining({
330+
sessionId: 'fresh-session',
331+
repository: 'repo-a',
332+
})
333+
)
334+
expect(mockLogOpenCodeFailure).toHaveBeenCalledWith(
335+
'Failed to retry OpenCode prompt with a fresh session',
336+
expect.objectContaining({ message: 'provider unavailable' })
337+
)
338+
expect(data).toEqual({
339+
success: true,
340+
output: {
341+
content: '',
342+
threadId: 'fresh-session',
343+
error: 'provider unavailable',
344+
},
345+
})
346+
})
296347
})

apps/sim/app/api/tools/opencode/prompt/route.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,21 @@ export async function POST(request: NextRequest) {
178178
return buildSuccessResponse(result.threadId, result.content, result.cost)
179179
} catch (error) {
180180
if (threadId && !newThread && shouldRetryWithFreshOpenCodeSession(error)) {
181+
let freshSessionId = threadId
182+
181183
try {
182184
const freshSession = await createOpenCodeSession(
183185
repositoryOption,
184186
buildOpenCodeSessionTitle(repositoryId, sessionOwnerKey)
185187
)
188+
freshSessionId = freshSession.id
189+
190+
await storeOpenCodeSession(workspaceId, memoryKey, {
191+
sessionId: freshSessionId,
192+
repository: repositoryId,
193+
updatedAt: new Date().toISOString(),
194+
})
195+
186196
const result = await executePrompt(
187197
body,
188198
repositoryId,
@@ -219,7 +229,7 @@ export async function POST(request: NextRequest) {
219229
retryError instanceof Error
220230
? retryError.message
221231
: 'OpenCode prompt retry failed'
222-
return buildErrorResponse(threadId, '', undefined, errorMessage)
232+
return buildErrorResponse(freshSessionId, '', undefined, errorMessage)
223233
}
224234
}
225235

0 commit comments

Comments
 (0)