-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlearning-memory.ts
More file actions
63 lines (55 loc) · 2.21 KB
/
Copy pathlearning-memory.ts
File metadata and controls
63 lines (55 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { hashValue } from "./hash";
import type { MissionResult } from "./orchestrator";
import type { ModelIntelligenceResult } from "./model-provider";
export type LearningMemoryRecord = {
memoryId: string;
missionId: string;
createdAt: string;
sensitivity: MissionResult["signal"]["context"]["sensitivity"];
policyDecision: MissionResult["policyDecision"]["decision"];
sourceEventIds: string[];
evidenceHashes: string[];
summary: string;
reusablePatterns: string[];
redacted: boolean;
};
const memoryByMission = new Map<string, LearningMemoryRecord>();
export function learnFromMission(mission: MissionResult, model: ModelIntelligenceResult): LearningMemoryRecord | null {
if (mission.policyDecision.decision === "DENY") return null;
if (!mission.evidenceEventIds.length) return null;
const redacted = ["controlled", "classified"].includes(mission.signal.context.sensitivity);
const evidenceHashes = mission.evidenceEventIds.map((eventId) => hashValue(`${mission.missionId}:${eventId}`));
const reusablePatterns = [
...mission.fusedIntelligence.topFindings,
...model.recommendedNextSteps,
]
.filter((item) => item && !/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i.test(item))
.slice(0, 8);
const summary = redacted
? `Redacted ${mission.signal.context.sensitivity} mission memory. Evidence and policy metadata retained; raw mission text excluded.`
: model.summary;
const record: LearningMemoryRecord = {
memoryId: hashValue(`${mission.missionId}:${mission.evidenceEventIds.join(":")}`).slice(0, 24),
missionId: mission.missionId,
createdAt: new Date().toISOString(),
sensitivity: mission.signal.context.sensitivity,
policyDecision: mission.policyDecision.decision,
sourceEventIds: mission.evidenceEventIds,
evidenceHashes,
summary,
reusablePatterns,
redacted,
};
memoryByMission.set(mission.missionId, record);
return record;
}
export function getLearningMemory(missionId?: string): LearningMemoryRecord[] {
if (missionId) {
const record = memoryByMission.get(missionId);
return record ? [record] : [];
}
return Array.from(memoryByMission.values());
}
export function clearLearningMemoryForTests(): void {
memoryByMission.clear();
}