fix(node): mirror transactional Auggie hooks

This commit is contained in:
ZacharyZhang-NY committed 2026-07-20 09:33:49 -04:00
1 parent 6c2654a4b5
commit 384f3053c0
12 files changed
+1122 -507

No files matched your search

+154
View File
@@ -0,0 +1,154 @@
import assert from 'node:assert/strict';
import { readFile, rm, writeFile } from 'node:fs/promises';
import path from 'node:path';
import test from 'node:test';
import {
createFixture,
managedHandler,
readSettings,
runHandler,
runPlugin,
startApiServer,
} from '../test-support/augment-test-helpers.mjs';
async function status(fixture) {
const result = await runPlugin(fixture, 'status', null);
return { result, value: result.code === 0 ? JSON.parse(result.stdout) : undefined };
}
test('Auggie guard propagates exit code 2 for a frozen agent', async () => {
const api = await startApiServer({ status: 'frozen' });
const fixture = await createFixture({ baseUrl: api.baseUrl });
try {
const install = await fixture.install();
assert.equal(install.code, 0, install.stderr);
const settings = (await readSettings(fixture.settingsPath)).settings;
const guard = managedHandler(settings, 'PreToolUse', fixture.guardWrapperPath);
const payload = JSON.stringify({
hook_event_name: 'PreToolUse',
conversation_id: 'conversation-1',
workspace_roots: [fixture.projectDir],
tool_name: 'launch-process',
tool_input: { command: 'echo test' },
is_mcp_tool: false,
});
const result = await runHandler(guard, payload, fixture);
assert.equal(result.code, 2, result.stderr);
assert.match(result.stderr, /Agent "augment" is frozen/);
assert.equal(api.requests.filter((request) => request.method === 'GET').length, 1);
} finally {
await fixture.close();
await api.close();
}
});
test('Auggie audit preserves the complete native hook payload', async () => {
const api = await startApiServer();
const fixture = await createFixture({ baseUrl: api.baseUrl });
try {
const install = await fixture.install();
assert.equal(install.code, 0, install.stderr);
const settings = (await readSettings(fixture.settingsPath)).settings;
const audit = managedHandler(settings, 'PostToolUse', fixture.auditWrapperPath);
const payload = {
hook_event_name: 'PostToolUse',
conversation_id: 'conversation-1',
workspace_roots: [fixture.projectDir],
tool_name: 'launch-process',
tool_input: { command: 'echo test', nested: { preserve: true } },
tool_output: { stdout: 'test', stderr: '', exit_code: 0 },
is_mcp_tool: false,
conversation_data: [{ role: 'user', content: 'preserve this' }],
mcp_metadata: { server: 'local', transport: 'stdio' },
user_context: { account: 'user-1' },
future_field: { survives: ['exactly', 2] },
};
const result = await runHandler(audit, JSON.stringify(payload), fixture);
assert.equal(result.code, 0, result.stderr);
const request = api.requests.find((candidate) => candidate.method === 'POST');
assert(request);
assert.deepEqual(JSON.parse(request.raw).payload, payload);
} finally {
await fixture.close();
await api.close();
}
});
test('Auggie status requires settings, exact runtime identity, key, scripts, and wrappers', async () => {
const fixture = await createFixture();
try {
assert.equal((await fixture.install()).code, 0);
assert.equal((await status(fixture)).value.installed, true);
await rm(fixture.guardWrapperPath);
assert.equal((await status(fixture)).value.installed, false);
assert.equal((await fixture.install()).code, 0);
await rm(fixture.hookScriptPath);
assert.equal((await status(fixture)).value.installed, false);
assert.equal((await fixture.install()).code, 0);
await writeFile(fixture.auditWrapperPath, 'tampered wrapper\n');
assert.equal((await status(fixture)).value.installed, false);
assert.equal((await fixture.install()).code, 0);
const keyPath = path.join(fixture.agentDir, 'private.key');
await writeFile(keyPath, 'invalid');
const invalidKey = await status(fixture);
assert.equal(invalidKey.result.code, 1);
assert.match(invalidKey.result.stderr, /private key is invalid/i);
} finally {
await fixture.close();
}
});
test('Auggie status surfaces malformed and mismatched runtime metadata', async (t) => {
for (const [name, contents, pattern] of [
['malformed', '{ malformed', /parse Elydora runtime config/i],
['duplicate', '{"agent_name":"augment","agent_name":"augment"}', /duplicate field/i],
['mismatched', JSON.stringify({
org_id: 'org-1',
agent_id: 'other-agent',
kid: 'kid-1',
base_url: 'https://api.elydora.com',
agent_name: 'augment',
}), /identity does not match/i],
['unsupported field', JSON.stringify({
org_id: 'org-1',
agent_id: 'agent-1',
kid: 'kid-1',
base_url: 'https://api.elydora.com',
agent_name: 'augment',
hidden: true,
}), /unsupported field/i],
]) {
await t.test(name, async () => {
const fixture = await createFixture();
try {
assert.equal((await fixture.install()).code, 0);
await writeFile(path.join(fixture.agentDir, 'config.json'), contents);
const current = await status(fixture);
assert.equal(current.result.code, 1);
assert.match(current.result.stderr, pattern);
} finally {
await fixture.close();
}
});
}
});
test('Auggie status ignores incomplete managed hook pairs', async () => {
const fixture = await createFixture();
try {
assert.equal((await fixture.install()).code, 0);
const { settings } = await readSettings(fixture.settingsPath);
delete settings.hooks.PostToolUse;
await writeFile(fixture.settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
const current = await status(fixture);
assert.equal(current.result.code, 0, current.result.stderr);
assert.equal(current.value.hookConfigured, false);
assert.equal(current.value.installed, false);
} finally {
await fixture.close();
}
});