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:
john
2026-06-26 15:19:03 +08:00
parent 9ed4fd48d7
commit 9b4a25799f
162 changed files with 17276 additions and 2054 deletions
+39 -6
View File
@@ -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',
},
);
});