OpenWriterControle/evals/framework/test-agent-direct.ts
darrenhinde 8eb4b31ef4 feat(evals): add opencoder test suite and fix expected violation handling
- Create separate test folder for opencoder agent with 4 tests
- Update openagent tests to use multi-turn prompts for approval workflow
- Fix test runner to properly handle expectedViolations with shouldViolate: true
- Add mustUseAnyOf behavior expectation for flexible tool matching
- Add unit tests for timeline-builder and context-loading-evaluator
- Update documentation to reflect agent-specific test structure
- Remove outdated AGENT_DETECTION_STATUS.md

Opencoder tests: 4/4 passing
Key insight: openagent uses text-based approval, opencoder uses tool permissions only
2025-11-26 01:52:18 +00:00

131 lines
4 KiB
TypeScript

#!/usr/bin/env npx tsx
/**
* Direct test: Ask agent to run ls and check if it actually executes
*/
import { createOpencodeClient } from '@opencode-ai/sdk';
const baseUrl = process.argv[2] || 'http://127.0.0.1:3000';
const agentToUse = process.argv[3] || 'opencoder';
async function test() {
console.log(`Connecting to ${baseUrl}...`);
console.log(`Using agent: ${agentToUse}`);
const client = createOpencodeClient({ baseUrl });
// Create a new session
console.log('\n1. Creating session...');
const sessionResp = await client.session.create({
body: { title: 'Direct Tool Test' }
});
const sessionId = sessionResp.data?.id;
console.log(` Session: ${sessionId}`);
if (!sessionId) {
console.log('Failed to create session');
return;
}
// Send a simple prompt using the correct API
console.log('\n2. Sending prompt: "Run ls in the current directory"');
console.log(' (prompt() should block until complete)');
const startTime = Date.now();
try {
const response = await client.session.prompt({
path: { id: sessionId },
body: {
parts: [{ type: 'text', text: 'Run ls in the current directory' }],
agent: agentToUse,
model: {
providerID: 'anthropic',
modelID: 'claude-sonnet-4-5'
}
}
});
const elapsed = Date.now() - startTime;
console.log(` Prompt completed in ${elapsed}ms`);
console.log(` Response has data: ${!!response.data}`);
// Check response directly
if (response.data) {
console.log(` Response info role: ${response.data.info?.role}`);
console.log(` Response parts: ${response.data.parts?.length || 0}`);
for (const part of response.data.parts || []) {
console.log(` - Part type: ${part.type}`);
if (part.type === 'tool') {
console.log(` Tool: ${part.tool}, Status: ${part.state?.status}`);
}
}
}
} catch (error) {
const elapsed = Date.now() - startTime;
console.log(` Error after ${elapsed}ms:`, (error as Error).message);
}
// No artificial wait - prompt() should have blocked until complete
console.log('\n3. Checking messages...');
// Get messages
console.log('\n4. Checking response...');
const messagesResp = await client.session.messages({ path: { id: sessionId } });
const messages = messagesResp.data || [];
console.log(` Total messages: ${messages.length}`);
// Check for tool usage
let toolCount = 0;
let bashOutput = '';
for (const msg of messages) {
if (msg.info?.role === 'assistant') {
for (const part of msg.parts || []) {
if (part.type === 'tool') {
toolCount++;
console.log(`\n TOOL FOUND: ${part.tool}`);
console.log(` Status: ${part.state?.status || part.status}`);
if (part.tool === 'bash') {
console.log(` Command: ${part.state?.input?.command || part.input?.command}`);
bashOutput = part.state?.output || part.output || '';
if (bashOutput) {
console.log(` Output preview: ${String(bashOutput).substring(0, 500)}`);
}
}
}
}
}
}
console.log('\n=== RESULT ===');
if (toolCount > 0) {
console.log(`✅ Agent used ${toolCount} tool(s)`);
if (bashOutput) {
console.log('✅ Got bash output - tools are working!');
}
} else {
console.log('❌ Agent did NOT use any tools');
console.log('\nAgent response (text only):');
for (const msg of messages) {
if (msg.info?.role === 'assistant') {
for (const part of msg.parts || []) {
if (part.type === 'text') {
console.log(part.text?.substring(0, 1000));
}
}
}
}
}
// Cleanup
console.log('\n5. Cleaning up...');
try {
await client.session.delete({ path: { id: sessionId } });
console.log(' Session deleted');
} catch {
console.log(' Could not delete session');
}
}
test().catch(console.error);