Files
sausage/host/js/undo-harness-test.ts
T

33 lines
2.2 KiB
TypeScript

// A faux model changes three independent files in one turn through the real coding tools.
import { BACKGROUND_CONTEXT as context } from '@earendil-works/chord/context';
import { createModels } from '@earendil-works/pi-ai/models';
import { fauxProvider, fauxAssistantMessage, fauxToolCall } from '@earendil-works/pi-ai/providers/faux';
import { Harness, createRegistry } from '@earendil-works/pi-durable';
import { CodingTools, environment } from './environment';
import { openStorage } from './sqlite';
import { exec } from './extensions';
const models = createModels(), faux = fauxProvider({tokensPerSecond:100000});
models.setProvider(faux.provider);
faux.setResponses([
fauxAssistantMessage([fauxToolCall('edit',{path:'a.txt',edits:[{oldText:'old',newText:'edited'}]},{id:'first'})],{stopReason:'toolUse'}),
fauxAssistantMessage([fauxToolCall('bash',{command:'echo changed > b.txt && git add b.txt && git commit -m changed'},{id:'second'})],{stopReason:'toolUse'}),
fauxAssistantMessage([fauxToolCall('write',{path:'c.txt',content:'written\n'},{id:'third'})],{stopReason:'toolUse'}),
fauxAssistantMessage('done'),
]);
const registry = createRegistry(); registry.install(CodingTools);
const harness = await Harness.open(await openStorage(globalThis.storagePath),{models,registry,
env:(target:any)=>environment(target.cwd,target.conversationId)},context);
const root = await harness.root(context,{agent:{model:{provider:'faux',modelId:'faux-1'},cwd:'/repo',extensions:[CodingTools]}});
harness.resume();
await (await root.submit({type:'input',content:'Change three files'},context)).wait(context);
await harness.waitForIdle(context);
const entries = (await root.watch(context)).value.entries;
if(JSON.stringify(entries).includes('"isError":true'))throw new Error(JSON.stringify(entries));
await harness.close(context);
const result = await exec(['sh','-c','echo extension > /extension.txt'],
{cwd:'/',extension:'test-extension',task:'background',conversations:['extension']});
if(result.code)throw new Error(result.stderr);
const triggered = await exec(['sh','-c','echo triggered > /triggered.txt'],
{cwd:'/',extension:'test-extension',toolCall:'extension-call',conversations:['extension']});
if(triggered.code)throw new Error(triggered.stderr);