Ground bot dialogue and add bounded conversational follow-ups
Core tests / core (push) Successful in 45s
Core tests / core (push) Successful in 45s
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
const {test}=require('node:test');
|
||||
const assert=require('node:assert/strict');
|
||||
const queue=require('../.test-build/conversation-store.js');
|
||||
const actualQueueSocialReply=queue.queueSocialReply;
|
||||
const ale=require('../.test-build/ale-store.js');
|
||||
require('../.test-build/community.js').communityTick=async()=>{};
|
||||
const {runConversationTick}=require('../.test-build/conversation.js');
|
||||
@@ -43,6 +44,7 @@ test('conversation failure, queued delivery, confirmed memory and replay safety'
|
||||
|
||||
test('social exchanges remember both residents only after confirmed reply and replays are harmless',async()=>{
|
||||
const a={id:'a',name:'A',status:'online',autonomy:{managed:true},memories:[],relationships:[],personality:{},race:'Orc',role:'Warrior'};
|
||||
a.world={at:Date.now()/1000,mapId:0,team:0,x:0,y:0};
|
||||
const b={...a,id:'b',name:'B',memories:[],relationships:[]};
|
||||
const state={revision:0,sequence:0,events:[],bots:[a,b],settings:{provider:'ollama',model:'test',brains:{enabled:false,residentMemoryLimit:5,residentMaxTokens:100}}};
|
||||
const store={load:async()=>state,save:async()=>{}};
|
||||
@@ -75,3 +77,25 @@ test('social exchanges remember both residents only after confirmed reply and re
|
||||
assert.equal(a.memories.length,1);assert.equal(b.memories.length,1);assert.equal(followups,1);
|
||||
}finally{global.fetch=originalFetch;}
|
||||
});
|
||||
|
||||
test('follow-ups alternate speakers, retain encounter deadline and stop at four lines or farewell',async()=>{
|
||||
const rows=[];const db={prepare:()=>({bind:(...args)=>({run:async()=>{rows.push(args);}})})};
|
||||
const createdAt=new Date().toISOString();
|
||||
for(let turn=0;turn<4;turn++)await actualQueueSocialReply(db,{id:'social-test'+':reply'.repeat(turn),createdAt,socialTurn:turn,speakerName:turn%2?'A':'B',zoneName:'Forest'},turn%2?'B':'A','Still looking for those last two.');
|
||||
assert.equal(rows.length,3);
|
||||
assert.deepEqual(rows.map(r=>r[4]),['social-reply','social-turn-2','social-turn-3']);
|
||||
assert.ok(rows.every(r=>r[1]===createdAt));
|
||||
assert.deepEqual(rows.map(r=>[r[2],r[6]]),[['A','B'],['B','A'],['A','B']]);
|
||||
await actualQueueSocialReply(db,{socialTurn:1,createdAt},'B','See you later!');
|
||||
await actualQueueSocialReply(db,{socialTurn:1,createdAt:new Date(Date.now()-121000).toISOString()},'B','Hello');
|
||||
assert.equal(rows.length,3);
|
||||
});
|
||||
test('busy social pair is rejected before spending inference',async()=>{
|
||||
const bot={id:'a',name:'A',status:'online',autonomy:{managed:true},world:{at:Date.now()/1000,mapId:0,team:0,x:0,y:0,humanControlled:true}};
|
||||
const state={bots:[bot,{...bot,id:'b',name:'B'}]};
|
||||
queue.pendingDeliveries=async()=>[];queue.cleanupConversations=async()=>{};
|
||||
queue.leaseConversation=async()=>({id:'social-busy',socialTurn:2,createdAt:new Date().toISOString(),speakerName:'B',selectedPlayer:'A',channel:'say',nearbyBots:['B']});
|
||||
let error='';queue.failConversation=async(_db,_id,e)=>{error=e;};
|
||||
await assert.rejects(runConversationTick({load:async()=>state},{},{}),/no longer available/);
|
||||
assert.match(error,/no longer available/);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user