I understand you want to make report generation asynchronous so users can interact with other parts of the system while reports are being generated. Currently, the submit server action in app/actions.tsx processes requests synchronously, blocking until all agent work completes before returning 1 .
Current Blocking Behavior
The system uses streaming primitives for progressive UI rendering, but the server action itself is synchronous:
- The
submit function initializes streaming state but waits for all processing to complete 1 - The researcher agent runs in a synchronous loop until a non-empty response is generated 2
- Resolution search processing is called synchronously 3
- The function only returns after all work is done 4
Required Changes for Asynchronous Processing
To make report generation truly asynchronous, you would need to implement a background job queue system:
1. Job Queue Infrastructure
- Implement a job queue (e.g., Bull, Agenda, or database-backed queue)
- Create a separate worker process to handle report generation jobs
- Store job state in a database for persistence
2. Modified Submit Flow
// Instead of blocking, return immediately with job IDasyncfunctionsubmit(formData?: FormData,skip?: boolean){constjobId=nanoid()// Enqueue the job for background processingawaitqueue.add('report-generation',{
jobId,
formData,
skip
})// Return immediately with job IDreturn{
jobId,status: 'processing'}}3. Status Checking Mechanism
- Create a new server action to check job status
- Implement polling or websocket updates on the client
- Stream partial results as they become available from the worker
4. Worker Process
- Move the current
processEvents() and processResolutionSearch() logic to a worker - Update AIState progressively as results are generated
- Store intermediate results in the database
Notes
This is a significant architectural change that requires implementing a job queue system, worker processes, and status tracking infrastructure. The current streaming approach in app/actions.tsx provides progressive UI updates but still blocks the server action. True asynchronous processing would require background job processing with a queue system like Bull or a database-backed solution. The existing optimizations in OPTIMIZATION_SUMMARY.md focus on reducing re-renders and caching, not on making the actual generation process non-blocking.
Wiki pages you might want to explore:
Citations
File: app/actions.tsx (L36-42)
asyncfunctionsubmit(formData?: FormData,skip?: boolean){'use server'constaiState=getMutableAIState<typeofAI>()constuiStream=createStreamableUI()constisGenerating=createStreamableValue(true)constisCollapsed=createStreamableValue(false)File: app/actions.tsx (L223-223)
processResolutionSearch();
File: app/actions.tsx (L516-550)
while(useSpecificAPI
? answer.length===0
: answer.length===0&&!errorOccurred){const{ fullResponse, hasError, toolResponses }=awaitresearcher(currentSystemPrompt,uiStream,streamText,messages,mapProvider,useSpecificAPI,drawnFeatures)answer=fullResponsetoolOutputs=toolResponseserrorOccurred=hasErrorif(toolOutputs.length>0){toolOutputs.map(output=>{aiState.update({
...aiState.get(),messages: [
...aiState.get().messages,{id: groupeId,role: 'tool',content: JSON.stringify(output.result),name: output.toolName,type: 'tool'}]})})}File: app/actions.tsx (L619-624)
return{id: nanoid(),isGenerating: isGenerating.value,component: uiStream.value,isCollapsed: isCollapsed.value}
I understand you want to make report generation asynchronous so users can interact with other parts of the system while reports are being generated. Currently, the
submitserver action inapp/actions.tsxprocesses requests synchronously, blocking until all agent work completes before returning 1 .Current Blocking Behavior
The system uses streaming primitives for progressive UI rendering, but the server action itself is synchronous:
submitfunction initializes streaming state but waits for all processing to complete 1Required Changes for Asynchronous Processing
To make report generation truly asynchronous, you would need to implement a background job queue system:
1. Job Queue Infrastructure
2. Modified Submit Flow
3. Status Checking Mechanism
4. Worker Process
processEvents()andprocessResolutionSearch()logic to a workerNotes
This is a significant architectural change that requires implementing a job queue system, worker processes, and status tracking infrastructure. The current streaming approach in
app/actions.tsxprovides progressive UI updates but still blocks the server action. True asynchronous processing would require background job processing with a queue system like Bull or a database-backed solution. The existing optimizations inOPTIMIZATION_SUMMARY.mdfocus on reducing re-renders and caching, not on making the actual generation process non-blocking.Wiki pages you might want to explore:
Citations
File: app/actions.tsx (L36-42)
File: app/actions.tsx (L223-223)
File: app/actions.tsx (L516-550)
File: app/actions.tsx (L619-624)