Add Experience reflect background worker with env-gated scheduling.

Start a periodic reflect loop from portal and MindSpace service bootstraps when EXPERIENCE_REFLECT_ENABLED=1, aggregating repeated task outcomes on a configurable interval.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-09-02 14:31:50 +08:00
parent 2ec6fdbe11
commit 49758568bb
4 changed files with 249 additions and 0 deletions
@@ -59,6 +59,7 @@ async function loadMemindModules(memindRoot) {
userAuth,
agentRunner,
experienceService,
experienceReflectWorker,
workspaceThumbnails,
workspaceSync,
] = await Promise.all([
@@ -71,6 +72,7 @@ async function loadMemindModules(memindRoot) {
importFromMemindRoot(memindRoot, 'user-auth.mjs'),
importFromMemindRoot(memindRoot, 'mindspace-agent-runner.mjs'),
importFromMemindRoot(memindRoot, 'experience-service.mjs'),
importFromMemindRoot(memindRoot, 'experience-reflect-worker.mjs'),
importFromMemindRoot(memindRoot, 'mindspace-workspace-thumbnails.mjs'),
importFromMemindRoot(memindRoot, 'mindspace-workspace-sync.mjs'),
]);
@@ -84,6 +86,7 @@ async function loadMemindModules(memindRoot) {
...userAuth,
...agentRunner,
...experienceService,
...experienceReflectWorker,
...workspaceThumbnails,
...workspaceSync,
};
@@ -134,6 +137,7 @@ export async function bootstrapMindSpaceService({
createSessionSnapshotService,
createUserAuth,
createExperienceService,
startExperienceReflectWorker,
resolveMindSpaceServerRuntimeOptions,
startWorkspaceAssetSyncWatcher,
startWorkspaceThumbnailWatcher,
@@ -178,6 +182,13 @@ export async function bootstrapMindSpaceService({
if (runtime.experienceEnabled) {
experienceService = createExperienceService(pool, { productEventsPool: pool });
}
const experienceReflectWorker = experienceService
? startExperienceReflectWorker({
experienceService,
env,
logger,
})
: { stop() {}, policy: { enabled: false } };
const agentRunner = createMindSpaceAgentRunner({
apiTarget,
apiSecret,
@@ -218,9 +229,11 @@ export async function bootstrapMindSpaceService({
sessionSnapshotService,
userAuth,
agentRunner,
experienceReflectWorker,
adapter,
backgroundJobs,
async close() {
experienceReflectWorker.stop?.();
await pool.end();
},
};