Files
memind/policies.test.mjs
T
John 6ee6fd64dd Add MindSpace page live edit, chat skills, and H5 deploy tooling.
Introduce page edit sessions with draft preview and patch API, chat skill picker, user memory profile, h5ApiBase resolution, voice WAV transport, and scripts for 105/g2 deployment and Plaza local dev.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-15 22:09:38 -07:00

132 lines
4.0 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { DEFAULT_USER_CAPABILITIES } from './capabilities.mjs';
import {
applyPoliciesToCapabilities,
DEFAULT_USER_POLICIES,
evaluateProxyRequest,
normalizePolicyPatch,
resolveAgentGooseMode,
resolvePolicies,
} from './policies.mjs';
test('default user policies are conservative', () => {
assert.equal(DEFAULT_USER_POLICIES.goose_mode, 'chat');
assert.equal(DEFAULT_USER_POLICIES.network_egress, 'deny');
assert.equal(DEFAULT_USER_POLICIES.api_lockdown, true);
});
test('readonly workspace strips write capabilities', () => {
const effective = applyPoliciesToCapabilities(
{ shell: true, filesystem: true, code_browse: true },
{ workspace_access: 'readonly' },
);
assert.equal(effective.shell, false);
assert.equal(effective.filesystem, false);
assert.equal(effective.code_browse, true);
});
test('network deny strips egress capabilities', () => {
const effective = applyPoliciesToCapabilities(
{ shell: true, computer: true, charts: true },
{ network_egress: 'deny' },
);
assert.equal(effective.shell, false);
assert.equal(effective.computer, false);
assert.equal(effective.charts, true);
});
test('network deny keeps shell for static_publish sandbox users', () => {
const effective = applyPoliciesToCapabilities(
{ static_publish: true, shell: true, computer: true },
{ network_egress: 'deny' },
);
assert.equal(effective.shell, true);
assert.equal(effective.computer, false);
});
test('api lockdown blocks extension admin routes', () => {
const denied = evaluateProxyRequest('POST', '/agent/add_extension', {
api_lockdown: true,
});
assert.equal(denied.allowed, false);
const allowed = evaluateProxyRequest('POST', '/sessions/abc/reply', {
api_lockdown: true,
});
assert.equal(allowed.allowed, true);
const deleteAllowed = evaluateProxyRequest('DELETE', '/sessions/abc', {
api_lockdown: true,
});
assert.equal(deleteAllowed.allowed, true);
});
test('api lockdown blocks native H5 APIs from agent proxy fallback', () => {
const denied = evaluateProxyRequest(
'POST',
'/mindspace/v1/pages/demo/thumbnail/regenerate',
{ api_lockdown: true },
);
assert.equal(denied.allowed, false);
assert.match(denied.reason ?? '', /H5 本地接口不应走 Agent 代理/);
});
test('unrestricted users bypass api lockdown', () => {
const result = evaluateProxyRequest('POST', '/config/permissions', {}, { unrestricted: true });
assert.equal(result.allowed, true);
});
test('resolvePolicies maps legacy approve modes to auto', () => {
const resolved = resolvePolicies({ goose_mode: 'approve' }, {});
assert.equal(resolved.goose_mode, 'auto');
});
test('resolveAgentGooseMode uses chat when no tools are enabled', () => {
const chatOnly = {
...DEFAULT_USER_CAPABILITIES,
skills: false,
chat_recall: false,
memory_store: false,
context_memory: false,
image_read: false,
};
assert.equal(resolveAgentGooseMode(chatOnly, { goose_mode: 'auto' }), 'chat');
});
test('resolveAgentGooseMode auto-runs tools without end-user prompts', () => {
assert.equal(
resolveAgentGooseMode(DEFAULT_USER_CAPABILITIES, { goose_mode: 'chat' }),
'auto',
);
assert.equal(
resolveAgentGooseMode(
{ ...DEFAULT_USER_CAPABILITIES, static_publish: true },
{ goose_mode: 'chat' },
),
'auto',
);
assert.equal(
resolveAgentGooseMode(
{ ...DEFAULT_USER_CAPABILITIES, static_publish: true },
{ goose_mode: 'approve' },
),
'auto',
);
});
test('resolvePolicies merges role and user overrides', () => {
const resolved = resolvePolicies(
{ goose_mode: 'approve', api_lockdown: true },
{ goose_mode: 'chat' },
);
assert.equal(resolved.goose_mode, 'chat');
assert.equal(resolved.api_lockdown, true);
});
test('normalizePolicyPatch ignores invalid values', () => {
assert.deepEqual(normalizePolicyPatch({ goose_mode: 'invalid', api_lockdown: true }), {
api_lockdown: true,
});
});