@ai-rpg-engine/modules 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/belief-provenance.d.ts +41 -0
- package/dist/belief-provenance.d.ts.map +1 -0
- package/dist/belief-provenance.js +254 -0
- package/dist/belief-provenance.js.map +1 -0
- package/dist/belief-provenance.test.d.ts +2 -0
- package/dist/belief-provenance.test.d.ts.map +1 -0
- package/dist/belief-provenance.test.js +139 -0
- package/dist/belief-provenance.test.js.map +1 -0
- package/dist/cognition-core.d.ts +89 -0
- package/dist/cognition-core.d.ts.map +1 -0
- package/dist/cognition-core.js +370 -0
- package/dist/cognition-core.js.map +1 -0
- package/dist/cognition-core.test.d.ts +2 -0
- package/dist/cognition-core.test.d.ts.map +1 -0
- package/dist/cognition-core.test.js +215 -0
- package/dist/cognition-core.test.js.map +1 -0
- package/dist/combat-core.d.ts +11 -0
- package/dist/combat-core.d.ts.map +1 -0
- package/dist/combat-core.js +152 -0
- package/dist/combat-core.js.map +1 -0
- package/dist/dialogue-core.d.ts +10 -0
- package/dist/dialogue-core.d.ts.map +1 -0
- package/dist/dialogue-core.js +172 -0
- package/dist/dialogue-core.js.map +1 -0
- package/dist/district-core.d.ts +59 -0
- package/dist/district-core.d.ts.map +1 -0
- package/dist/district-core.js +224 -0
- package/dist/district-core.js.map +1 -0
- package/dist/district-core.test.d.ts +2 -0
- package/dist/district-core.test.d.ts.map +1 -0
- package/dist/district-core.test.js +157 -0
- package/dist/district-core.test.js.map +1 -0
- package/dist/environment-core.d.ts +78 -0
- package/dist/environment-core.d.ts.map +1 -0
- package/dist/environment-core.js +229 -0
- package/dist/environment-core.js.map +1 -0
- package/dist/environment-core.test.d.ts +2 -0
- package/dist/environment-core.test.d.ts.map +1 -0
- package/dist/environment-core.test.js +252 -0
- package/dist/environment-core.test.js.map +1 -0
- package/dist/faction-cognition.d.ts +39 -0
- package/dist/faction-cognition.d.ts.map +1 -0
- package/dist/faction-cognition.js +139 -0
- package/dist/faction-cognition.js.map +1 -0
- package/dist/faction-cognition.test.d.ts +2 -0
- package/dist/faction-cognition.test.d.ts.map +1 -0
- package/dist/faction-cognition.test.js +166 -0
- package/dist/faction-cognition.test.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory-core.d.ts +10 -0
- package/dist/inventory-core.d.ts.map +1 -0
- package/dist/inventory-core.js +69 -0
- package/dist/inventory-core.js.map +1 -0
- package/dist/knowledge-decay.test.d.ts +2 -0
- package/dist/knowledge-decay.test.d.ts.map +1 -0
- package/dist/knowledge-decay.test.js +143 -0
- package/dist/knowledge-decay.test.js.map +1 -0
- package/dist/narrative-authority.d.ts +40 -0
- package/dist/narrative-authority.d.ts.map +1 -0
- package/dist/narrative-authority.js +89 -0
- package/dist/narrative-authority.js.map +1 -0
- package/dist/narrative-authority.test.d.ts +2 -0
- package/dist/narrative-authority.test.d.ts.map +1 -0
- package/dist/narrative-authority.test.js +237 -0
- package/dist/narrative-authority.test.js.map +1 -0
- package/dist/observer-presentation.d.ts +74 -0
- package/dist/observer-presentation.d.ts.map +1 -0
- package/dist/observer-presentation.js +277 -0
- package/dist/observer-presentation.js.map +1 -0
- package/dist/observer-presentation.test.d.ts +2 -0
- package/dist/observer-presentation.test.d.ts.map +1 -0
- package/dist/observer-presentation.test.js +156 -0
- package/dist/observer-presentation.test.js.map +1 -0
- package/dist/perception-filter.d.ts +46 -0
- package/dist/perception-filter.d.ts.map +1 -0
- package/dist/perception-filter.js +281 -0
- package/dist/perception-filter.js.map +1 -0
- package/dist/perception-filter.test.d.ts +2 -0
- package/dist/perception-filter.test.d.ts.map +1 -0
- package/dist/perception-filter.test.js +308 -0
- package/dist/perception-filter.test.js.map +1 -0
- package/dist/progression-core.d.ts +63 -0
- package/dist/progression-core.d.ts.map +1 -0
- package/dist/progression-core.js +232 -0
- package/dist/progression-core.js.map +1 -0
- package/dist/progression-core.test.d.ts +2 -0
- package/dist/progression-core.test.d.ts.map +1 -0
- package/dist/progression-core.test.js +328 -0
- package/dist/progression-core.test.js.map +1 -0
- package/dist/rumor-propagation.d.ts +31 -0
- package/dist/rumor-propagation.d.ts.map +1 -0
- package/dist/rumor-propagation.js +180 -0
- package/dist/rumor-propagation.js.map +1 -0
- package/dist/rumor-propagation.test.d.ts +2 -0
- package/dist/rumor-propagation.test.d.ts.map +1 -0
- package/dist/rumor-propagation.test.js +176 -0
- package/dist/rumor-propagation.test.js.map +1 -0
- package/dist/simulation-inspector.d.ts +78 -0
- package/dist/simulation-inspector.d.ts.map +1 -0
- package/dist/simulation-inspector.js +263 -0
- package/dist/simulation-inspector.js.map +1 -0
- package/dist/simulation-inspector.test.d.ts +2 -0
- package/dist/simulation-inspector.test.d.ts.map +1 -0
- package/dist/simulation-inspector.test.js +152 -0
- package/dist/simulation-inspector.test.js.map +1 -0
- package/dist/status-core.d.ts +17 -0
- package/dist/status-core.d.ts.map +1 -0
- package/dist/status-core.js +106 -0
- package/dist/status-core.js.map +1 -0
- package/dist/traversal-core.d.ts +3 -0
- package/dist/traversal-core.d.ts.map +1 -0
- package/dist/traversal-core.js +93 -0
- package/dist/traversal-core.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { EngineModule, WorldState, ScalarValue } from '@ai-rpg-engine/core';
|
|
2
|
+
export type TraceStep = {
|
|
3
|
+
tick: number;
|
|
4
|
+
type: 'source-event' | 'perceived' | 'missed' | 'belief-formed' | 'rumor-scheduled' | 'rumor-delivered' | 'faction-belief-updated' | 'decayed' | 'reinforced' | 'pruned';
|
|
5
|
+
description: string;
|
|
6
|
+
data: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
export type BeliefTrace = {
|
|
9
|
+
subject: string;
|
|
10
|
+
key: string;
|
|
11
|
+
holder: {
|
|
12
|
+
type: 'entity';
|
|
13
|
+
id: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'faction';
|
|
16
|
+
id: string;
|
|
17
|
+
};
|
|
18
|
+
currentValue: ScalarValue | undefined;
|
|
19
|
+
currentConfidence: number;
|
|
20
|
+
chain: TraceStep[];
|
|
21
|
+
};
|
|
22
|
+
export declare function createBeliefProvenance(): EngineModule;
|
|
23
|
+
/**
|
|
24
|
+
* Trace the provenance of an entity's belief.
|
|
25
|
+
* Reconstructs the chain: source event → perception → belief formation → rumor → faction.
|
|
26
|
+
*/
|
|
27
|
+
export declare function traceEntityBelief(world: WorldState, entityId: string, subject: string, key: string): BeliefTrace;
|
|
28
|
+
/**
|
|
29
|
+
* Trace the provenance of a faction's belief.
|
|
30
|
+
* Reconstructs: source events → entity perceptions → rumors → faction belief.
|
|
31
|
+
*/
|
|
32
|
+
export declare function traceFactionBelief(world: WorldState, factionId: string, subject: string, key: string): BeliefTrace;
|
|
33
|
+
/**
|
|
34
|
+
* Trace all beliefs held about a subject across all entities and factions.
|
|
35
|
+
*/
|
|
36
|
+
export declare function traceSubject(world: WorldState, subject: string): BeliefTrace[];
|
|
37
|
+
/**
|
|
38
|
+
* Format a belief trace as a human-readable forensic narrative.
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatBeliefTrace(trace: BeliefTrace): string;
|
|
41
|
+
//# sourceMappingURL=belief-provenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"belief-provenance.d.ts","sourceRoot":"","sources":["../src/belief-provenance.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAEV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAY7B,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,eAAe,GAC3D,iBAAiB,GAAG,iBAAiB,GAAG,wBAAwB,GAChE,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,YAAY,EAAE,WAAW,GAAG,SAAS,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC;AAIF,wBAAgB,sBAAsB,IAAI,YAAY,CAWrD;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,WAAW,CA+Fb;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,WAAW,CAgEb;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,GACd,WAAW,EAAE,CA6Bf;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAuB5D"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// belief-provenance — end-to-end belief trace reconstruction
|
|
2
|
+
// Answers "why does X believe Y?" by correlating data from perception,
|
|
3
|
+
// cognition, rumor, and faction modules. No new state — reads existing logs.
|
|
4
|
+
import { getCognition, getBelief } from './cognition-core.js';
|
|
5
|
+
import { getPerceptionLog } from './perception-filter.js';
|
|
6
|
+
import { getFactionCognition, getFactionBelief } from './faction-cognition.js';
|
|
7
|
+
import { getRumorLog, getRumorsToFaction } from './rumor-propagation.js';
|
|
8
|
+
// --- Module ---
|
|
9
|
+
export function createBeliefProvenance() {
|
|
10
|
+
return {
|
|
11
|
+
id: 'belief-provenance',
|
|
12
|
+
version: '0.1.0',
|
|
13
|
+
dependsOn: ['cognition-core'],
|
|
14
|
+
register(_ctx) {
|
|
15
|
+
// Pure query module — no state, no event listeners
|
|
16
|
+
// All trace reconstruction happens via exported functions
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// --- Trace API ---
|
|
21
|
+
/**
|
|
22
|
+
* Trace the provenance of an entity's belief.
|
|
23
|
+
* Reconstructs the chain: source event → perception → belief formation → rumor → faction.
|
|
24
|
+
*/
|
|
25
|
+
export function traceEntityBelief(world, entityId, subject, key) {
|
|
26
|
+
const cognition = getCognition(world, entityId);
|
|
27
|
+
const belief = getBelief(cognition, subject, key);
|
|
28
|
+
const chain = [];
|
|
29
|
+
// Step 1: Find source events involving the subject
|
|
30
|
+
const relevantEvents = findRelevantEvents(world, subject, key);
|
|
31
|
+
for (const event of relevantEvents) {
|
|
32
|
+
chain.push({
|
|
33
|
+
tick: event.tick,
|
|
34
|
+
type: 'source-event',
|
|
35
|
+
description: `${event.type} involving ${subject}`,
|
|
36
|
+
data: {
|
|
37
|
+
eventId: event.id,
|
|
38
|
+
eventType: event.type,
|
|
39
|
+
actorId: event.actorId,
|
|
40
|
+
targetIds: event.targetIds,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
// Step 2: Check if this entity perceived the event
|
|
44
|
+
if (world.modules['perception-filter']) {
|
|
45
|
+
const perceptionLog = getPerceptionLog(world, entityId);
|
|
46
|
+
const perception = perceptionLog.find((p) => p.eventId === event.id);
|
|
47
|
+
if (perception) {
|
|
48
|
+
chain.push({
|
|
49
|
+
tick: perception.tick,
|
|
50
|
+
type: perception.detected ? 'perceived' : 'missed',
|
|
51
|
+
description: perception.detected
|
|
52
|
+
? `${entityId} detected via ${perception.sense} (clarity: ${perception.clarity.toFixed(2)})`
|
|
53
|
+
: `${entityId} missed via ${perception.sense} (clarity: ${perception.clarity.toFixed(2)})`,
|
|
54
|
+
data: {
|
|
55
|
+
eventId: event.id,
|
|
56
|
+
entityId,
|
|
57
|
+
sense: perception.sense,
|
|
58
|
+
clarity: perception.clarity,
|
|
59
|
+
interpretation: perception.interpretation,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Step 3: Record belief formation
|
|
66
|
+
if (belief) {
|
|
67
|
+
chain.push({
|
|
68
|
+
tick: belief.tick,
|
|
69
|
+
type: 'belief-formed',
|
|
70
|
+
description: `${entityId} believes ${subject}.${key} = ${belief.value} (confidence: ${belief.confidence.toFixed(2)}, source: ${belief.source})`,
|
|
71
|
+
data: {
|
|
72
|
+
entityId,
|
|
73
|
+
subject: belief.subject,
|
|
74
|
+
key: belief.key,
|
|
75
|
+
value: belief.value,
|
|
76
|
+
confidence: belief.confidence,
|
|
77
|
+
source: belief.source,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Step 4: Check for rumor propagation from this entity
|
|
82
|
+
if (world.modules['rumor-propagation']) {
|
|
83
|
+
const rumors = getRumorLog(world).filter((r) => r.sourceEntityId === entityId && r.subject === subject && r.key === key);
|
|
84
|
+
for (const rumor of rumors) {
|
|
85
|
+
chain.push({
|
|
86
|
+
tick: rumor.originTick,
|
|
87
|
+
type: 'rumor-scheduled',
|
|
88
|
+
description: `${entityId} rumored ${subject}.${key} to faction ${rumor.targetFactionId} (distortion: ${rumor.distortion.toFixed(3)})`,
|
|
89
|
+
data: {
|
|
90
|
+
rumorId: rumor.id,
|
|
91
|
+
sourceEntityId: rumor.sourceEntityId,
|
|
92
|
+
targetFactionId: rumor.targetFactionId,
|
|
93
|
+
confidence: rumor.confidence,
|
|
94
|
+
distortion: rumor.distortion,
|
|
95
|
+
hops: rumor.hops,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Sort chain chronologically
|
|
101
|
+
chain.sort((a, b) => a.tick - b.tick);
|
|
102
|
+
return {
|
|
103
|
+
subject,
|
|
104
|
+
key,
|
|
105
|
+
holder: { type: 'entity', id: entityId },
|
|
106
|
+
currentValue: belief?.value,
|
|
107
|
+
currentConfidence: belief?.confidence ?? 0,
|
|
108
|
+
chain,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Trace the provenance of a faction's belief.
|
|
113
|
+
* Reconstructs: source events → entity perceptions → rumors → faction belief.
|
|
114
|
+
*/
|
|
115
|
+
export function traceFactionBelief(world, factionId, subject, key) {
|
|
116
|
+
const factionCog = getFactionCognition(world, factionId);
|
|
117
|
+
const factionBelief = getFactionBelief(factionCog, subject, key);
|
|
118
|
+
const chain = [];
|
|
119
|
+
// Find rumors that contributed to this faction belief
|
|
120
|
+
const rumors = getRumorsToFaction(world, factionId).filter((r) => r.subject === subject && r.key === key);
|
|
121
|
+
for (const rumor of rumors) {
|
|
122
|
+
// Trace back to the entity's belief and perception
|
|
123
|
+
const entityTrace = traceEntityBelief(world, rumor.sourceEntityId, subject, key);
|
|
124
|
+
// Include entity chain steps (avoiding duplicates)
|
|
125
|
+
for (const step of entityTrace.chain) {
|
|
126
|
+
if (!chain.find((s) => s.tick === step.tick && s.type === step.type && s.data.entityId === step.data.entityId)) {
|
|
127
|
+
chain.push(step);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Add rumor delivery
|
|
131
|
+
chain.push({
|
|
132
|
+
tick: rumor.originTick + 1, // approximate delivery tick
|
|
133
|
+
type: 'rumor-delivered',
|
|
134
|
+
description: `Rumor from ${rumor.sourceEntityId} delivered to faction ${factionId} (confidence: ${rumor.confidence.toFixed(2)}, distortion: ${rumor.distortion.toFixed(3)})`,
|
|
135
|
+
data: {
|
|
136
|
+
rumorId: rumor.id,
|
|
137
|
+
sourceEntityId: rumor.sourceEntityId,
|
|
138
|
+
factionId,
|
|
139
|
+
confidence: rumor.confidence,
|
|
140
|
+
distortion: rumor.distortion,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Add faction belief state
|
|
145
|
+
if (factionBelief) {
|
|
146
|
+
chain.push({
|
|
147
|
+
tick: factionBelief.lastUpdateTick,
|
|
148
|
+
type: 'faction-belief-updated',
|
|
149
|
+
description: `Faction ${factionId} believes ${subject}.${key} = ${factionBelief.value} (confidence: ${factionBelief.confidence.toFixed(2)}, ${factionBelief.sourceEntities.length} sources)`,
|
|
150
|
+
data: {
|
|
151
|
+
factionId,
|
|
152
|
+
subject: factionBelief.subject,
|
|
153
|
+
key: factionBelief.key,
|
|
154
|
+
value: factionBelief.value,
|
|
155
|
+
confidence: factionBelief.confidence,
|
|
156
|
+
sourceEntities: factionBelief.sourceEntities,
|
|
157
|
+
distortion: factionBelief.distortion,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// Sort chronologically
|
|
162
|
+
chain.sort((a, b) => a.tick - b.tick);
|
|
163
|
+
return {
|
|
164
|
+
subject,
|
|
165
|
+
key,
|
|
166
|
+
holder: { type: 'faction', id: factionId },
|
|
167
|
+
currentValue: factionBelief?.value,
|
|
168
|
+
currentConfidence: factionBelief?.confidence ?? 0,
|
|
169
|
+
chain,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Trace all beliefs held about a subject across all entities and factions.
|
|
174
|
+
*/
|
|
175
|
+
export function traceSubject(world, subject) {
|
|
176
|
+
const traces = [];
|
|
177
|
+
// Check all entity cognitions
|
|
178
|
+
const cogStates = world.modules['cognition-core']?.entityCognition ?? {};
|
|
179
|
+
for (const [entityId, cog] of Object.entries(cogStates)) {
|
|
180
|
+
const beliefs = cog.beliefs.filter((b) => b.subject === subject);
|
|
181
|
+
for (const belief of beliefs) {
|
|
182
|
+
traces.push(traceEntityBelief(world, entityId, subject, belief.key));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Check all faction beliefs
|
|
186
|
+
if (world.modules['faction-cognition']) {
|
|
187
|
+
const factionState = world.modules['faction-cognition'];
|
|
188
|
+
for (const [factionId, fCog] of Object.entries(factionState.factionCognition)) {
|
|
189
|
+
const beliefs = fCog.beliefs.filter((b) => b.subject === subject);
|
|
190
|
+
for (const belief of beliefs) {
|
|
191
|
+
traces.push(traceFactionBelief(world, factionId, subject, belief.key));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return traces;
|
|
196
|
+
}
|
|
197
|
+
// --- Formatting (B3) ---
|
|
198
|
+
/**
|
|
199
|
+
* Format a belief trace as a human-readable forensic narrative.
|
|
200
|
+
*/
|
|
201
|
+
export function formatBeliefTrace(trace) {
|
|
202
|
+
const lines = [];
|
|
203
|
+
const holderLabel = trace.holder.type === 'entity'
|
|
204
|
+
? `Entity ${trace.holder.id}`
|
|
205
|
+
: `Faction ${trace.holder.id}`;
|
|
206
|
+
lines.push(`Belief Trace: ${holderLabel}`);
|
|
207
|
+
lines.push(` Subject: ${trace.subject}`);
|
|
208
|
+
lines.push(` Key: ${trace.key}`);
|
|
209
|
+
lines.push(` Current: ${trace.currentValue ?? 'none'} (confidence: ${trace.currentConfidence.toFixed(2)})`);
|
|
210
|
+
lines.push('');
|
|
211
|
+
lines.push(' Chain:');
|
|
212
|
+
for (const step of trace.chain) {
|
|
213
|
+
const icon = getStepIcon(step.type);
|
|
214
|
+
lines.push(` [tick ${step.tick}] ${icon} ${step.description}`);
|
|
215
|
+
}
|
|
216
|
+
if (trace.chain.length === 0) {
|
|
217
|
+
lines.push(' (no trace data available)');
|
|
218
|
+
}
|
|
219
|
+
return lines.join('\n');
|
|
220
|
+
}
|
|
221
|
+
function getStepIcon(type) {
|
|
222
|
+
switch (type) {
|
|
223
|
+
case 'source-event': return 'EVENT';
|
|
224
|
+
case 'perceived': return 'SEEN';
|
|
225
|
+
case 'missed': return 'MISSED';
|
|
226
|
+
case 'belief-formed': return 'BELIEF';
|
|
227
|
+
case 'rumor-scheduled': return 'RUMOR>';
|
|
228
|
+
case 'rumor-delivered': return 'RUMOR<';
|
|
229
|
+
case 'faction-belief-updated': return 'FACTION';
|
|
230
|
+
case 'decayed': return 'DECAY';
|
|
231
|
+
case 'reinforced': return 'REINF';
|
|
232
|
+
case 'pruned': return 'PRUNED';
|
|
233
|
+
default: return '???';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// --- Internal ---
|
|
237
|
+
function findRelevantEvents(world, subject, key) {
|
|
238
|
+
return world.eventLog.filter((event) => {
|
|
239
|
+
// Events where the subject is involved
|
|
240
|
+
if (event.actorId === subject)
|
|
241
|
+
return true;
|
|
242
|
+
if (event.targetIds?.includes(subject))
|
|
243
|
+
return true;
|
|
244
|
+
// Events with matching payload fields
|
|
245
|
+
if (event.payload.entityId === subject)
|
|
246
|
+
return true;
|
|
247
|
+
if (event.payload.attackerId === subject)
|
|
248
|
+
return true;
|
|
249
|
+
if (event.payload.targetId === subject)
|
|
250
|
+
return true;
|
|
251
|
+
return false;
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=belief-provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"belief-provenance.js","sourceRoot":"","sources":["../src/belief-provenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"belief-provenance.test.d.ts","sourceRoot":"","sources":["../src/belief-provenance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { Engine } from '@ai-rpg-engine/core';
|
|
3
|
+
import { traversalCore, combatCore, createCognitionCore, createPerceptionFilter, createEnvironmentCore, createFactionCognition, createRumorPropagation, createBeliefProvenance, traceEntityBelief, traceFactionBelief, traceSubject, formatBeliefTrace, } from './index.js';
|
|
4
|
+
const manifest = {
|
|
5
|
+
id: 'provenance-test', title: '', version: '0.1.0',
|
|
6
|
+
engineVersion: '0.1.0', ruleset: 'test', modules: [], contentPacks: [],
|
|
7
|
+
};
|
|
8
|
+
const zones = [
|
|
9
|
+
{ id: 'hall', roomId: 'r1', name: 'Hall', tags: [], neighbors: ['chamber'], light: 5 },
|
|
10
|
+
{ id: 'chamber', roomId: 'r1', name: 'Chamber', tags: [], neighbors: ['hall'], light: 3 },
|
|
11
|
+
];
|
|
12
|
+
const player = {
|
|
13
|
+
id: 'player', blueprintId: 'p', type: 'player', name: 'Player',
|
|
14
|
+
tags: ['player'], stats: { vigor: 5, instinct: 6 }, resources: { hp: 20, stamina: 8 },
|
|
15
|
+
statuses: [], zoneId: 'hall',
|
|
16
|
+
};
|
|
17
|
+
const guard = {
|
|
18
|
+
id: 'guard', blueprintId: 'g', type: 'enemy', name: 'Guard',
|
|
19
|
+
tags: ['enemy'], stats: { vigor: 4, instinct: 5 }, resources: { hp: 15, stamina: 4 },
|
|
20
|
+
statuses: [], zoneId: 'chamber',
|
|
21
|
+
ai: { profileId: 'aggressive', goals: [], fears: [], alertLevel: 0, knowledge: {} },
|
|
22
|
+
};
|
|
23
|
+
function createTestEngine() {
|
|
24
|
+
const engine = new Engine({
|
|
25
|
+
manifest,
|
|
26
|
+
seed: 42,
|
|
27
|
+
modules: [
|
|
28
|
+
traversalCore,
|
|
29
|
+
combatCore,
|
|
30
|
+
createCognitionCore(),
|
|
31
|
+
createPerceptionFilter(),
|
|
32
|
+
createEnvironmentCore(),
|
|
33
|
+
createFactionCognition({
|
|
34
|
+
factions: [{ factionId: 'patrol', entityIds: ['guard'], cohesion: 0.9 }],
|
|
35
|
+
}),
|
|
36
|
+
createRumorPropagation({ propagationDelay: 1 }),
|
|
37
|
+
createBeliefProvenance(),
|
|
38
|
+
],
|
|
39
|
+
});
|
|
40
|
+
for (const zone of zones)
|
|
41
|
+
engine.store.addZone(zone);
|
|
42
|
+
engine.store.addEntity({ ...player });
|
|
43
|
+
engine.store.addEntity({ ...guard });
|
|
44
|
+
engine.store.state.playerId = 'player';
|
|
45
|
+
engine.store.state.locationId = 'hall';
|
|
46
|
+
return engine;
|
|
47
|
+
}
|
|
48
|
+
describe('Belief Provenance', () => {
|
|
49
|
+
it('traces direct perception belief', () => {
|
|
50
|
+
const engine = createTestEngine();
|
|
51
|
+
// Player enters guard's zone → guard perceives player
|
|
52
|
+
engine.submitAction('move', { targetIds: ['chamber'] });
|
|
53
|
+
const trace = traceEntityBelief(engine.world, 'guard', 'player', 'present');
|
|
54
|
+
expect(trace.holder).toEqual({ type: 'entity', id: 'guard' });
|
|
55
|
+
expect(trace.subject).toBe('player');
|
|
56
|
+
expect(trace.key).toBe('present');
|
|
57
|
+
expect(trace.currentValue).toBe(true);
|
|
58
|
+
expect(trace.chain.length).toBeGreaterThan(0);
|
|
59
|
+
// Should have source-event and perceived steps
|
|
60
|
+
const types = trace.chain.map((s) => s.type);
|
|
61
|
+
expect(types).toContain('source-event');
|
|
62
|
+
expect(types).toContain('belief-formed');
|
|
63
|
+
});
|
|
64
|
+
it('traces combat belief through perception', () => {
|
|
65
|
+
const engine = createTestEngine();
|
|
66
|
+
engine.store.state.entities['player'].zoneId = 'chamber';
|
|
67
|
+
engine.store.state.locationId = 'chamber';
|
|
68
|
+
engine.submitAction('attack', { targetIds: ['guard'] });
|
|
69
|
+
const trace = traceEntityBelief(engine.world, 'guard', 'player', 'hostile');
|
|
70
|
+
expect(trace.currentValue).toBe(true);
|
|
71
|
+
expect(trace.currentConfidence).toBeGreaterThan(0);
|
|
72
|
+
expect(trace.chain.some((s) => s.type === 'source-event')).toBe(true);
|
|
73
|
+
expect(trace.chain.some((s) => s.type === 'belief-formed')).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
it('traces faction belief through rumor chain', () => {
|
|
76
|
+
const engine = createTestEngine();
|
|
77
|
+
engine.store.state.entities['player'].zoneId = 'chamber';
|
|
78
|
+
engine.store.state.locationId = 'chamber';
|
|
79
|
+
// Attack guard → guard gets hostile belief → rumor scheduled
|
|
80
|
+
engine.submitAction('attack', { targetIds: ['guard'] });
|
|
81
|
+
// Advance ticks to deliver rumor
|
|
82
|
+
engine.submitAction('faction-tick');
|
|
83
|
+
engine.submitAction('faction-tick');
|
|
84
|
+
const trace = traceFactionBelief(engine.world, 'patrol', 'player', 'hostile');
|
|
85
|
+
expect(trace.holder).toEqual({ type: 'faction', id: 'patrol' });
|
|
86
|
+
expect(trace.currentValue).toBe(true);
|
|
87
|
+
expect(trace.currentConfidence).toBeGreaterThan(0);
|
|
88
|
+
const types = trace.chain.map((s) => s.type);
|
|
89
|
+
expect(types).toContain('rumor-scheduled');
|
|
90
|
+
expect(types).toContain('rumor-delivered');
|
|
91
|
+
expect(types).toContain('faction-belief-updated');
|
|
92
|
+
});
|
|
93
|
+
it('traceSubject finds all beliefs about a subject', () => {
|
|
94
|
+
const engine = createTestEngine();
|
|
95
|
+
engine.store.state.entities['player'].zoneId = 'chamber';
|
|
96
|
+
engine.store.state.locationId = 'chamber';
|
|
97
|
+
engine.submitAction('attack', { targetIds: ['guard'] });
|
|
98
|
+
engine.submitAction('faction-tick');
|
|
99
|
+
engine.submitAction('faction-tick');
|
|
100
|
+
const traces = traceSubject(engine.world, 'player');
|
|
101
|
+
expect(traces.length).toBeGreaterThan(0);
|
|
102
|
+
// Should have both entity and faction traces
|
|
103
|
+
const entityTraces = traces.filter((t) => t.holder.type === 'entity');
|
|
104
|
+
const factionTraces = traces.filter((t) => t.holder.type === 'faction');
|
|
105
|
+
expect(entityTraces.length).toBeGreaterThan(0);
|
|
106
|
+
expect(factionTraces.length).toBeGreaterThan(0);
|
|
107
|
+
});
|
|
108
|
+
it('formatBeliefTrace produces readable output', () => {
|
|
109
|
+
const engine = createTestEngine();
|
|
110
|
+
engine.store.state.entities['player'].zoneId = 'chamber';
|
|
111
|
+
engine.store.state.locationId = 'chamber';
|
|
112
|
+
engine.submitAction('attack', { targetIds: ['guard'] });
|
|
113
|
+
const trace = traceEntityBelief(engine.world, 'guard', 'player', 'hostile');
|
|
114
|
+
const formatted = formatBeliefTrace(trace);
|
|
115
|
+
expect(formatted).toContain('Belief Trace: Entity guard');
|
|
116
|
+
expect(formatted).toContain('Subject: player');
|
|
117
|
+
expect(formatted).toContain('Key: hostile');
|
|
118
|
+
expect(formatted).toContain('Chain:');
|
|
119
|
+
expect(formatted).toContain('EVENT');
|
|
120
|
+
});
|
|
121
|
+
it('handles missing belief gracefully', () => {
|
|
122
|
+
const engine = createTestEngine();
|
|
123
|
+
const trace = traceEntityBelief(engine.world, 'guard', 'nonexistent', 'unknown');
|
|
124
|
+
expect(trace.currentValue).toBeUndefined();
|
|
125
|
+
expect(trace.currentConfidence).toBe(0);
|
|
126
|
+
expect(trace.chain.length).toBe(0);
|
|
127
|
+
});
|
|
128
|
+
it('chain is sorted chronologically', () => {
|
|
129
|
+
const engine = createTestEngine();
|
|
130
|
+
engine.store.state.entities['player'].zoneId = 'chamber';
|
|
131
|
+
engine.store.state.locationId = 'chamber';
|
|
132
|
+
engine.submitAction('attack', { targetIds: ['guard'] });
|
|
133
|
+
const trace = traceEntityBelief(engine.world, 'guard', 'player', 'hostile');
|
|
134
|
+
for (let i = 1; i < trace.chain.length; i++) {
|
|
135
|
+
expect(trace.chain[i].tick).toBeGreaterThanOrEqual(trace.chain[i - 1].tick);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=belief-provenance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"belief-provenance.test.js","sourceRoot":"","sources":["../src/belief-provenance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EACL,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,GAGlB,MAAM,YAAY,CAAC;AAEpB,MAAM,QAAQ,GAAiB;IAC7B,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO;IAClD,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE;CACvE,CAAC;AAEF,MAAM,KAAK,GAAgB;IACzB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IACtF,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;CAC1F,CAAC;AAEF,MAAM,MAAM,GAAgB;IAC1B,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;IAC9D,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;IACrF,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM;CAC7B,CAAC;AAEF,MAAM,KAAK,GAAgB;IACzB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO;IAC3D,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;IACpF,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS;IAC/B,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;CACpF,CAAC;AAEF,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,QAAQ;QACR,IAAI,EAAE,EAAE;QACR,OAAO,EAAE;YACP,aAAa;YACb,UAAU;YACV,mBAAmB,EAAE;YACrB,sBAAsB,EAAE;YACxB,qBAAqB,EAAE;YACvB,sBAAsB,CAAC;gBACrB,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;aACzE,CAAC;YACF,sBAAsB,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;YAC/C,sBAAsB,EAAE;SACzB;KACF,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;IAEvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAElC,sDAAsD;QACtD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE9C,+CAA+C;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE1C,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE1C,6DAA6D;QAC7D,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxD,iCAAiC;QACjC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAEpC,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE1C,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACtE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACxE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE1C,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAEjF,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE1C,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { EngineModule, EntityState, WorldState, ScalarValue } from '@ai-rpg-engine/core';
|
|
2
|
+
export type Belief = {
|
|
3
|
+
subject: string;
|
|
4
|
+
key: string;
|
|
5
|
+
value: ScalarValue;
|
|
6
|
+
confidence: number;
|
|
7
|
+
source: string;
|
|
8
|
+
tick: number;
|
|
9
|
+
};
|
|
10
|
+
export type Memory = {
|
|
11
|
+
id: string;
|
|
12
|
+
type: string;
|
|
13
|
+
tick: number;
|
|
14
|
+
entityId?: string;
|
|
15
|
+
zoneId?: string;
|
|
16
|
+
data: Record<string, ScalarValue>;
|
|
17
|
+
};
|
|
18
|
+
export type BeliefDecayConfig = {
|
|
19
|
+
/** Base decay rate per tick (default: 0.02) */
|
|
20
|
+
baseRate: number;
|
|
21
|
+
/** Minimum confidence before belief is pruned (default: 0.05) */
|
|
22
|
+
pruneThreshold: number;
|
|
23
|
+
/** Environmental instability multiplier (default: 0.5) */
|
|
24
|
+
instabilityFactor: number;
|
|
25
|
+
};
|
|
26
|
+
export type CognitionState = {
|
|
27
|
+
beliefs: Belief[];
|
|
28
|
+
memories: Memory[];
|
|
29
|
+
currentIntent: string | null;
|
|
30
|
+
morale: number;
|
|
31
|
+
suspicion: number;
|
|
32
|
+
};
|
|
33
|
+
export type PerceptionCheck = {
|
|
34
|
+
/** Can the observer detect the target? */
|
|
35
|
+
observerId: string;
|
|
36
|
+
targetId: string;
|
|
37
|
+
/** Detection difficulty (higher = harder to detect) */
|
|
38
|
+
difficulty: number;
|
|
39
|
+
/** What stat governs perception for this check */
|
|
40
|
+
stat: string;
|
|
41
|
+
/** Environment modifiers */
|
|
42
|
+
modifiers: {
|
|
43
|
+
source: string;
|
|
44
|
+
value: number;
|
|
45
|
+
}[];
|
|
46
|
+
};
|
|
47
|
+
export type PerceptionResult = {
|
|
48
|
+
detected: boolean;
|
|
49
|
+
roll: number;
|
|
50
|
+
threshold: number;
|
|
51
|
+
observerId: string;
|
|
52
|
+
targetId: string;
|
|
53
|
+
};
|
|
54
|
+
export type IntentOption = {
|
|
55
|
+
verb: string;
|
|
56
|
+
targetIds?: string[];
|
|
57
|
+
priority: number;
|
|
58
|
+
reason: string;
|
|
59
|
+
};
|
|
60
|
+
export type IntentProfile = {
|
|
61
|
+
id: string;
|
|
62
|
+
/** Generate possible intents given entity state and cognition */
|
|
63
|
+
evaluate: (entity: EntityState, cognition: CognitionState, world: WorldState) => IntentOption[];
|
|
64
|
+
};
|
|
65
|
+
export type CognitionCoreConfig = {
|
|
66
|
+
profiles?: IntentProfile[];
|
|
67
|
+
decay?: Partial<BeliefDecayConfig>;
|
|
68
|
+
};
|
|
69
|
+
export declare function createCognitionCore(configOrProfiles?: CognitionCoreConfig | IntentProfile[]): EngineModule;
|
|
70
|
+
export declare function getCognition(world: WorldState, entityId: string): CognitionState;
|
|
71
|
+
export declare function setBelief(cognition: CognitionState, subject: string, key: string, value: ScalarValue, confidence: number, source: string, tick: number): void;
|
|
72
|
+
export declare function getBelief(cognition: CognitionState, subject: string, key: string): Belief | undefined;
|
|
73
|
+
export declare function getBeliefValue(cognition: CognitionState, subject: string, key: string): ScalarValue | undefined;
|
|
74
|
+
/** Does this entity believe something to be true? */
|
|
75
|
+
export declare function believes(cognition: CognitionState, subject: string, key: string, value?: ScalarValue): boolean;
|
|
76
|
+
export declare function addMemory(cognition: CognitionState, type: string, tick: number, data: Record<string, ScalarValue>, entityId?: string, zoneId?: string): void;
|
|
77
|
+
export declare function getMemories(cognition: CognitionState, type?: string): Memory[];
|
|
78
|
+
export declare function getRecentMemories(cognition: CognitionState, withinTicks: number, currentTick: number): Memory[];
|
|
79
|
+
export declare function checkPerception(observer: EntityState, target: EntityState, world: WorldState, perceptionStat: string, baseDifficulty: number): PerceptionResult;
|
|
80
|
+
export declare function selectIntent(entity: EntityState, cognition: CognitionState, world: WorldState, profile: IntentProfile): IntentOption | null;
|
|
81
|
+
/** Built-in aggressive profile: attack visible hostiles, flee when low morale */
|
|
82
|
+
export declare const aggressiveProfile: IntentProfile;
|
|
83
|
+
/** Built-in cautious profile: observe first, attack only when confident */
|
|
84
|
+
export declare const cautiousProfile: IntentProfile;
|
|
85
|
+
/** Reinforce a belief by resetting its tick to current (prevents decay) */
|
|
86
|
+
export declare function reinforceBelief(cognition: CognitionState, subject: string, key: string, tick: number, confidenceBoost?: number): boolean;
|
|
87
|
+
/** Process belief decay for all entities */
|
|
88
|
+
export declare function processBeliefDecay(world: WorldState, decayConfig: BeliefDecayConfig): void;
|
|
89
|
+
//# sourceMappingURL=cognition-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognition-core.d.ts","sourceRoot":"","sources":["../src/cognition-core.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EAEV,WAAW,EAGZ,MAAM,qBAAqB,CAAC;AAK7B,MAAM,MAAM,MAAM,GAAG;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAIF,MAAM,MAAM,eAAe,GAAG;IAC5B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAIF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,KAAK,YAAY,EAAE,CAAC;CACjG,CAAC;AAOF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACpC,CAAC;AAQF,wBAAgB,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,mBAAmB,GAAG,aAAa,EAAE,GAAG,YAAY,CAiD1G;AASD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAYhF;AAID,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CAeN;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,WAAW,GAAG,SAAS,CAEzB;AAED,qDAAqD;AACrD,wBAAgB,QAAQ,CACtB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,WAAW,GAClB,OAAO,CAKT;AAID,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACjC,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CASN;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,EAAE,CAGV;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,cAAc,EACzB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CAEV;AAID,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB,gBAAgB,CAgClB;AAID,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,aAAa,GACrB,YAAY,GAAG,IAAI,CAOrB;AAED,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,EAAE,aAmD/B,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,aA0C7B,CAAC;AAwFF,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,eAAe,GAAE,MAAU,GAC1B,OAAO,CAMT;AAED,4CAA4C;AAC5C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,GAAG,IAAI,CA+C1F"}
|