agent-working-memory 0.8.7 → 0.9.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.
Files changed (57) hide show
  1. package/README.md +207 -46
  2. package/dist/api/routes.js +1 -1
  3. package/dist/cli/migrate.js +29 -29
  4. package/dist/cli.js +1 -1
  5. package/dist/coordination/circuit-breaker.js +23 -23
  6. package/dist/core/write-pipeline.d.ts.map +1 -1
  7. package/dist/core/write-pipeline.js +17 -0
  8. package/dist/core/write-pipeline.js.map +1 -1
  9. package/dist/engine/activation.d.ts +28 -0
  10. package/dist/engine/activation.d.ts.map +1 -1
  11. package/dist/engine/activation.js +341 -11
  12. package/dist/engine/activation.js.map +1 -1
  13. package/dist/engine/connections.d.ts +12 -0
  14. package/dist/engine/connections.d.ts.map +1 -1
  15. package/dist/engine/connections.js +95 -0
  16. package/dist/engine/connections.js.map +1 -1
  17. package/dist/mcp.js +2 -2
  18. package/dist/storage/pglite-schema.js +143 -143
  19. package/dist/storage/pglite.js +138 -138
  20. package/dist/types/engram.d.ts +1 -0
  21. package/dist/types/engram.d.ts.map +1 -1
  22. package/package.json +1 -1
  23. package/src/api/index.ts +3 -3
  24. package/src/api/routes.ts +1 -1
  25. package/src/cli/migrate.ts +307 -307
  26. package/src/cli.ts +1 -1
  27. package/src/coordination/circuit-breaker.ts +83 -83
  28. package/src/coordination/failure-modes.ts +50 -50
  29. package/src/core/decay.ts +63 -63
  30. package/src/core/embeddings.ts +110 -110
  31. package/src/core/index.ts +5 -5
  32. package/src/core/logger.ts +36 -36
  33. package/src/core/ml-worker-entry.ts +194 -194
  34. package/src/core/ml-worker.ts +281 -281
  35. package/src/core/query-expander.ts +122 -122
  36. package/src/core/reranker.ts +119 -119
  37. package/src/core/write-pipeline.ts +15 -0
  38. package/src/engine/activation.ts +328 -11
  39. package/src/engine/confidence.ts +120 -120
  40. package/src/engine/connections.ts +94 -0
  41. package/src/engine/consolidation-scheduler.ts +242 -242
  42. package/src/engine/eval.ts +102 -102
  43. package/src/engine/eviction.ts +101 -101
  44. package/src/engine/index.ts +8 -8
  45. package/src/engine/retraction.ts +366 -366
  46. package/src/engine/staging.ts +74 -74
  47. package/src/mcp.ts +2 -2
  48. package/src/storage/factory.ts +147 -147
  49. package/src/storage/index.ts +3 -3
  50. package/src/storage/pglite-schema.ts +166 -166
  51. package/src/storage/pglite.ts +1363 -1363
  52. package/src/storage/store.ts +80 -80
  53. package/src/types/agent.ts +67 -67
  54. package/src/types/checkpoint.ts +46 -46
  55. package/src/types/engram.ts +1 -0
  56. package/src/types/eval.ts +100 -100
  57. package/src/types/index.ts +6 -6
@@ -66,5 +66,17 @@ export declare class ConnectionEngine {
66
66
  * Find and create connections for a given engram.
67
67
  */
68
68
  private findConnections;
69
+ /**
70
+ * R1 — form entity co-occurrence edges (default-off, `AWM_BROAD_EDGES=1`).
71
+ *
72
+ * Extract proper-noun entities from the engram, find other engrams that
73
+ * literally mention the same entity, and link them at a lower weight than
74
+ * the semantic edges above. The BM25 candidate is re-checked with a
75
+ * case-insensitive substring match so a coincidental capitalized word
76
+ * doesn't create a spurious edge (precision guard); edge weight scales with
77
+ * the number of shared entities but stays below the 0.7 semantic floor so
78
+ * semantic links still dominate the graph walk.
79
+ */
80
+ private formEntityEdges;
69
81
  }
70
82
  //# sourceMappingURL=connections.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../src/engine/connections.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKxD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAS;gBAGzB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,gBAAgB,EACxB,SAAS,GAAE,MAAY;IAOzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;;;;;;;;OAWG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;YAM/C,mBAAmB;IAYjC;;;;;;;;OAQG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBnC,mEAAmE;IACnE,SAAS,IAAI,MAAM;IAInB;;OAEG;YACW,eAAe;CAoC9B"}
1
+ {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../src/engine/connections.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAiDxD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAS;gBAGzB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,gBAAgB,EACxB,SAAS,GAAE,MAAY;IAOzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;;;;;;;;OAWG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;YAM/C,mBAAmB;IAYjC;;;;;;;;OAQG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBnC,mEAAmE;IACnE,SAAS,IAAI,MAAM;IAInB;;OAEG;YACW,eAAe;IA2C7B;;;;;;;;;;OAUG;YACW,eAAe;CAgC9B"}
@@ -22,6 +22,50 @@
22
22
  * queued ID. AWM remains cheap to NOT use.
23
23
  */
24
24
  const COLD_START_THRESHOLD = Number(process.env.AWM_CONNECTION_COLD_START_THRESHOLD ?? 10);
25
+ /**
26
+ * R1 — broaden edge FORMATION beyond high-cosine semantic links.
27
+ *
28
+ * The semantic `activate` path only links engrams at ≥0.7 cosine, so two facts
29
+ * that share an entity but are lexically/semantically distant ("my main project
30
+ * is Atlas" vs "Atlas's codename is Magpie") never get an edge — starving the
31
+ * graph walk / spreading activation of exactly the bridges multi-hop needs.
32
+ *
33
+ * When enabled, after the semantic pass we also form *entity co-occurrence*
34
+ * edges: extract proper-noun entities from the engram, find other engrams that
35
+ * literally mention the same entity (BM25 + substring re-check for precision),
36
+ * and link them at a LOWER weight than semantic edges. Recall-only by design —
37
+ * the edges feed candidate generation; the reranker still makes the final cut.
38
+ *
39
+ * Default-OFF (gate per docs/awm-improvement-register.md). Set
40
+ * `AWM_BROAD_EDGES=1` to enable.
41
+ */
42
+ const BROAD_EDGES = process.env.AWM_BROAD_EDGES === '1';
43
+ /** Max entity-co-occurrence edges formed per engram (on top of semantic). */
44
+ const MAX_ENTITY_EDGES = Number(process.env.AWM_BROAD_EDGES_MAX ?? 6);
45
+ /** Proper-noun entity extraction — mirrors auto-tagger's `entity:` pattern. */
46
+ const ENTITY_RE = /\b([A-Z][a-z]{2,}(?:\s+[A-Z][a-z]+)*)\b/g;
47
+ /** Common capitalized words that are not useful entity bridges. */
48
+ const ENTITY_STOPWORDS = new Set([
49
+ 'The', 'This', 'That', 'These', 'Those', 'There', 'Then', 'They', 'Them',
50
+ 'And', 'But', 'For', 'With', 'From', 'Into', 'When', 'What', 'Where', 'Which',
51
+ 'While', 'Who', 'Why', 'How', 'Also', 'After', 'Before', 'Because', 'Should',
52
+ 'Would', 'Could', 'Will', 'Was', 'Were', 'Has', 'Have', 'Had', 'Not', 'Now',
53
+ 'New', 'One', 'Two', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
54
+ 'Saturday', 'Sunday', 'January', 'February', 'March', 'April', 'June', 'July',
55
+ 'August', 'September', 'October', 'November', 'December',
56
+ ]);
57
+ function extractEntities(text) {
58
+ const out = new Set();
59
+ for (const m of text.matchAll(ENTITY_RE)) {
60
+ const name = m[1].trim();
61
+ if (name.length < 3 || name.length > 40)
62
+ continue;
63
+ if (ENTITY_STOPWORDS.has(name))
64
+ continue;
65
+ out.add(name);
66
+ }
67
+ return [...out];
68
+ }
25
69
  export class ConnectionEngine {
26
70
  store;
27
71
  engine;
@@ -118,6 +162,7 @@ export class ConnectionEngine {
118
162
  limit: 5,
119
163
  minScore: this.threshold,
120
164
  internal: true,
165
+ spread: false, // edge discovery must not recurse through R2 spreading
121
166
  });
122
167
  // Filter out self and already-connected engrams
123
168
  const existing = await this.store.getAssociationsFor(engram.id);
@@ -131,6 +176,56 @@ export class ConnectionEngine {
131
176
  await this.store.upsertAssociation(engram.id, result.engram.id, result.score, 'connection');
132
177
  // Bidirectional
133
178
  await this.store.upsertAssociation(result.engram.id, engram.id, result.score, 'connection');
179
+ existingIds.add(result.engram.id);
180
+ }
181
+ if (BROAD_EDGES) {
182
+ await this.formEntityEdges(engram, existingIds);
183
+ }
184
+ }
185
+ /**
186
+ * R1 — form entity co-occurrence edges (default-off, `AWM_BROAD_EDGES=1`).
187
+ *
188
+ * Extract proper-noun entities from the engram, find other engrams that
189
+ * literally mention the same entity, and link them at a lower weight than
190
+ * the semantic edges above. The BM25 candidate is re-checked with a
191
+ * case-insensitive substring match so a coincidental capitalized word
192
+ * doesn't create a spurious edge (precision guard); edge weight scales with
193
+ * the number of shared entities but stays below the 0.7 semantic floor so
194
+ * semantic links still dominate the graph walk.
195
+ */
196
+ async formEntityEdges(engram, existingIds) {
197
+ const entities = extractEntities(`${engram.concept} ${engram.content}`);
198
+ if (entities.length === 0)
199
+ return;
200
+ // Gather candidates that match any of the engram's entities (BM25 OR).
201
+ const query = entities.slice(0, 6).join(' ');
202
+ const candidates = await this.store.searchBM25(engram.agentId, query, 20);
203
+ const lowerEntities = entities.map(e => e.toLowerCase());
204
+ // Rank candidates by how many of our entities they literally contain.
205
+ const scored = [];
206
+ for (const cand of candidates) {
207
+ if (cand.id === engram.id)
208
+ continue;
209
+ if (existingIds.has(cand.id))
210
+ continue;
211
+ if (cand.stage !== 'active')
212
+ continue;
213
+ const candText = `${cand.concept} ${cand.content}`.toLowerCase();
214
+ let shared = 0;
215
+ for (const ent of lowerEntities) {
216
+ if (candText.includes(ent))
217
+ shared++;
218
+ }
219
+ if (shared > 0)
220
+ scored.push({ id: cand.id, engram: cand, shared });
221
+ }
222
+ scored.sort((a, b) => b.shared - a.shared);
223
+ for (const { id, shared } of scored.slice(0, MAX_ENTITY_EDGES)) {
224
+ // Below the 0.7 semantic floor; more shared entities → stronger edge.
225
+ const weight = Math.min(0.6, 0.4 + 0.1 * shared);
226
+ await this.store.upsertAssociation(engram.id, id, weight, 'connection');
227
+ await this.store.upsertAssociation(id, engram.id, weight, 'connection');
228
+ existingIds.add(id);
134
229
  }
135
230
  }
136
231
  }
@@ -1 +1 @@
1
- {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/engine/connections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/engine/connections.ts"],"names":[],"mappings":"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"}
package/dist/mcp.js CHANGED
@@ -77,7 +77,7 @@ import { queryPeerDecisions, formatPeerDecisions } from './coordination/peer-dec
77
77
  const INCOGNITO = process.env.AWM_INCOGNITO === '1' || process.env.AWM_INCOGNITO === 'true';
78
78
  if (INCOGNITO) {
79
79
  console.error('AWM: incognito mode — all memory tools disabled, nothing will be recorded');
80
- const server = new McpServer({ name: 'agent-working-memory', version: '0.8.7' });
80
+ const server = new McpServer({ name: 'agent-working-memory', version: '0.8.8' });
81
81
  const transport = new StdioServerTransport();
82
82
  server.connect(transport).catch(err => {
83
83
  console.error('MCP server failed:', err);
@@ -126,7 +126,7 @@ else {
126
126
  let coordDb = null;
127
127
  const server = new McpServer({
128
128
  name: 'agent-working-memory',
129
- version: '0.8.7',
129
+ version: '0.8.8',
130
130
  });
131
131
  server.registerResource('awm-overview', 'awm://server/overview', {
132
132
  title: 'AWM Overview',
@@ -18,148 +18,148 @@
18
18
  * PGlite's vector extension does this automatically when imported.
19
19
  */
20
20
  export const PGLITE_VECTOR_DIMENSIONS = parseInt(process.env.AWM_EMBED_DIMS ?? '384', 10);
21
- export const PGLITE_SCHEMA_DDL = `
22
- CREATE EXTENSION IF NOT EXISTS vector;
23
-
24
- CREATE TABLE IF NOT EXISTS engrams (
25
- id TEXT PRIMARY KEY,
26
- agent_id TEXT NOT NULL,
27
- concept TEXT NOT NULL,
28
- content TEXT NOT NULL,
29
- embedding VECTOR(${PGLITE_VECTOR_DIMENSIONS}),
30
- embedding_model TEXT,
31
- confidence DOUBLE PRECISION NOT NULL DEFAULT 0.5,
32
- salience DOUBLE PRECISION NOT NULL DEFAULT 0.5,
33
- access_count INTEGER NOT NULL DEFAULT 0,
34
- last_accessed TEXT NOT NULL,
35
- created_at TEXT NOT NULL,
36
- salience_features TEXT NOT NULL DEFAULT '{}',
37
- reason_codes TEXT NOT NULL DEFAULT '[]',
38
- stage TEXT NOT NULL DEFAULT 'active',
39
- ttl INTEGER,
40
- retracted BOOLEAN NOT NULL DEFAULT FALSE,
41
- retracted_by TEXT,
42
- retracted_at TEXT,
43
- tags TEXT NOT NULL DEFAULT '[]',
44
- memory_type TEXT NOT NULL DEFAULT 'unclassified',
45
- memory_class TEXT NOT NULL DEFAULT 'working',
46
- superseded_by TEXT,
47
- supersedes TEXT,
48
- episode_id TEXT,
49
- task_status TEXT,
50
- task_priority TEXT,
51
- blocked_by TEXT,
52
- sequence INTEGER,
53
- references_json TEXT,
54
- fts TSVECTOR
55
- );
56
-
57
- CREATE INDEX IF NOT EXISTS idx_engrams_agent ON engrams(agent_id);
58
- CREATE INDEX IF NOT EXISTS idx_engrams_stage ON engrams(agent_id, stage);
59
- CREATE INDEX IF NOT EXISTS idx_engrams_concept ON engrams(concept);
60
- CREATE INDEX IF NOT EXISTS idx_engrams_retracted ON engrams(agent_id, retracted);
61
- CREATE INDEX IF NOT EXISTS idx_engrams_task ON engrams(agent_id, task_status);
62
- CREATE INDEX IF NOT EXISTS idx_engrams_agent_sequence ON engrams(agent_id, sequence) WHERE sequence IS NOT NULL;
63
- CREATE INDEX IF NOT EXISTS idx_engrams_fts ON engrams USING GIN(fts);
64
-
65
- CREATE INDEX IF NOT EXISTS idx_engrams_embedding
66
- ON engrams USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
67
-
68
- CREATE OR REPLACE FUNCTION engrams_fts_update() RETURNS TRIGGER AS $$
69
- BEGIN
70
- NEW.fts := to_tsvector('english',
71
- COALESCE(NEW.concept, '') || ' ' ||
72
- COALESCE(NEW.content, '') || ' ' ||
73
- COALESCE(NEW.tags, ''));
74
- RETURN NEW;
75
- END;
76
- $$ LANGUAGE plpgsql;
77
-
78
- DROP TRIGGER IF EXISTS engrams_fts_trigger ON engrams;
79
- CREATE TRIGGER engrams_fts_trigger
80
- BEFORE INSERT OR UPDATE OF concept, content, tags ON engrams
81
- FOR EACH ROW EXECUTE FUNCTION engrams_fts_update();
82
-
83
- CREATE TABLE IF NOT EXISTS associations (
84
- id TEXT PRIMARY KEY,
85
- from_engram_id TEXT NOT NULL REFERENCES engrams(id) ON DELETE CASCADE,
86
- to_engram_id TEXT NOT NULL REFERENCES engrams(id) ON DELETE CASCADE,
87
- weight DOUBLE PRECISION NOT NULL DEFAULT 0.1,
88
- confidence DOUBLE PRECISION NOT NULL DEFAULT 0.5,
89
- type TEXT NOT NULL DEFAULT 'hebbian',
90
- activation_count INTEGER NOT NULL DEFAULT 0,
91
- created_at TEXT NOT NULL,
92
- last_activated TEXT NOT NULL
93
- );
94
-
95
- CREATE INDEX IF NOT EXISTS idx_assoc_from ON associations(from_engram_id);
96
- CREATE INDEX IF NOT EXISTS idx_assoc_to ON associations(to_engram_id);
97
- CREATE UNIQUE INDEX IF NOT EXISTS idx_assoc_pair ON associations(from_engram_id, to_engram_id);
98
-
99
- CREATE TABLE IF NOT EXISTS agents (
100
- id TEXT PRIMARY KEY,
101
- name TEXT NOT NULL,
102
- created_at TEXT NOT NULL,
103
- config TEXT NOT NULL DEFAULT '{}'
104
- );
105
-
106
- CREATE TABLE IF NOT EXISTS activation_events (
107
- id TEXT PRIMARY KEY,
108
- agent_id TEXT NOT NULL,
109
- timestamp TEXT NOT NULL,
110
- context TEXT NOT NULL,
111
- results_returned INTEGER NOT NULL,
112
- top_score DOUBLE PRECISION,
113
- latency_ms DOUBLE PRECISION NOT NULL,
114
- engram_ids TEXT NOT NULL DEFAULT '[]'
115
- );
116
-
117
- CREATE TABLE IF NOT EXISTS staging_events (
118
- engram_id TEXT NOT NULL,
119
- agent_id TEXT NOT NULL,
120
- action TEXT NOT NULL,
121
- resonance_score DOUBLE PRECISION,
122
- timestamp TEXT NOT NULL,
123
- age_ms INTEGER NOT NULL
124
- );
125
-
126
- CREATE TABLE IF NOT EXISTS retrieval_feedback (
127
- id TEXT PRIMARY KEY,
128
- activation_event_id TEXT,
129
- engram_id TEXT NOT NULL,
130
- useful BOOLEAN NOT NULL,
131
- context TEXT,
132
- timestamp TEXT NOT NULL
133
- );
134
-
135
- CREATE TABLE IF NOT EXISTS episodes (
136
- id TEXT PRIMARY KEY,
137
- agent_id TEXT NOT NULL,
138
- label TEXT NOT NULL,
139
- embedding VECTOR(${PGLITE_VECTOR_DIMENSIONS}),
140
- engram_count INTEGER NOT NULL DEFAULT 0,
141
- start_time TEXT NOT NULL,
142
- end_time TEXT NOT NULL,
143
- created_at TEXT NOT NULL
144
- );
145
-
146
- CREATE INDEX IF NOT EXISTS idx_episodes_agent ON episodes(agent_id);
147
- CREATE INDEX IF NOT EXISTS idx_episodes_time ON episodes(agent_id, end_time);
148
-
149
- CREATE TABLE IF NOT EXISTS conscious_state (
150
- agent_id TEXT PRIMARY KEY,
151
- last_write_id TEXT,
152
- last_recall_context TEXT,
153
- last_recall_ids TEXT NOT NULL DEFAULT '[]',
154
- last_activity_at TEXT NOT NULL DEFAULT (to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')),
155
- write_count_since_consolidation INTEGER NOT NULL DEFAULT 0,
156
- recall_count_since_consolidation INTEGER NOT NULL DEFAULT 0,
157
- execution_state TEXT,
158
- checkpoint_at TEXT,
159
- last_consolidation_at TEXT,
160
- last_mini_consolidation_at TEXT,
161
- consolidation_cycle_count INTEGER NOT NULL DEFAULT 0,
162
- updated_at TEXT NOT NULL DEFAULT (to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'))
163
- );
21
+ export const PGLITE_SCHEMA_DDL = `
22
+ CREATE EXTENSION IF NOT EXISTS vector;
23
+
24
+ CREATE TABLE IF NOT EXISTS engrams (
25
+ id TEXT PRIMARY KEY,
26
+ agent_id TEXT NOT NULL,
27
+ concept TEXT NOT NULL,
28
+ content TEXT NOT NULL,
29
+ embedding VECTOR(${PGLITE_VECTOR_DIMENSIONS}),
30
+ embedding_model TEXT,
31
+ confidence DOUBLE PRECISION NOT NULL DEFAULT 0.5,
32
+ salience DOUBLE PRECISION NOT NULL DEFAULT 0.5,
33
+ access_count INTEGER NOT NULL DEFAULT 0,
34
+ last_accessed TEXT NOT NULL,
35
+ created_at TEXT NOT NULL,
36
+ salience_features TEXT NOT NULL DEFAULT '{}',
37
+ reason_codes TEXT NOT NULL DEFAULT '[]',
38
+ stage TEXT NOT NULL DEFAULT 'active',
39
+ ttl INTEGER,
40
+ retracted BOOLEAN NOT NULL DEFAULT FALSE,
41
+ retracted_by TEXT,
42
+ retracted_at TEXT,
43
+ tags TEXT NOT NULL DEFAULT '[]',
44
+ memory_type TEXT NOT NULL DEFAULT 'unclassified',
45
+ memory_class TEXT NOT NULL DEFAULT 'working',
46
+ superseded_by TEXT,
47
+ supersedes TEXT,
48
+ episode_id TEXT,
49
+ task_status TEXT,
50
+ task_priority TEXT,
51
+ blocked_by TEXT,
52
+ sequence INTEGER,
53
+ references_json TEXT,
54
+ fts TSVECTOR
55
+ );
56
+
57
+ CREATE INDEX IF NOT EXISTS idx_engrams_agent ON engrams(agent_id);
58
+ CREATE INDEX IF NOT EXISTS idx_engrams_stage ON engrams(agent_id, stage);
59
+ CREATE INDEX IF NOT EXISTS idx_engrams_concept ON engrams(concept);
60
+ CREATE INDEX IF NOT EXISTS idx_engrams_retracted ON engrams(agent_id, retracted);
61
+ CREATE INDEX IF NOT EXISTS idx_engrams_task ON engrams(agent_id, task_status);
62
+ CREATE INDEX IF NOT EXISTS idx_engrams_agent_sequence ON engrams(agent_id, sequence) WHERE sequence IS NOT NULL;
63
+ CREATE INDEX IF NOT EXISTS idx_engrams_fts ON engrams USING GIN(fts);
64
+
65
+ CREATE INDEX IF NOT EXISTS idx_engrams_embedding
66
+ ON engrams USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
67
+
68
+ CREATE OR REPLACE FUNCTION engrams_fts_update() RETURNS TRIGGER AS $$
69
+ BEGIN
70
+ NEW.fts := to_tsvector('english',
71
+ COALESCE(NEW.concept, '') || ' ' ||
72
+ COALESCE(NEW.content, '') || ' ' ||
73
+ COALESCE(NEW.tags, ''));
74
+ RETURN NEW;
75
+ END;
76
+ $$ LANGUAGE plpgsql;
77
+
78
+ DROP TRIGGER IF EXISTS engrams_fts_trigger ON engrams;
79
+ CREATE TRIGGER engrams_fts_trigger
80
+ BEFORE INSERT OR UPDATE OF concept, content, tags ON engrams
81
+ FOR EACH ROW EXECUTE FUNCTION engrams_fts_update();
82
+
83
+ CREATE TABLE IF NOT EXISTS associations (
84
+ id TEXT PRIMARY KEY,
85
+ from_engram_id TEXT NOT NULL REFERENCES engrams(id) ON DELETE CASCADE,
86
+ to_engram_id TEXT NOT NULL REFERENCES engrams(id) ON DELETE CASCADE,
87
+ weight DOUBLE PRECISION NOT NULL DEFAULT 0.1,
88
+ confidence DOUBLE PRECISION NOT NULL DEFAULT 0.5,
89
+ type TEXT NOT NULL DEFAULT 'hebbian',
90
+ activation_count INTEGER NOT NULL DEFAULT 0,
91
+ created_at TEXT NOT NULL,
92
+ last_activated TEXT NOT NULL
93
+ );
94
+
95
+ CREATE INDEX IF NOT EXISTS idx_assoc_from ON associations(from_engram_id);
96
+ CREATE INDEX IF NOT EXISTS idx_assoc_to ON associations(to_engram_id);
97
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_assoc_pair ON associations(from_engram_id, to_engram_id);
98
+
99
+ CREATE TABLE IF NOT EXISTS agents (
100
+ id TEXT PRIMARY KEY,
101
+ name TEXT NOT NULL,
102
+ created_at TEXT NOT NULL,
103
+ config TEXT NOT NULL DEFAULT '{}'
104
+ );
105
+
106
+ CREATE TABLE IF NOT EXISTS activation_events (
107
+ id TEXT PRIMARY KEY,
108
+ agent_id TEXT NOT NULL,
109
+ timestamp TEXT NOT NULL,
110
+ context TEXT NOT NULL,
111
+ results_returned INTEGER NOT NULL,
112
+ top_score DOUBLE PRECISION,
113
+ latency_ms DOUBLE PRECISION NOT NULL,
114
+ engram_ids TEXT NOT NULL DEFAULT '[]'
115
+ );
116
+
117
+ CREATE TABLE IF NOT EXISTS staging_events (
118
+ engram_id TEXT NOT NULL,
119
+ agent_id TEXT NOT NULL,
120
+ action TEXT NOT NULL,
121
+ resonance_score DOUBLE PRECISION,
122
+ timestamp TEXT NOT NULL,
123
+ age_ms INTEGER NOT NULL
124
+ );
125
+
126
+ CREATE TABLE IF NOT EXISTS retrieval_feedback (
127
+ id TEXT PRIMARY KEY,
128
+ activation_event_id TEXT,
129
+ engram_id TEXT NOT NULL,
130
+ useful BOOLEAN NOT NULL,
131
+ context TEXT,
132
+ timestamp TEXT NOT NULL
133
+ );
134
+
135
+ CREATE TABLE IF NOT EXISTS episodes (
136
+ id TEXT PRIMARY KEY,
137
+ agent_id TEXT NOT NULL,
138
+ label TEXT NOT NULL,
139
+ embedding VECTOR(${PGLITE_VECTOR_DIMENSIONS}),
140
+ engram_count INTEGER NOT NULL DEFAULT 0,
141
+ start_time TEXT NOT NULL,
142
+ end_time TEXT NOT NULL,
143
+ created_at TEXT NOT NULL
144
+ );
145
+
146
+ CREATE INDEX IF NOT EXISTS idx_episodes_agent ON episodes(agent_id);
147
+ CREATE INDEX IF NOT EXISTS idx_episodes_time ON episodes(agent_id, end_time);
148
+
149
+ CREATE TABLE IF NOT EXISTS conscious_state (
150
+ agent_id TEXT PRIMARY KEY,
151
+ last_write_id TEXT,
152
+ last_recall_context TEXT,
153
+ last_recall_ids TEXT NOT NULL DEFAULT '[]',
154
+ last_activity_at TEXT NOT NULL DEFAULT (to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')),
155
+ write_count_since_consolidation INTEGER NOT NULL DEFAULT 0,
156
+ recall_count_since_consolidation INTEGER NOT NULL DEFAULT 0,
157
+ execution_state TEXT,
158
+ checkpoint_at TEXT,
159
+ last_consolidation_at TEXT,
160
+ last_mini_consolidation_at TEXT,
161
+ consolidation_cycle_count INTEGER NOT NULL DEFAULT 0,
162
+ updated_at TEXT NOT NULL DEFAULT (to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'))
163
+ );
164
164
  `;
165
165
  //# sourceMappingURL=pglite-schema.js.map