agent-working-memory 0.7.16 → 0.8.5

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 (200) hide show
  1. package/README.md +156 -15
  2. package/dist/adapters/claude-code.d.ts.map +1 -1
  3. package/dist/adapters/claude-code.js +2 -16
  4. package/dist/adapters/claude-code.js.map +1 -1
  5. package/dist/adapters/codex.d.ts.map +1 -1
  6. package/dist/adapters/codex.js +2 -11
  7. package/dist/adapters/codex.js.map +1 -1
  8. package/dist/adapters/common.d.ts +18 -0
  9. package/dist/adapters/common.d.ts.map +1 -1
  10. package/dist/adapters/common.js +254 -141
  11. package/dist/adapters/common.js.map +1 -1
  12. package/dist/adapters/cursor.d.ts.map +1 -1
  13. package/dist/adapters/cursor.js +2 -15
  14. package/dist/adapters/cursor.js.map +1 -1
  15. package/dist/adapters/http.d.ts.map +1 -1
  16. package/dist/adapters/http.js +28 -34
  17. package/dist/adapters/http.js.map +1 -1
  18. package/dist/api/routes.d.ts +1 -1
  19. package/dist/api/routes.d.ts.map +1 -1
  20. package/dist/api/routes.js +280 -113
  21. package/dist/api/routes.js.map +1 -1
  22. package/dist/cli/migrate.d.ts +42 -0
  23. package/dist/cli/migrate.d.ts.map +1 -0
  24. package/dist/cli/migrate.js +268 -0
  25. package/dist/cli/migrate.js.map +1 -0
  26. package/dist/cli.js +45 -1
  27. package/dist/cli.js.map +1 -1
  28. package/dist/coordination/circuit-breaker.d.ts +24 -0
  29. package/dist/coordination/circuit-breaker.d.ts.map +1 -0
  30. package/dist/coordination/circuit-breaker.js +70 -0
  31. package/dist/coordination/circuit-breaker.js.map +1 -0
  32. package/dist/coordination/failure-modes.d.ts +21 -0
  33. package/dist/coordination/failure-modes.d.ts.map +1 -0
  34. package/dist/coordination/failure-modes.js +49 -0
  35. package/dist/coordination/failure-modes.js.map +1 -0
  36. package/dist/coordination/peer-decisions.js +7 -7
  37. package/dist/coordination/routes.d.ts.map +1 -1
  38. package/dist/coordination/routes.js +44 -1
  39. package/dist/coordination/routes.js.map +1 -1
  40. package/dist/coordination/schema.d.ts.map +1 -1
  41. package/dist/coordination/schema.js +18 -0
  42. package/dist/coordination/schema.js.map +1 -1
  43. package/dist/coordination/schemas.d.ts +9 -9
  44. package/dist/coordination/stale.d.ts +9 -1
  45. package/dist/coordination/stale.d.ts.map +1 -1
  46. package/dist/coordination/stale.js +53 -9
  47. package/dist/coordination/stale.js.map +1 -1
  48. package/dist/core/embeddings.d.ts +16 -10
  49. package/dist/core/embeddings.d.ts.map +1 -1
  50. package/dist/core/embeddings.js +54 -38
  51. package/dist/core/embeddings.js.map +1 -1
  52. package/dist/core/ml-worker-entry.d.ts +17 -0
  53. package/dist/core/ml-worker-entry.d.ts.map +1 -0
  54. package/dist/core/ml-worker-entry.js +193 -0
  55. package/dist/core/ml-worker-entry.js.map +1 -0
  56. package/dist/core/ml-worker.d.ts +59 -0
  57. package/dist/core/ml-worker.d.ts.map +1 -0
  58. package/dist/core/ml-worker.js +253 -0
  59. package/dist/core/ml-worker.js.map +1 -0
  60. package/dist/core/query-expander.d.ts +13 -15
  61. package/dist/core/query-expander.d.ts.map +1 -1
  62. package/dist/core/query-expander.js +48 -54
  63. package/dist/core/query-expander.js.map +1 -1
  64. package/dist/core/reranker.d.ts +9 -19
  65. package/dist/core/reranker.d.ts.map +1 -1
  66. package/dist/core/reranker.js +33 -35
  67. package/dist/core/reranker.js.map +1 -1
  68. package/dist/core/salience.d.ts +32 -5
  69. package/dist/core/salience.d.ts.map +1 -1
  70. package/dist/core/salience.js +201 -28
  71. package/dist/core/salience.js.map +1 -1
  72. package/dist/core/write-pipeline.d.ts +128 -0
  73. package/dist/core/write-pipeline.d.ts.map +1 -0
  74. package/dist/core/write-pipeline.js +405 -0
  75. package/dist/core/write-pipeline.js.map +1 -0
  76. package/dist/engine/activation.d.ts +2 -2
  77. package/dist/engine/activation.d.ts.map +1 -1
  78. package/dist/engine/activation.js +238 -115
  79. package/dist/engine/activation.js.map +1 -1
  80. package/dist/engine/confidence.d.ts +62 -0
  81. package/dist/engine/confidence.d.ts.map +1 -0
  82. package/dist/engine/confidence.js +100 -0
  83. package/dist/engine/confidence.js.map +1 -0
  84. package/dist/engine/connections.d.ts +47 -8
  85. package/dist/engine/connections.d.ts.map +1 -1
  86. package/dist/engine/connections.js +83 -22
  87. package/dist/engine/connections.js.map +1 -1
  88. package/dist/engine/consolidation-scheduler.d.ts +46 -10
  89. package/dist/engine/consolidation-scheduler.d.ts.map +1 -1
  90. package/dist/engine/consolidation-scheduler.js +170 -50
  91. package/dist/engine/consolidation-scheduler.js.map +1 -1
  92. package/dist/engine/consolidation.d.ts +16 -2
  93. package/dist/engine/consolidation.d.ts.map +1 -1
  94. package/dist/engine/consolidation.js +143 -44
  95. package/dist/engine/consolidation.js.map +1 -1
  96. package/dist/engine/eval.d.ts +2 -2
  97. package/dist/engine/eval.d.ts.map +1 -1
  98. package/dist/engine/eval.js +9 -9
  99. package/dist/engine/eval.js.map +1 -1
  100. package/dist/engine/eviction.d.ts +4 -4
  101. package/dist/engine/eviction.d.ts.map +1 -1
  102. package/dist/engine/eviction.js +15 -15
  103. package/dist/engine/eviction.js.map +1 -1
  104. package/dist/engine/retraction.d.ts +93 -5
  105. package/dist/engine/retraction.d.ts.map +1 -1
  106. package/dist/engine/retraction.js +238 -19
  107. package/dist/engine/retraction.js.map +1 -1
  108. package/dist/engine/staging.d.ts +1 -1
  109. package/dist/engine/staging.d.ts.map +1 -1
  110. package/dist/engine/staging.js +3 -3
  111. package/dist/engine/staging.js.map +1 -1
  112. package/dist/hooks/sidecar.d.ts +1 -1
  113. package/dist/hooks/sidecar.d.ts.map +1 -1
  114. package/dist/hooks/sidecar.js +4 -4
  115. package/dist/hooks/sidecar.js.map +1 -1
  116. package/dist/index.js +48 -31
  117. package/dist/index.js.map +1 -1
  118. package/dist/mcp.js +110 -155
  119. package/dist/mcp.js.map +1 -1
  120. package/dist/storage/factory.d.ts +55 -0
  121. package/dist/storage/factory.d.ts.map +1 -0
  122. package/dist/storage/factory.js +135 -0
  123. package/dist/storage/factory.js.map +1 -0
  124. package/dist/storage/pglite-schema.d.ts +20 -0
  125. package/dist/storage/pglite-schema.d.ts.map +1 -0
  126. package/dist/storage/pglite-schema.js +165 -0
  127. package/dist/storage/pglite-schema.js.map +1 -0
  128. package/dist/storage/pglite.d.ts +187 -0
  129. package/dist/storage/pglite.d.ts.map +1 -0
  130. package/dist/storage/pglite.js +1114 -0
  131. package/dist/storage/pglite.js.map +1 -0
  132. package/dist/storage/sqlite.d.ts +117 -0
  133. package/dist/storage/sqlite.d.ts.map +1 -1
  134. package/dist/storage/sqlite.js +357 -8
  135. package/dist/storage/sqlite.js.map +1 -1
  136. package/dist/storage/store.d.ts +63 -0
  137. package/dist/storage/store.d.ts.map +1 -0
  138. package/dist/storage/store.js +27 -0
  139. package/dist/storage/store.js.map +1 -0
  140. package/dist/types/engram.d.ts +92 -2
  141. package/dist/types/engram.d.ts.map +1 -1
  142. package/dist/types/engram.js.map +1 -1
  143. package/package.json +3 -1
  144. package/src/adapters/claude-code.ts +218 -234
  145. package/src/adapters/codex.ts +252 -262
  146. package/src/adapters/common.ts +411 -284
  147. package/src/adapters/cursor.ts +135 -150
  148. package/src/adapters/http.ts +93 -100
  149. package/src/adapters/index.ts +31 -31
  150. package/src/adapters/types.ts +75 -75
  151. package/src/api/index.ts +3 -3
  152. package/src/api/routes.ts +367 -120
  153. package/src/cli/migrate.ts +307 -0
  154. package/src/cli.ts +37 -1
  155. package/src/coordination/circuit-breaker.ts +83 -0
  156. package/src/coordination/events.ts +90 -90
  157. package/src/coordination/failure-modes.ts +50 -0
  158. package/src/coordination/peer-decisions.ts +105 -105
  159. package/src/coordination/plugin-loader.ts +60 -60
  160. package/src/coordination/plugin.ts +44 -44
  161. package/src/coordination/routes.ts +56 -1
  162. package/src/coordination/schema.ts +13 -0
  163. package/src/coordination/stale.ts +80 -11
  164. package/src/coordination/types.ts +311 -311
  165. package/src/coordination/write-mutex.ts +69 -69
  166. package/src/core/auto-tagger.ts +168 -168
  167. package/src/core/decay.ts +63 -63
  168. package/src/core/embeddings.ts +110 -93
  169. package/src/core/index.ts +5 -5
  170. package/src/core/logger.ts +36 -36
  171. package/src/core/ml-worker-entry.ts +194 -0
  172. package/src/core/ml-worker.ts +281 -0
  173. package/src/core/query-expander.ts +122 -128
  174. package/src/core/reranker.ts +119 -125
  175. package/src/core/salience.ts +200 -33
  176. package/src/core/write-pipeline.ts +521 -0
  177. package/src/engine/activation.ts +235 -109
  178. package/src/engine/confidence.ts +120 -0
  179. package/src/engine/connections.ts +162 -103
  180. package/src/engine/consolidation-scheduler.ts +242 -125
  181. package/src/engine/consolidation.ts +138 -45
  182. package/src/engine/eval.ts +102 -102
  183. package/src/engine/eviction.ts +101 -101
  184. package/src/engine/index.ts +8 -8
  185. package/src/engine/retraction.ts +366 -116
  186. package/src/engine/staging.ts +74 -74
  187. package/src/hooks/sidecar.ts +5 -5
  188. package/src/index.ts +42 -28
  189. package/src/mcp.ts +105 -152
  190. package/src/storage/factory.ts +147 -0
  191. package/src/storage/index.ts +3 -3
  192. package/src/storage/pglite-schema.ts +166 -0
  193. package/src/storage/pglite.ts +1363 -0
  194. package/src/storage/sqlite.ts +402 -7
  195. package/src/storage/store.ts +80 -0
  196. package/src/types/agent.ts +67 -67
  197. package/src/types/checkpoint.ts +46 -46
  198. package/src/types/engram.ts +101 -3
  199. package/src/types/eval.ts +100 -100
  200. package/src/types/index.ts +6 -6
@@ -0,0 +1,147 @@
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Storage backend factory.
5
+ *
6
+ * Picks between SQLite (mature, full features) and PGlite (portable, async,
7
+ * pgvector). Both backends satisfy the IEngramStore contract — the cognitive
8
+ * engines work with either through `await`.
9
+ *
10
+ * AWM_STORE_BACKEND=sqlite — better-sqlite3 + FTS5 + BLOB embeddings
11
+ * AWM_STORE_BACKEND=pglite — PGlite + pgvector + tsvector
12
+ *
13
+ * **Backend selection (v0.8.5):** auto-detect on disk when the env var is
14
+ * unset, so upgrading users on existing `memory.db` files keep working
15
+ * without setting anything. Order of precedence:
16
+ *
17
+ * 1. `AWM_STORE_BACKEND` env var (explicit override — always wins).
18
+ * 2. Auto-detect: if `memory-pglite/` exists on disk → pglite.
19
+ * 3. Auto-detect: else if `memory.db` exists on disk → sqlite.
20
+ * 4. Fall back to sqlite (the default for fresh installs).
21
+ *
22
+ * If `AWM_STORE_BACKEND` is set but the on-disk state disagrees (e.g. env
23
+ * says pglite but only `memory.db` is present), `openStore` prints a one-line
24
+ * warning suggesting `awm migrate`. The env var still wins — we never
25
+ * silently switch backends behind the user's back.
26
+ *
27
+ * The `AWM_DB_PATH` env var carries the file path (SQLite) or directory
28
+ * path (PGlite). When unset, default is `memory.db` (sqlite) or
29
+ * `memory-pglite/` (pglite).
30
+ *
31
+ * **Feature parity gaps** (see `docs/pglite-feature-parity.md`):
32
+ * a few legacy code paths reach for SQLite-specific methods
33
+ * (coordination plugin needs `store.getDb()`, slim-cache warming, hot
34
+ * backups). PGlite-backed AWM is fully functional for the cognitive
35
+ * engines (write, recall, consolidation, retraction, eviction). Opt-in
36
+ * `AWM_STORE_BACKEND=pglite` skips the SQLite-only extras.
37
+ */
38
+
39
+ import { existsSync, statSync } from 'node:fs';
40
+ import type { IEngramStore } from './store.js';
41
+
42
+ export type StoreBackend = 'sqlite' | 'pglite';
43
+
44
+ /**
45
+ * Auto-detect the backend from on-disk state. Used when `AWM_STORE_BACKEND`
46
+ * is unset. Looks in the current working directory; honors `AWM_DB_PATH`
47
+ * if it points at a known shape.
48
+ */
49
+ function detectBackendFromDisk(): StoreBackend | null {
50
+ // If AWM_DB_PATH is set, infer from its shape.
51
+ const explicitPath = process.env.AWM_DB_PATH;
52
+ if (explicitPath && existsSync(explicitPath)) {
53
+ try {
54
+ const stat = statSync(explicitPath);
55
+ if (stat.isDirectory()) return 'pglite'; // PGlite uses a directory
56
+ if (stat.isFile()) return 'sqlite'; // SQLite is a single file
57
+ } catch { /* fall through */ }
58
+ }
59
+
60
+ // Otherwise look for the conventional defaults in cwd.
61
+ // PGlite directory wins over SQLite file when both exist — assume the
62
+ // user actively migrated and forgot to set the env var. We warn below.
63
+ if (existsSync('memory-pglite')) return 'pglite';
64
+ if (existsSync('memory.db')) return 'sqlite';
65
+ return null;
66
+ }
67
+
68
+ export function getConfiguredBackend(): StoreBackend {
69
+ const raw = process.env.AWM_STORE_BACKEND;
70
+ if (raw !== undefined && raw !== '') {
71
+ const normalized = raw.toLowerCase();
72
+ if (normalized === 'pglite') return 'pglite';
73
+ if (normalized === 'sqlite') return 'sqlite';
74
+ console.warn(`Unknown AWM_STORE_BACKEND=${raw}; falling back to sqlite`);
75
+ return 'sqlite';
76
+ }
77
+ // Env unset → auto-detect from on-disk state.
78
+ const detected = detectBackendFromDisk();
79
+ return detected ?? 'sqlite';
80
+ }
81
+
82
+ export function getConfiguredPath(): string {
83
+ if (process.env.AWM_DB_PATH) return process.env.AWM_DB_PATH;
84
+ return getConfiguredBackend() === 'pglite' ? 'memory-pglite' : 'memory.db';
85
+ }
86
+
87
+ /**
88
+ * Print a one-line warning to stderr when the configured backend disagrees
89
+ * with what's actually on disk. We never fail or silently switch backends
90
+ * — the explicit configuration always wins. The warning helps users notice
91
+ * that they may have stranded data on the other backend.
92
+ */
93
+ function warnIfBackendDisagreesWithDisk(backend: StoreBackend, path: string): void {
94
+ if (process.env.AWM_SUPPRESS_BACKEND_WARNINGS === '1') return;
95
+
96
+ // Only warn when env var was explicit (auto-detect already follows disk).
97
+ if (!process.env.AWM_STORE_BACKEND) return;
98
+
99
+ const otherPath = backend === 'pglite' ? 'memory.db' : 'memory-pglite';
100
+ const otherBackend = backend === 'pglite' ? 'sqlite' : 'pglite';
101
+
102
+ // The "real" check: configured target doesn't exist yet (fresh / empty) AND
103
+ // the other backend's conventional file exists with data. Likely stranded.
104
+ const configuredExists = existsSync(path);
105
+ const otherExists = existsSync(otherPath);
106
+
107
+ if (!configuredExists && otherExists) {
108
+ console.warn(
109
+ `[awm] AWM_STORE_BACKEND=${backend} but no data at "${path}". ` +
110
+ `Existing ${otherBackend} data at "${otherPath}" — run \`awm migrate\` ` +
111
+ `to convert it to ${backend}, or unset AWM_STORE_BACKEND to use ${otherBackend}. ` +
112
+ `Suppress with AWM_SUPPRESS_BACKEND_WARNINGS=1.`,
113
+ );
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Open a store using the env-configured (or auto-detected) backend and path.
119
+ * Returns the concrete store class (cast to IEngramStore at call sites
120
+ * that need the async contract; SQLite callers can keep the concrete class
121
+ * to retain access to SQLite-specific methods like getDb()).
122
+ *
123
+ * Never fails on backend/disk mismatch — only warns. Existing users
124
+ * upgrading without setting env vars get auto-detect; users on the legacy
125
+ * `memory.db` keep working without touching anything.
126
+ */
127
+ export async function openStore(): Promise<{
128
+ store: IEngramStore;
129
+ backend: StoreBackend;
130
+ path: string;
131
+ }> {
132
+ const backend = getConfiguredBackend();
133
+ const path = getConfiguredPath();
134
+
135
+ warnIfBackendDisagreesWithDisk(backend, path);
136
+
137
+ if (backend === 'pglite') {
138
+ const { PGliteEngramStore } = await import('./pglite.js');
139
+ const store = new PGliteEngramStore(path);
140
+ await store.ready();
141
+ return { store: store as unknown as IEngramStore, backend, path };
142
+ }
143
+
144
+ const { EngramStore } = await import('./sqlite.js');
145
+ const store = new EngramStore(path);
146
+ return { store: store as unknown as IEngramStore, backend, path };
147
+ }
@@ -1,3 +1,3 @@
1
- // Copyright 2026 Robert Winter / Complete Ideas
2
- // SPDX-License-Identifier: Apache-2.0
3
- export * from './sqlite.js';
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export * from './sqlite.js';
@@ -0,0 +1,166 @@
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * PGlite schema DDL — translated from the SQLite schema in sqlite.ts:init().
5
+ *
6
+ * Translation notes:
7
+ * - SQLite TEXT → Postgres TEXT
8
+ * - SQLite REAL → Postgres DOUBLE PRECISION
9
+ * - SQLite INTEGER (0/1 booleans) → Postgres BOOLEAN
10
+ * - SQLite BLOB embedding → pgvector VECTOR(384) (native)
11
+ * - SQLite FTS5 virtual table + triggers → Postgres tsvector column with
12
+ * a GIN index, kept up-to-date via a BEFORE INSERT/UPDATE trigger.
13
+ *
14
+ * All tables and indexes use IF NOT EXISTS so re-running is idempotent.
15
+ *
16
+ * The vector extension MUST be loaded before this schema runs:
17
+ * await db.exec('CREATE EXTENSION IF NOT EXISTS vector')
18
+ * PGlite's vector extension does this automatically when imported.
19
+ */
20
+
21
+ export const PGLITE_VECTOR_DIMENSIONS = parseInt(process.env.AWM_EMBED_DIMS ?? '384', 10);
22
+
23
+ export const PGLITE_SCHEMA_DDL = `
24
+ CREATE EXTENSION IF NOT EXISTS vector;
25
+
26
+ CREATE TABLE IF NOT EXISTS engrams (
27
+ id TEXT PRIMARY KEY,
28
+ agent_id TEXT NOT NULL,
29
+ concept TEXT NOT NULL,
30
+ content TEXT NOT NULL,
31
+ embedding VECTOR(${PGLITE_VECTOR_DIMENSIONS}),
32
+ embedding_model TEXT,
33
+ confidence DOUBLE PRECISION NOT NULL DEFAULT 0.5,
34
+ salience DOUBLE PRECISION NOT NULL DEFAULT 0.5,
35
+ access_count INTEGER NOT NULL DEFAULT 0,
36
+ last_accessed TEXT NOT NULL,
37
+ created_at TEXT NOT NULL,
38
+ salience_features TEXT NOT NULL DEFAULT '{}',
39
+ reason_codes TEXT NOT NULL DEFAULT '[]',
40
+ stage TEXT NOT NULL DEFAULT 'active',
41
+ ttl INTEGER,
42
+ retracted BOOLEAN NOT NULL DEFAULT FALSE,
43
+ retracted_by TEXT,
44
+ retracted_at TEXT,
45
+ tags TEXT NOT NULL DEFAULT '[]',
46
+ memory_type TEXT NOT NULL DEFAULT 'unclassified',
47
+ memory_class TEXT NOT NULL DEFAULT 'working',
48
+ superseded_by TEXT,
49
+ supersedes TEXT,
50
+ episode_id TEXT,
51
+ task_status TEXT,
52
+ task_priority TEXT,
53
+ blocked_by TEXT,
54
+ sequence INTEGER,
55
+ references_json TEXT,
56
+ fts TSVECTOR
57
+ );
58
+
59
+ CREATE INDEX IF NOT EXISTS idx_engrams_agent ON engrams(agent_id);
60
+ CREATE INDEX IF NOT EXISTS idx_engrams_stage ON engrams(agent_id, stage);
61
+ CREATE INDEX IF NOT EXISTS idx_engrams_concept ON engrams(concept);
62
+ CREATE INDEX IF NOT EXISTS idx_engrams_retracted ON engrams(agent_id, retracted);
63
+ CREATE INDEX IF NOT EXISTS idx_engrams_task ON engrams(agent_id, task_status);
64
+ CREATE INDEX IF NOT EXISTS idx_engrams_agent_sequence ON engrams(agent_id, sequence) WHERE sequence IS NOT NULL;
65
+ CREATE INDEX IF NOT EXISTS idx_engrams_fts ON engrams USING GIN(fts);
66
+
67
+ CREATE INDEX IF NOT EXISTS idx_engrams_embedding
68
+ ON engrams USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
69
+
70
+ CREATE OR REPLACE FUNCTION engrams_fts_update() RETURNS TRIGGER AS $$
71
+ BEGIN
72
+ NEW.fts := to_tsvector('english',
73
+ COALESCE(NEW.concept, '') || ' ' ||
74
+ COALESCE(NEW.content, '') || ' ' ||
75
+ COALESCE(NEW.tags, ''));
76
+ RETURN NEW;
77
+ END;
78
+ $$ LANGUAGE plpgsql;
79
+
80
+ DROP TRIGGER IF EXISTS engrams_fts_trigger ON engrams;
81
+ CREATE TRIGGER engrams_fts_trigger
82
+ BEFORE INSERT OR UPDATE OF concept, content, tags ON engrams
83
+ FOR EACH ROW EXECUTE FUNCTION engrams_fts_update();
84
+
85
+ CREATE TABLE IF NOT EXISTS associations (
86
+ id TEXT PRIMARY KEY,
87
+ from_engram_id TEXT NOT NULL REFERENCES engrams(id) ON DELETE CASCADE,
88
+ to_engram_id TEXT NOT NULL REFERENCES engrams(id) ON DELETE CASCADE,
89
+ weight DOUBLE PRECISION NOT NULL DEFAULT 0.1,
90
+ confidence DOUBLE PRECISION NOT NULL DEFAULT 0.5,
91
+ type TEXT NOT NULL DEFAULT 'hebbian',
92
+ activation_count INTEGER NOT NULL DEFAULT 0,
93
+ created_at TEXT NOT NULL,
94
+ last_activated TEXT NOT NULL
95
+ );
96
+
97
+ CREATE INDEX IF NOT EXISTS idx_assoc_from ON associations(from_engram_id);
98
+ CREATE INDEX IF NOT EXISTS idx_assoc_to ON associations(to_engram_id);
99
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_assoc_pair ON associations(from_engram_id, to_engram_id);
100
+
101
+ CREATE TABLE IF NOT EXISTS agents (
102
+ id TEXT PRIMARY KEY,
103
+ name TEXT NOT NULL,
104
+ created_at TEXT NOT NULL,
105
+ config TEXT NOT NULL DEFAULT '{}'
106
+ );
107
+
108
+ CREATE TABLE IF NOT EXISTS activation_events (
109
+ id TEXT PRIMARY KEY,
110
+ agent_id TEXT NOT NULL,
111
+ timestamp TEXT NOT NULL,
112
+ context TEXT NOT NULL,
113
+ results_returned INTEGER NOT NULL,
114
+ top_score DOUBLE PRECISION,
115
+ latency_ms DOUBLE PRECISION NOT NULL,
116
+ engram_ids TEXT NOT NULL DEFAULT '[]'
117
+ );
118
+
119
+ CREATE TABLE IF NOT EXISTS staging_events (
120
+ engram_id TEXT NOT NULL,
121
+ agent_id TEXT NOT NULL,
122
+ action TEXT NOT NULL,
123
+ resonance_score DOUBLE PRECISION,
124
+ timestamp TEXT NOT NULL,
125
+ age_ms INTEGER NOT NULL
126
+ );
127
+
128
+ CREATE TABLE IF NOT EXISTS retrieval_feedback (
129
+ id TEXT PRIMARY KEY,
130
+ activation_event_id TEXT,
131
+ engram_id TEXT NOT NULL,
132
+ useful BOOLEAN NOT NULL,
133
+ context TEXT,
134
+ timestamp TEXT NOT NULL
135
+ );
136
+
137
+ CREATE TABLE IF NOT EXISTS episodes (
138
+ id TEXT PRIMARY KEY,
139
+ agent_id TEXT NOT NULL,
140
+ label TEXT NOT NULL,
141
+ embedding VECTOR(${PGLITE_VECTOR_DIMENSIONS}),
142
+ engram_count INTEGER NOT NULL DEFAULT 0,
143
+ start_time TEXT NOT NULL,
144
+ end_time TEXT NOT NULL,
145
+ created_at TEXT NOT NULL
146
+ );
147
+
148
+ CREATE INDEX IF NOT EXISTS idx_episodes_agent ON episodes(agent_id);
149
+ CREATE INDEX IF NOT EXISTS idx_episodes_time ON episodes(agent_id, end_time);
150
+
151
+ CREATE TABLE IF NOT EXISTS conscious_state (
152
+ agent_id TEXT PRIMARY KEY,
153
+ last_write_id TEXT,
154
+ last_recall_context TEXT,
155
+ last_recall_ids TEXT NOT NULL DEFAULT '[]',
156
+ last_activity_at TEXT NOT NULL DEFAULT (to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')),
157
+ write_count_since_consolidation INTEGER NOT NULL DEFAULT 0,
158
+ recall_count_since_consolidation INTEGER NOT NULL DEFAULT 0,
159
+ execution_state TEXT,
160
+ checkpoint_at TEXT,
161
+ last_consolidation_at TEXT,
162
+ last_mini_consolidation_at TEXT,
163
+ consolidation_cycle_count INTEGER NOT NULL DEFAULT 0,
164
+ updated_at TEXT NOT NULL DEFAULT (to_char(now() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'))
165
+ );
166
+ `;