agent-working-memory 0.3.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/LICENSE +21 -0
- package/README.md +311 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/routes.d.ts +53 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +388 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +245 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/decay.d.ts +36 -0
- package/dist/core/decay.d.ts.map +1 -0
- package/dist/core/decay.js +38 -0
- package/dist/core/decay.js.map +1 -0
- package/dist/core/embeddings.d.ts +33 -0
- package/dist/core/embeddings.d.ts.map +1 -0
- package/dist/core/embeddings.js +76 -0
- package/dist/core/embeddings.js.map +1 -0
- package/dist/core/hebbian.d.ts +38 -0
- package/dist/core/hebbian.d.ts.map +1 -0
- package/dist/core/hebbian.js +74 -0
- package/dist/core/hebbian.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/query-expander.d.ts +24 -0
- package/dist/core/query-expander.d.ts.map +1 -0
- package/dist/core/query-expander.js +58 -0
- package/dist/core/query-expander.js.map +1 -0
- package/dist/core/reranker.d.ts +25 -0
- package/dist/core/reranker.d.ts.map +1 -0
- package/dist/core/reranker.js +75 -0
- package/dist/core/reranker.js.map +1 -0
- package/dist/core/salience.d.ts +30 -0
- package/dist/core/salience.d.ts.map +1 -0
- package/dist/core/salience.js +81 -0
- package/dist/core/salience.js.map +1 -0
- package/dist/engine/activation.d.ts +38 -0
- package/dist/engine/activation.d.ts.map +1 -0
- package/dist/engine/activation.js +516 -0
- package/dist/engine/activation.js.map +1 -0
- package/dist/engine/connections.d.ts +31 -0
- package/dist/engine/connections.d.ts.map +1 -0
- package/dist/engine/connections.js +74 -0
- package/dist/engine/connections.js.map +1 -0
- package/dist/engine/consolidation-scheduler.d.ts +31 -0
- package/dist/engine/consolidation-scheduler.d.ts.map +1 -0
- package/dist/engine/consolidation-scheduler.js +115 -0
- package/dist/engine/consolidation-scheduler.js.map +1 -0
- package/dist/engine/consolidation.d.ts +62 -0
- package/dist/engine/consolidation.d.ts.map +1 -0
- package/dist/engine/consolidation.js +368 -0
- package/dist/engine/consolidation.js.map +1 -0
- package/dist/engine/eval.d.ts +22 -0
- package/dist/engine/eval.d.ts.map +1 -0
- package/dist/engine/eval.js +79 -0
- package/dist/engine/eval.js.map +1 -0
- package/dist/engine/eviction.d.ts +29 -0
- package/dist/engine/eviction.d.ts.map +1 -0
- package/dist/engine/eviction.js +86 -0
- package/dist/engine/eviction.js.map +1 -0
- package/dist/engine/index.d.ts +7 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +7 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/retraction.d.ts +32 -0
- package/dist/engine/retraction.d.ts.map +1 -0
- package/dist/engine/retraction.js +77 -0
- package/dist/engine/retraction.js.map +1 -0
- package/dist/engine/staging.d.ts +33 -0
- package/dist/engine/staging.d.ts.map +1 -0
- package/dist/engine/staging.js +63 -0
- package/dist/engine/staging.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +24 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +532 -0
- package/dist/mcp.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/sqlite.d.ts +116 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +750 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/types/agent.d.ts +30 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +23 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/checkpoint.d.ts +50 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +8 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types/engram.d.ts +165 -0
- package/dist/types/engram.d.ts.map +1 -0
- package/dist/types/engram.js +8 -0
- package/dist/types/engram.js.map +1 -0
- package/dist/types/eval.d.ts +84 -0
- package/dist/types/eval.d.ts.map +1 -0
- package/dist/types/eval.js +11 -0
- package/dist/types/eval.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +55 -0
- package/src/api/index.ts +1 -0
- package/src/api/routes.ts +528 -0
- package/src/cli.ts +260 -0
- package/src/core/decay.ts +61 -0
- package/src/core/embeddings.ts +82 -0
- package/src/core/hebbian.ts +91 -0
- package/src/core/index.ts +3 -0
- package/src/core/query-expander.ts +64 -0
- package/src/core/reranker.ts +99 -0
- package/src/core/salience.ts +95 -0
- package/src/engine/activation.ts +577 -0
- package/src/engine/connections.ts +101 -0
- package/src/engine/consolidation-scheduler.ts +123 -0
- package/src/engine/consolidation.ts +443 -0
- package/src/engine/eval.ts +100 -0
- package/src/engine/eviction.ts +99 -0
- package/src/engine/index.ts +6 -0
- package/src/engine/retraction.ts +98 -0
- package/src/engine/staging.ts +72 -0
- package/src/index.ts +100 -0
- package/src/mcp.ts +635 -0
- package/src/storage/index.ts +1 -0
- package/src/storage/sqlite.ts +893 -0
- package/src/types/agent.ts +65 -0
- package/src/types/checkpoint.ts +44 -0
- package/src/types/engram.ts +194 -0
- package/src/types/eval.ts +98 -0
- package/src/types/index.ts +4 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite storage layer — persistence for engrams, associations, and eval events.
|
|
3
|
+
*
|
|
4
|
+
* Uses better-sqlite3 for synchronous, fast, embedded storage.
|
|
5
|
+
* FTS5 provides BM25 full-text search for the activation pipeline.
|
|
6
|
+
*/
|
|
7
|
+
import type { Engram, EngramCreate, EngramStage, Association, AssociationType, SearchQuery, ActivationEvent, StagingEvent, Episode, TaskStatus, TaskPriority, ConsciousState, CheckpointRow } from '../types/index.js';
|
|
8
|
+
export declare class EngramStore {
|
|
9
|
+
private db;
|
|
10
|
+
constructor(dbPath?: string);
|
|
11
|
+
private init;
|
|
12
|
+
createEngram(input: EngramCreate): Engram;
|
|
13
|
+
getEngram(id: string): Engram | null;
|
|
14
|
+
getEngramsByAgent(agentId: string, stage?: EngramStage, includeRetracted?: boolean): Engram[];
|
|
15
|
+
touchEngram(id: string): void;
|
|
16
|
+
updateStage(id: string, stage: EngramStage): void;
|
|
17
|
+
updateConfidence(id: string, confidence: number): void;
|
|
18
|
+
updateEmbedding(id: string, embedding: number[]): void;
|
|
19
|
+
retractEngram(id: string, retractedBy: string | null): void;
|
|
20
|
+
deleteEngram(id: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Time warp — shift all timestamps backward by ms milliseconds.
|
|
23
|
+
* Used for testing time-dependent behavior (decay, forgetting).
|
|
24
|
+
* Returns count of records shifted.
|
|
25
|
+
*/
|
|
26
|
+
timeWarp(agentId: string, ms: number): number;
|
|
27
|
+
searchBM25(agentId: string, query: string, limit?: number): Engram[];
|
|
28
|
+
/**
|
|
29
|
+
* BM25 search returning rank scores alongside engrams.
|
|
30
|
+
* FTS5 rank is negative (lower = better match).
|
|
31
|
+
* We normalize to 0-1 where higher = better.
|
|
32
|
+
*/
|
|
33
|
+
searchBM25WithRank(agentId: string, query: string, limit?: number): {
|
|
34
|
+
engram: Engram;
|
|
35
|
+
bm25Score: number;
|
|
36
|
+
}[];
|
|
37
|
+
search(query: SearchQuery): Engram[];
|
|
38
|
+
/**
|
|
39
|
+
* Get the most recently created engram for an agent (for temporal adjacency edges).
|
|
40
|
+
*/
|
|
41
|
+
getLatestEngram(agentId: string, excludeId?: string): Engram | null;
|
|
42
|
+
updateTaskStatus(id: string, status: TaskStatus): void;
|
|
43
|
+
updateTaskPriority(id: string, priority: TaskPriority): void;
|
|
44
|
+
updateBlockedBy(id: string, blockedBy: string | null): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get tasks for an agent, optionally filtered by status.
|
|
47
|
+
* Results ordered by priority (urgent > high > medium > low), then creation date.
|
|
48
|
+
*/
|
|
49
|
+
getTasks(agentId: string, status?: TaskStatus): Engram[];
|
|
50
|
+
/**
|
|
51
|
+
* Get the next actionable task — highest priority that's not blocked or done.
|
|
52
|
+
*/
|
|
53
|
+
getNextTask(agentId: string): Engram | null;
|
|
54
|
+
upsertAssociation(fromId: string, toId: string, weight: number, type?: AssociationType, confidence?: number): Association;
|
|
55
|
+
getAssociation(fromId: string, toId: string): Association | null;
|
|
56
|
+
getAssociationsFor(engramId: string): Association[];
|
|
57
|
+
countAssociationsFor(engramId: string): number;
|
|
58
|
+
getWeakestAssociation(engramId: string): Association | null;
|
|
59
|
+
deleteAssociation(id: string): void;
|
|
60
|
+
getAllAssociations(agentId: string): Association[];
|
|
61
|
+
getEvictionCandidates(agentId: string, limit: number): Engram[];
|
|
62
|
+
getActiveCount(agentId: string): number;
|
|
63
|
+
getStagingCount(agentId: string): number;
|
|
64
|
+
getExpiredStaging(): Engram[];
|
|
65
|
+
logActivationEvent(event: ActivationEvent): void;
|
|
66
|
+
logStagingEvent(event: StagingEvent): void;
|
|
67
|
+
logRetrievalFeedback(activationEventId: string | null, engramId: string, useful: boolean, context: string): void;
|
|
68
|
+
getRetrievalPrecision(agentId: string, windowHours?: number): number;
|
|
69
|
+
getStagingMetrics(agentId: string): {
|
|
70
|
+
promoted: number;
|
|
71
|
+
discarded: number;
|
|
72
|
+
expired: number;
|
|
73
|
+
};
|
|
74
|
+
getActivationStats(agentId: string, windowHours?: number): {
|
|
75
|
+
count: number;
|
|
76
|
+
avgLatencyMs: number;
|
|
77
|
+
p95LatencyMs: number;
|
|
78
|
+
};
|
|
79
|
+
getConsolidatedCount(agentId: string): number;
|
|
80
|
+
private rowToEngram;
|
|
81
|
+
private rowToAssociation;
|
|
82
|
+
createEpisode(input: {
|
|
83
|
+
agentId: string;
|
|
84
|
+
label: string;
|
|
85
|
+
embedding?: number[];
|
|
86
|
+
}): Episode;
|
|
87
|
+
getEpisode(id: string): Episode | null;
|
|
88
|
+
getEpisodesByAgent(agentId: string): Episode[];
|
|
89
|
+
getActiveEpisode(agentId: string, windowMs?: number): Episode | null;
|
|
90
|
+
addEngramToEpisode(engramId: string, episodeId: string): void;
|
|
91
|
+
getEngramsByEpisode(episodeId: string): Engram[];
|
|
92
|
+
updateEpisodeEmbedding(id: string, embedding: number[]): void;
|
|
93
|
+
getEpisodeCount(agentId: string): number;
|
|
94
|
+
private rowToEpisode;
|
|
95
|
+
/**
|
|
96
|
+
* Find engrams whose tags contain any of the given tag values.
|
|
97
|
+
* Used for entity-bridge retrieval: given entity tags from top results,
|
|
98
|
+
* find other engrams mentioning the same entities.
|
|
99
|
+
*/
|
|
100
|
+
findEngramsByTags(agentId: string, tags: string[], excludeIds?: Set<string>): Engram[];
|
|
101
|
+
updateAutoCheckpointWrite(agentId: string, engramId: string): void;
|
|
102
|
+
updateAutoCheckpointRecall(agentId: string, context: string, engramIds: string[]): void;
|
|
103
|
+
touchActivity(agentId: string): void;
|
|
104
|
+
saveCheckpoint(agentId: string, state: ConsciousState): void;
|
|
105
|
+
getCheckpoint(agentId: string): CheckpointRow | null;
|
|
106
|
+
markConsolidation(agentId: string, mini: boolean): void;
|
|
107
|
+
getActiveAgents(): Array<{
|
|
108
|
+
agentId: string;
|
|
109
|
+
lastActivityAt: Date;
|
|
110
|
+
writeCount: number;
|
|
111
|
+
recallCount: number;
|
|
112
|
+
lastConsolidationAt: Date | null;
|
|
113
|
+
}>;
|
|
114
|
+
close(): void;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
|