fix(agent): recover stale runs and improve new-user OA delivery
Fix DEV logout cookie clearing, materialize selected MindSpace OA assets before agent runs, and recover zombie runs from synced workspace pages. Add client run wait timeout, harness retry limits, page-edit asset forwarding, and logout/john2 scenario tests. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -344,21 +344,31 @@ export function usePageEditSubChat({
|
||||
setPendingTool(null);
|
||||
|
||||
try {
|
||||
const runOptions = resolveAgentRunOptions(trimmed, {
|
||||
taskType: 'page_edit_code_task',
|
||||
forceCode: true,
|
||||
userId: user?.id ?? null,
|
||||
requestId,
|
||||
mindspaceContext: context,
|
||||
pageEdit: {
|
||||
pageId,
|
||||
pageTitle,
|
||||
},
|
||||
});
|
||||
const createdRun = await createAgentRun(
|
||||
currentSession.id,
|
||||
requestId,
|
||||
userMessage,
|
||||
resolveAgentRunOptions(trimmed, {
|
||||
taskType: 'page_edit_code_task',
|
||||
forceCode: true,
|
||||
userId: user?.id ?? null,
|
||||
requestId,
|
||||
mindspaceContext: context,
|
||||
pageEdit: {
|
||||
pageId,
|
||||
pageTitle,
|
||||
},
|
||||
}),
|
||||
{
|
||||
...runOptions,
|
||||
...(context.selectedAssets?.length
|
||||
? {
|
||||
selectedAssetIds: context.selectedAssets
|
||||
.map((asset) => asset.id)
|
||||
.filter(Boolean),
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
);
|
||||
const finishedRun =
|
||||
createdRun.status === 'succeeded' ? createdRun : await waitForAgentRun(createdRun.id);
|
||||
|
||||
+52
-10
@@ -8,6 +8,7 @@ import {
|
||||
confirmTool,
|
||||
createAgentRun,
|
||||
deleteChatSession,
|
||||
getAgentRun,
|
||||
getMindSpace,
|
||||
getMe,
|
||||
listNotifications,
|
||||
@@ -108,6 +109,7 @@ async function waitForAgentRun(runId: string): Promise<AgentRun> {
|
||||
}
|
||||
|
||||
const DIRECT_CHAT_SESSION_POLL_MS = 600;
|
||||
const AGENT_RUN_WAIT_TIMEOUT_MS = 16 * 60 * 1000;
|
||||
|
||||
async function waitForAgentRunWithDirectChatPreview(
|
||||
runId: string,
|
||||
@@ -119,7 +121,22 @@ async function waitForAgentRunWithDirectChatPreview(
|
||||
): Promise<AgentRun> {
|
||||
return await new Promise<AgentRun>((resolve, reject) => {
|
||||
let pollTimer: number | null = null;
|
||||
let waitTimer: number | null = null;
|
||||
let pollingSessionId: string | null = null;
|
||||
let settled = false;
|
||||
let unsubscribe = () => {};
|
||||
|
||||
const settle = (action: () => void) => {
|
||||
if (settled) return;
|
||||
settled = true;
|
||||
stopPoll();
|
||||
if (waitTimer != null) {
|
||||
window.clearTimeout(waitTimer);
|
||||
waitTimer = null;
|
||||
}
|
||||
unsubscribe();
|
||||
action();
|
||||
};
|
||||
|
||||
const stopPoll = () => {
|
||||
if (pollTimer != null) {
|
||||
@@ -150,7 +167,7 @@ async function waitForAgentRunWithDirectChatPreview(
|
||||
}, DIRECT_CHAT_SESSION_POLL_MS);
|
||||
};
|
||||
|
||||
const unsubscribe = subscribeAgentRunEvents(
|
||||
unsubscribe = subscribeAgentRunEvents(
|
||||
runId,
|
||||
(run) => {
|
||||
if (run.sessionId) {
|
||||
@@ -160,23 +177,41 @@ async function waitForAgentRunWithDirectChatPreview(
|
||||
}
|
||||
}
|
||||
if (run.status === 'succeeded') {
|
||||
stopPoll();
|
||||
unsubscribe();
|
||||
resolve(run);
|
||||
settle(() => resolve(run));
|
||||
return;
|
||||
}
|
||||
if (run.status === 'failed') {
|
||||
stopPoll();
|
||||
unsubscribe();
|
||||
reject(new Error(run.error || '后台任务失败,请稍后重试'));
|
||||
settle(() => reject(new Error(run.error || '后台任务失败,请稍后重试')));
|
||||
}
|
||||
},
|
||||
(error) => {
|
||||
stopPoll();
|
||||
unsubscribe();
|
||||
reject(error);
|
||||
settle(() => reject(error));
|
||||
},
|
||||
);
|
||||
|
||||
waitTimer = window.setTimeout(() => {
|
||||
void getAgentRun(runId)
|
||||
.then((run) => {
|
||||
if (run.status === 'succeeded') {
|
||||
settle(() => resolve(run));
|
||||
return;
|
||||
}
|
||||
if (run.status === 'failed') {
|
||||
settle(() => reject(new Error(run.error || '后台任务失败,请稍后重试')));
|
||||
return;
|
||||
}
|
||||
settle(() =>
|
||||
reject(
|
||||
new Error('后台任务耗时较长,已停止等待;页面若已生成可在「我的页面」查看'),
|
||||
),
|
||||
);
|
||||
})
|
||||
.catch((error) => {
|
||||
settle(() =>
|
||||
reject(error instanceof Error ? error : new Error(String(error))),
|
||||
);
|
||||
});
|
||||
}, AGENT_RUN_WAIT_TIMEOUT_MS);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1347,6 +1382,13 @@ export function useTKMindChat(
|
||||
{
|
||||
...runOptions,
|
||||
...(options?.forceDeepReasoning ? { forceDeepReasoning: true } : {}),
|
||||
...(options?.mindspaceContext?.selectedAssets?.length
|
||||
? {
|
||||
selectedAssetIds: options.mindspaceContext.selectedAssets
|
||||
.map((asset) => asset.id)
|
||||
.filter(Boolean),
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
);
|
||||
const runSessionId = createdRun.sessionId ?? activeSessionId;
|
||||
|
||||
Reference in New Issue
Block a user