Implement scoped memory graph and refresh defaults

This commit is contained in:
Youzini-afk
2026-04-03 20:48:07 +08:00
parent fbd8b00f1f
commit c60f60f349
21 changed files with 1706 additions and 352 deletions

View File

@@ -5,6 +5,10 @@ import { DEFAULT_NODE_SCHEMA } from "../schema.js";
const coreEvent = {
id: "event-1",
type: "event",
scope: {
layer: "objective",
regionPrimary: "钟楼",
},
fields: {
summary: "艾琳在钟楼发现了地下入口",
participants: "艾琳",
@@ -14,21 +18,36 @@ const coreEvent = {
const recalledCharacter = {
id: "char-1",
type: "character",
type: "pov_memory",
scope: {
layer: "pov",
ownerType: "character",
ownerId: "艾琳",
ownerName: "艾琳",
regionPrimary: "钟楼",
},
fields: {
name: "艾琳",
state: "警觉并准备进入地下室",
goal: "调查钟楼秘密",
summary: "艾琳觉得地下室入口说明钟楼里有人长期活动",
belief: "这里藏着失踪案线索",
emotion: "警觉",
attitude: "必须立刻下去查看",
},
};
const recalledReflection = {
id: "reflection-1",
type: "reflection",
id: "user-pov-1",
type: "pov_memory",
scope: {
layer: "pov",
ownerType: "user",
ownerId: "玩家",
ownerName: "玩家",
},
fields: {
insight: "地下入口意味着先前的失踪案与钟楼存在长期关联",
trigger: "钟楼发现暗门",
suggestion: "后续优先追查地下通道与失踪人口名单",
summary: "玩家已经把钟楼和失踪案牢牢绑定起来了",
belief: "钟楼地下室肯定有更深的秘密",
emotion: "紧张",
attitude: "希望艾琳谨慎推进",
},
};
@@ -36,23 +55,21 @@ const text = formatInjection(
{
coreNodes: [coreEvent],
recallNodes: [recalledCharacter, recalledReflection],
groupedRecallNodes: {
state: [recalledCharacter],
episodic: [],
reflective: [recalledReflection],
rule: [],
other: [],
scopeBuckets: {
characterPov: [recalledCharacter],
userPov: [recalledReflection],
objectiveCurrentRegion: [coreEvent],
objectiveGlobal: [],
},
},
DEFAULT_NODE_SCHEMA,
);
assert.match(text, /\[Memory - Core\]/);
assert.match(text, /\[Memory - Character POV\]/);
assert.match(text, /\[Memory - User POV \/ Not Character Facts\]/);
assert.match(text, /不等于角色已知事实/);
assert.match(text, /\[Memory - Objective \/ Current Region\]/);
assert.match(text, /pov_memory_table:/);
assert.match(text, /event_table:/);
assert.match(text, /\[Memory - Recalled\]/);
assert.match(text, /## 当前状态记忆/);
assert.match(text, /## 反思与长期锚点/);
assert.match(text, /character_table:/);
assert.match(text, /reflection_table:/);
console.log("injector-format tests passed");