import fs from 'fs';
import os from 'os';
import path from 'path';
import { WorkflowExecutor } from './src/vl/workflow-executor.js';
function assert(condition, message) {
if (!condition) throw new Error(message);
}
console.log('\nāā Workflow readFiles Context āā');
const workDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vlcode-workflow-readfiles-'));
fs.mkdirSync(path.join(workDir, 'Apps'), { recursive: true });
fs.writeFileSync(
path.join(workDir, 'Apps', 'Demo.vx'),
'// VL_VERSION:3.5\n\n \n\n',
'utf-8'
);
let captured = null;
try {
const executor = new WorkflowExecutor({ workDir, model: 'test-model' });
executor.client = {
messages: {
async create(params) {
captured = params;
return {
content: [{ type: 'text', text: '{"ok":true}' }],
usage: {},
stop_reason: 'end_turn',
model: 'test-model',
};
},
},
};
const adapter = executor._buildLLMAdapter();
await adapter.call({
readFiles: ['Apps/Demo.vx'],
messages: [{ role: 'user', content: 'Regenerate this app entry.' }],
output_config: { format: { type: 'json_object' } },
});
assert(Array.isArray(captured?.messages) && captured.messages.length >= 2, 'readFiles should prepend file context to the LLM messages');
assert(captured.messages[0].content.includes(''), 'prepended file context should include the requested path');
assert(captured.messages[0].content.includes('// VL_VERSION:3.5'), 'prepended file context should include current file content');
assert(captured.messages[1].content === 'Regenerate this app entry.', 'original user message should remain after the file context');
console.log('PASS test-workflow-read-files.js');
} finally {
fs.rmSync(workDir, { recursive: true, force: true });
}