Add smart ACK provider for WeChat MP replies
Replace fixed ackText with a rule-based AckProvider that picks response templates by message type and intent (translate, summary, rewrite, poster, ppt, mindmap, code, search, schedule). Pure sync, zero I/O, auto-falls back to config.ackText on any error. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+39
-6
@@ -14,16 +14,20 @@ 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);
|
||||
assert.equal(DEFAULT_USER_POLICIES.code_delegate_executor, 'auto');
|
||||
assert.equal(DEFAULT_USER_POLICIES.code_task_routing, 'balanced');
|
||||
});
|
||||
|
||||
test('readonly workspace strips write capabilities', () => {
|
||||
const effective = applyPoliciesToCapabilities(
|
||||
{ shell: true, filesystem: true, code_browse: true },
|
||||
{ shell: true, filesystem: true, code_browse: true, aider: true, openhands: true },
|
||||
{ workspace_access: 'readonly' },
|
||||
);
|
||||
assert.equal(effective.shell, false);
|
||||
assert.equal(effective.filesystem, false);
|
||||
assert.equal(effective.code_browse, true);
|
||||
assert.equal(effective.aider, false);
|
||||
assert.equal(effective.openhands, false);
|
||||
});
|
||||
|
||||
test('network deny strips egress capabilities', () => {
|
||||
@@ -113,19 +117,48 @@ test('resolveAgentGooseMode auto-runs tools without end-user prompts', () => {
|
||||
),
|
||||
'auto',
|
||||
);
|
||||
assert.equal(
|
||||
resolveAgentGooseMode(
|
||||
{ ...DEFAULT_USER_CAPABILITIES, openhands: true, skills: false, chat_recall: false },
|
||||
{ goose_mode: 'chat' },
|
||||
),
|
||||
'auto',
|
||||
);
|
||||
});
|
||||
|
||||
test('resolvePolicies merges role and user overrides', () => {
|
||||
const resolved = resolvePolicies(
|
||||
{ goose_mode: 'approve', api_lockdown: true },
|
||||
{ goose_mode: 'chat' },
|
||||
{
|
||||
goose_mode: 'approve',
|
||||
api_lockdown: true,
|
||||
code_delegate_executor: 'aider',
|
||||
code_task_routing: 'force_aider',
|
||||
},
|
||||
{
|
||||
goose_mode: 'chat',
|
||||
code_delegate_executor: 'openhands',
|
||||
code_task_routing: 'split',
|
||||
},
|
||||
);
|
||||
assert.equal(resolved.goose_mode, 'chat');
|
||||
assert.equal(resolved.api_lockdown, true);
|
||||
assert.equal(resolved.code_delegate_executor, 'openhands');
|
||||
assert.equal(resolved.code_task_routing, 'split');
|
||||
});
|
||||
|
||||
test('normalizePolicyPatch ignores invalid values', () => {
|
||||
assert.deepEqual(normalizePolicyPatch({ goose_mode: 'invalid', api_lockdown: true }), {
|
||||
api_lockdown: true,
|
||||
});
|
||||
assert.deepEqual(
|
||||
normalizePolicyPatch({
|
||||
goose_mode: 'invalid',
|
||||
api_lockdown: true,
|
||||
code_delegate_executor: 'openhands',
|
||||
code_task_routing: 'force_openhands',
|
||||
bogus: 'x',
|
||||
}),
|
||||
{
|
||||
api_lockdown: true,
|
||||
code_delegate_executor: 'openhands',
|
||||
code_task_routing: 'force_openhands',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user