Files
memind/cursor-page-timeout-takeover.test.mjs
T
john cb3fb352be
Memind CI / Test, build, and release guards (push) Failing after 11m45s
feat(agent-run): retry goose page timeouts with Cursor executor
When a page-generation run times out without recoverable HTML, retry once
via Cursor code executor if MEMIND_CURSOR_PAGE_TIMEOUT_TAKEOVER is enabled.
Also release delivery contracts after successful deliverable recovery.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-11 13:40:05 +08:00

101 lines
3.0 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import {
buildCursorPageTimeoutTakeover,
cursorPageTimeoutTakeoverEnabled,
resolveCursorPageTimeoutTakeover,
shouldRetryPageGenerationWithCursor,
} from './cursor-page-timeout-takeover.mjs';
const enabledEnv = {
MEMIND_CURSOR_EXECUTOR_ENABLED: '1',
MEMIND_CURSOR_PAGE_TIMEOUT_TAKEOVER: '1',
MEMIND_AIDER_SKILL_USE_CURSOR: '1',
};
test('cursorPageTimeoutTakeoverEnabled respects env flag', () => {
assert.equal(cursorPageTimeoutTakeoverEnabled({}), false);
assert.equal(cursorPageTimeoutTakeoverEnabled(enabledEnv), true);
});
test('shouldRetryPageGenerationWithCursor accepts page timeout without deliverables', () => {
const row = {
user_message_json: JSON.stringify({
role: 'user',
content: [{ type: 'text', text: '帮我生成上海一日游攻略页面' }],
metadata: {
displayText: '帮我生成上海一日游攻略页面',
memindRun: { toolMode: 'chat' },
},
}),
};
assert.equal(
shouldRetryPageGenerationWithCursor({
row,
error: { code: 'AGENT_RUN_TIMEOUT' },
toolGatewayStatus: { enabled: true, executors: ['cursor'] },
env: enabledEnv,
}),
true,
);
});
test('shouldRetryPageGenerationWithCursor skips when deliverables already recovered', () => {
const row = {
user_message_json: JSON.stringify({
metadata: {
displayText: '帮我生成上海一日游攻略页面',
memindRun: { pageCursorDefault: true },
},
}),
};
assert.equal(
shouldRetryPageGenerationWithCursor({
row,
error: { code: 'AGENT_RUN_TIMEOUT' },
toolGatewayStatus: { enabled: true, executors: ['cursor'] },
env: enabledEnv,
}),
false,
);
});
test('buildCursorPageTimeoutTakeover rewrites message for cursor code executor', () => {
const row = {
user_message_json: JSON.stringify({
role: 'user',
content: [{ type: 'text', text: '帮我生成上海一日游攻略页面' }],
metadata: {
displayText: '帮我生成上海一日游攻略页面',
memindRun: { toolMode: 'chat' },
},
}),
};
const takeover = buildCursorPageTimeoutTakeover(row, { env: enabledEnv });
assert.ok(takeover);
assert.equal(takeover.runOptions.requiredExecutor, 'cursor');
assert.equal(takeover.runOptions.toolMode, 'code');
assert.equal(takeover.userMessage.metadata.memindRun.cursorTimeoutTakeover, true);
assert.match(
takeover.userMessage.content[0].text,
/MindSpace 工作区生成或更新 public\/\*\.html 页面/,
);
});
test('resolveCursorPageTimeoutTakeover returns null for non-timeout errors', () => {
const row = {
user_message_json: JSON.stringify({
metadata: { displayText: '帮我生成上海一日游攻略页面' },
}),
};
assert.equal(
resolveCursorPageTimeoutTakeover({
row,
error: { code: 'PUBLIC_PAGE_DELIVERABLE_MISSING' },
toolGatewayStatus: { enabled: true, executors: ['cursor'] },
env: enabledEnv,
}),
null,
);
});