Files
memind/scripts/agent-run-guard.test.mjs
T
john 41a7747c09 fix(guard): make agent-run pause idempotent to stop portal restart loop
Repeat guard checks no longer kickstart Portal when code runs are already disabled, preventing WeChat background replies from being killed every minute. Adds resume script and unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 13:41:17 +08:00

71 lines
2.2 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
buildPausePlan,
evaluateHealth,
isGuardPaused,
readEnvValue,
} from './agent-run-guard-lib.mjs';
test('readEnvValue reads unquoted and quoted values', () => {
const raw = [
'# comment',
'MEMIND_AGENT_CODE_RUNS_ENABLED=1',
'FOO="bar"',
].join('\n');
assert.equal(readEnvValue(raw, 'MEMIND_AGENT_CODE_RUNS_ENABLED'), '1');
assert.equal(readEnvValue(raw, 'FOO'), 'bar');
assert.equal(readEnvValue(raw, 'MISSING'), null);
});
test('isGuardPaused is true only when code runs explicitly disabled', () => {
assert.equal(isGuardPaused('MEMIND_AGENT_CODE_RUNS_ENABLED=0\n'), true);
assert.equal(isGuardPaused('MEMIND_AGENT_CODE_RUNS_ENABLED=1\n'), false);
assert.equal(isGuardPaused('# no key\n'), false);
});
test('buildPausePlan skips repeat pause when env already disabled', () => {
const envRaw = 'MEMIND_AGENT_CODE_RUNS_ENABLED=0\n';
const plan = buildPausePlan({
shouldPause: true,
envRaw,
dryRun: false,
});
assert.equal(plan.action, 'skip');
assert.equal(plan.alreadyPaused, true);
assert.match(plan.actions.join(' '), /skip_pause/);
});
test('buildPausePlan applies only on first pause trigger', () => {
const plan = buildPausePlan({
shouldPause: true,
envRaw: 'MEMIND_AGENT_CODE_RUNS_ENABLED=1\n',
dryRun: false,
});
assert.equal(plan.action, 'apply');
assert.equal(plan.alreadyPaused, false);
});
test('buildPausePlan does nothing when queue is healthy', () => {
const plan = buildPausePlan({
shouldPause: false,
envRaw: 'MEMIND_AGENT_CODE_RUNS_ENABLED=0\n',
dryRun: false,
});
assert.equal(plan.action, 'none');
});
test('evaluateHealth flags stale pending and running heartbeats', () => {
const now = Date.now();
const evaluation = evaluateHealth({
failedRecentCount: 0,
oldestPendingAgeMs: 6 * 60 * 1000,
queuedOrRetryable: 1,
oldestRunningHeartbeatAgeMs: 16 * 60 * 1000,
});
assert.equal(evaluation.shouldPause, true);
assert.ok(evaluation.reasons.some((reason) => reason.includes('oldest_pending_age_ms')));
assert.ok(evaluation.reasons.some((reason) => reason.includes('oldest_running_heartbeat_age_ms')));
assert.equal(now > 0, true);
});