cortex-engine 0.1.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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/bin/cli.d.ts +13 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +92 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/bin/config-cmd.d.ts +12 -0
  8. package/dist/bin/config-cmd.d.ts.map +1 -0
  9. package/dist/bin/config-cmd.js +184 -0
  10. package/dist/bin/config-cmd.js.map +1 -0
  11. package/dist/bin/config-loader.d.ts +12 -0
  12. package/dist/bin/config-loader.d.ts.map +1 -0
  13. package/dist/bin/config-loader.js +42 -0
  14. package/dist/bin/config-loader.js.map +1 -0
  15. package/dist/bin/digest-cmd.d.ts +13 -0
  16. package/dist/bin/digest-cmd.d.ts.map +1 -0
  17. package/dist/bin/digest-cmd.js +286 -0
  18. package/dist/bin/digest-cmd.js.map +1 -0
  19. package/dist/bin/init.d.ts +33 -0
  20. package/dist/bin/init.d.ts.map +1 -0
  21. package/dist/bin/init.js +355 -0
  22. package/dist/bin/init.js.map +1 -0
  23. package/dist/bin/serve.d.ts +15 -0
  24. package/dist/bin/serve.d.ts.map +1 -0
  25. package/dist/bin/serve.js +21 -0
  26. package/dist/bin/serve.js.map +1 -0
  27. package/dist/bridges/bridge.d.ts +46 -0
  28. package/dist/bridges/bridge.d.ts.map +1 -0
  29. package/dist/bridges/bridge.js +128 -0
  30. package/dist/bridges/bridge.js.map +1 -0
  31. package/dist/bridges/registry.d.ts +19 -0
  32. package/dist/bridges/registry.d.ts.map +1 -0
  33. package/dist/bridges/registry.js +36 -0
  34. package/dist/bridges/registry.js.map +1 -0
  35. package/dist/core/config.d.ts +108 -0
  36. package/dist/core/config.d.ts.map +1 -0
  37. package/dist/core/config.js +29 -0
  38. package/dist/core/config.js.map +1 -0
  39. package/dist/core/embed.d.ts +16 -0
  40. package/dist/core/embed.d.ts.map +1 -0
  41. package/dist/core/embed.js +7 -0
  42. package/dist/core/embed.js.map +1 -0
  43. package/dist/core/llm.d.ts +31 -0
  44. package/dist/core/llm.d.ts.map +1 -0
  45. package/dist/core/llm.js +13 -0
  46. package/dist/core/llm.js.map +1 -0
  47. package/dist/core/nli.d.ts +26 -0
  48. package/dist/core/nli.d.ts.map +1 -0
  49. package/dist/core/nli.js +11 -0
  50. package/dist/core/nli.js.map +1 -0
  51. package/dist/core/session.d.ts +26 -0
  52. package/dist/core/session.d.ts.map +1 -0
  53. package/dist/core/session.js +71 -0
  54. package/dist/core/session.js.map +1 -0
  55. package/dist/core/store.d.ts +58 -0
  56. package/dist/core/store.d.ts.map +1 -0
  57. package/dist/core/store.js +8 -0
  58. package/dist/core/store.js.map +1 -0
  59. package/dist/core/types.d.ts +148 -0
  60. package/dist/core/types.d.ts.map +1 -0
  61. package/dist/core/types.js +8 -0
  62. package/dist/core/types.js.map +1 -0
  63. package/dist/engines/cognition.d.ts +76 -0
  64. package/dist/engines/cognition.d.ts.map +1 -0
  65. package/dist/engines/cognition.js +441 -0
  66. package/dist/engines/cognition.js.map +1 -0
  67. package/dist/engines/digest.d.ts +52 -0
  68. package/dist/engines/digest.d.ts.map +1 -0
  69. package/dist/engines/digest.js +351 -0
  70. package/dist/engines/digest.js.map +1 -0
  71. package/dist/engines/fsrs.d.ts +44 -0
  72. package/dist/engines/fsrs.d.ts.map +1 -0
  73. package/dist/engines/fsrs.js +122 -0
  74. package/dist/engines/fsrs.js.map +1 -0
  75. package/dist/engines/keywords.d.ts +12 -0
  76. package/dist/engines/keywords.d.ts.map +1 -0
  77. package/dist/engines/keywords.js +45 -0
  78. package/dist/engines/keywords.js.map +1 -0
  79. package/dist/engines/memory.d.ts +55 -0
  80. package/dist/engines/memory.d.ts.map +1 -0
  81. package/dist/engines/memory.js +147 -0
  82. package/dist/engines/memory.js.map +1 -0
  83. package/dist/index.d.ts +42 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +38 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/mcp/server.d.ts +12 -0
  88. package/dist/mcp/server.d.ts.map +1 -0
  89. package/dist/mcp/server.js +173 -0
  90. package/dist/mcp/server.js.map +1 -0
  91. package/dist/mcp/tools.d.ts +45 -0
  92. package/dist/mcp/tools.d.ts.map +1 -0
  93. package/dist/mcp/tools.js +814 -0
  94. package/dist/mcp/tools.js.map +1 -0
  95. package/dist/namespace/manager.d.ts +28 -0
  96. package/dist/namespace/manager.d.ts.map +1 -0
  97. package/dist/namespace/manager.js +73 -0
  98. package/dist/namespace/manager.js.map +1 -0
  99. package/dist/namespace/scoped-store.d.ts +43 -0
  100. package/dist/namespace/scoped-store.d.ts.map +1 -0
  101. package/dist/namespace/scoped-store.js +91 -0
  102. package/dist/namespace/scoped-store.js.map +1 -0
  103. package/dist/plugins/loader.d.ts +18 -0
  104. package/dist/plugins/loader.d.ts.map +1 -0
  105. package/dist/plugins/loader.js +71 -0
  106. package/dist/plugins/loader.js.map +1 -0
  107. package/dist/providers/nli-http.d.ts +34 -0
  108. package/dist/providers/nli-http.d.ts.map +1 -0
  109. package/dist/providers/nli-http.js +83 -0
  110. package/dist/providers/nli-http.js.map +1 -0
  111. package/dist/providers/ollama.d.ts +37 -0
  112. package/dist/providers/ollama.d.ts.map +1 -0
  113. package/dist/providers/ollama.js +103 -0
  114. package/dist/providers/ollama.js.map +1 -0
  115. package/dist/providers/vertex-embed.d.ts +38 -0
  116. package/dist/providers/vertex-embed.d.ts.map +1 -0
  117. package/dist/providers/vertex-embed.js +69 -0
  118. package/dist/providers/vertex-embed.js.map +1 -0
  119. package/dist/providers/vertex-llm.d.ts +25 -0
  120. package/dist/providers/vertex-llm.d.ts.map +1 -0
  121. package/dist/providers/vertex-llm.js +75 -0
  122. package/dist/providers/vertex-llm.js.map +1 -0
  123. package/dist/stores/firestore.d.ts +59 -0
  124. package/dist/stores/firestore.d.ts.map +1 -0
  125. package/dist/stores/firestore.js +530 -0
  126. package/dist/stores/firestore.js.map +1 -0
  127. package/dist/stores/sqlite.d.ts +43 -0
  128. package/dist/stores/sqlite.d.ts.map +1 -0
  129. package/dist/stores/sqlite.js +593 -0
  130. package/dist/stores/sqlite.js.map +1 -0
  131. package/dist/triggers/pipeline.d.ts +21 -0
  132. package/dist/triggers/pipeline.d.ts.map +1 -0
  133. package/dist/triggers/pipeline.js +30 -0
  134. package/dist/triggers/pipeline.js.map +1 -0
  135. package/dist/triggers/registry.d.ts +17 -0
  136. package/dist/triggers/registry.d.ts.map +1 -0
  137. package/dist/triggers/registry.js +32 -0
  138. package/dist/triggers/registry.js.map +1 -0
  139. package/package.json +94 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Cognition engine — 7-phase dream consolidation cycle.
3
+ *
4
+ * Implements the full dream cycle as pure functions: storage-agnostic,
5
+ * provider-injected. Each phase is isolated so a single phase failure
6
+ * does not abort the whole cycle.
7
+ *
8
+ * Phases:
9
+ * 1. Cluster — route unprocessed observations to nearest memories
10
+ * 2. Refine — update memory definitions from new observations
11
+ * 3. Create — promote unclustered observations to new memories
12
+ * 4. Connect — discover edges between recently active memories
13
+ * 5. Score — FSRS passive review for memories in review/learning
14
+ * 6. Abstract — REM cross-domain pattern synthesis
15
+ * 7. Report — narrative summary of the full cycle
16
+ */
17
+ import type { CortexStore } from '../core/store.js';
18
+ import type { EmbedProvider } from '../core/embed.js';
19
+ import type { LLMProvider } from '../core/llm.js';
20
+ export interface DreamResult {
21
+ phases: {
22
+ cluster: {
23
+ clustered: number;
24
+ unclustered: number;
25
+ };
26
+ refine: {
27
+ refined: number;
28
+ };
29
+ create: {
30
+ created: number;
31
+ };
32
+ connect: {
33
+ edges_discovered: number;
34
+ };
35
+ score: {
36
+ scored: number;
37
+ };
38
+ report: {
39
+ text: string;
40
+ };
41
+ abstract: {
42
+ abstractions: number;
43
+ };
44
+ };
45
+ total_processed: number;
46
+ duration_ms: number;
47
+ /** clustered / (clustered + unclustered) */
48
+ integration_rate: number;
49
+ }
50
+ export interface DreamOptions {
51
+ /** Max observations to process in cluster phase (default: 50) */
52
+ observation_limit?: number;
53
+ /** Max unclustered to create as memories (default: 10) */
54
+ create_limit?: number;
55
+ /** Max abstraction attempts in REM phase (default: 5) */
56
+ abstraction_attempts?: number;
57
+ /** Similarity threshold for clustering (default: 0.70) */
58
+ cluster_threshold?: number;
59
+ /** Similarity threshold for detecting duplicate abstractions (default: 0.88) */
60
+ abstraction_novelty_threshold?: number;
61
+ /** Namespace config merge threshold */
62
+ similarity_merge?: number;
63
+ /** Namespace config link threshold */
64
+ similarity_link?: number;
65
+ }
66
+ /**
67
+ * Run the full 7-phase dream consolidation cycle.
68
+ *
69
+ * Phase ordering:
70
+ * 1 Cluster → 2 Refine → 3 Create → 4 Connect → 5 Score → 6 Abstract → 7 Report
71
+ *
72
+ * Report runs last so it can include abstraction stats.
73
+ * A phase error is caught internally — the cycle continues with degraded output.
74
+ */
75
+ export declare function dreamConsolidate(store: CortexStore, embed: EmbedProvider, llm: LLMProvider, options?: DreamOptions): Promise<DreamResult>;
76
+ //# sourceMappingURL=cognition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cognition.d.ts","sourceRoot":"","sources":["../../src/engines/cognition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOlD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;QACpD,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5B,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5B,OAAO,EAAE;YAAE,gBAAgB,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1B,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACzB,QAAQ,EAAE;YAAE,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;KACpC,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkhBD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAwDtB"}
@@ -0,0 +1,441 @@
1
+ /**
2
+ * Cognition engine — 7-phase dream consolidation cycle.
3
+ *
4
+ * Implements the full dream cycle as pure functions: storage-agnostic,
5
+ * provider-injected. Each phase is isolated so a single phase failure
6
+ * does not abort the whole cycle.
7
+ *
8
+ * Phases:
9
+ * 1. Cluster — route unprocessed observations to nearest memories
10
+ * 2. Refine — update memory definitions from new observations
11
+ * 3. Create — promote unclustered observations to new memories
12
+ * 4. Connect — discover edges between recently active memories
13
+ * 5. Score — FSRS passive review for memories in review/learning
14
+ * 6. Abstract — REM cross-domain pattern synthesis
15
+ * 7. Report — narrative summary of the full cycle
16
+ */
17
+ import { extractKeywords } from './keywords.js';
18
+ import { scheduleNext, newFSRSState, elapsedDaysSince } from './fsrs.js';
19
+ // ─── Phase 1: Cluster ─────────────────────────────────────────────────────────
20
+ /**
21
+ * Route unprocessed observations to the nearest existing memory.
22
+ * Observations above cluster_threshold are linked and marked processed.
23
+ * The rest are returned as unclustered for later phases.
24
+ */
25
+ async function clusterObservations(store, _embed, options) {
26
+ const limit = options.observation_limit ?? 50;
27
+ const threshold = options.cluster_threshold ?? 0.70;
28
+ let clustered = 0;
29
+ const unclusteredObs = [];
30
+ let observations;
31
+ try {
32
+ observations = await store.getUnprocessedObservations(limit);
33
+ }
34
+ catch {
35
+ return { clustered: 0, unclustered: 0, unclusteredObs: [] };
36
+ }
37
+ for (const obs of observations) {
38
+ // Skip observations without embeddings — nothing to cluster on.
39
+ if (!obs.embedding || obs.embedding.length === 0) {
40
+ unclusteredObs.push(obs);
41
+ continue;
42
+ }
43
+ try {
44
+ const nearest = await store.findNearest(obs.embedding, 1);
45
+ if (nearest.length > 0 && nearest[0].score >= threshold) {
46
+ const nearestMemoryId = nearest[0].memory.id;
47
+ // Bump the memory's access count to reflect the clustering.
48
+ // No edge needed — the observation→memory relationship is implicit
49
+ // in the processing, and self-referential edges are useless noise.
50
+ await store.touchMemory(nearestMemoryId, {});
51
+ await store.markObservationProcessed(obs.id);
52
+ clustered++;
53
+ }
54
+ else {
55
+ unclusteredObs.push(obs);
56
+ }
57
+ }
58
+ catch {
59
+ // Don't let a single observation kill the phase.
60
+ unclusteredObs.push(obs);
61
+ }
62
+ }
63
+ return {
64
+ clustered,
65
+ unclustered: unclusteredObs.length,
66
+ unclusteredObs,
67
+ };
68
+ }
69
+ // ─── Phase 2: Refine ──────────────────────────────────────────────────────────
70
+ /**
71
+ * For memories accessed recently that have accumulated new clustered observations,
72
+ * ask the LLM to rewrite the definition incorporating the new evidence.
73
+ */
74
+ async function refineMemories(store, embed, llm, _options) {
75
+ let refined = 0;
76
+ let allMemories;
77
+ try {
78
+ allMemories = await store.getAllMemories();
79
+ }
80
+ catch {
81
+ return { refined: 0 };
82
+ }
83
+ const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
84
+ // Find memories accessed in the last 7 days.
85
+ const recentMemories = allMemories.filter((m) => m.last_accessed.getTime() >= sevenDaysAgo);
86
+ for (const memory of recentMemories) {
87
+ try {
88
+ // Fetch edges with relation 'related' that reference this memory.
89
+ const edges = await store.getEdgesFrom(memory.id);
90
+ const relatedEdges = edges.filter((e) => e.relation === 'related');
91
+ if (relatedEdges.length === 0)
92
+ continue;
93
+ // Use edge evidence as the observation content for refinement.
94
+ const observationSnippets = relatedEdges
95
+ .slice(0, 10)
96
+ .map((e) => `- ${e.evidence}`)
97
+ .join('\n');
98
+ const prompt = `You are refining a memory concept based on new observations.\n\n` +
99
+ `Current definition: ${memory.definition}\n\n` +
100
+ `New observations:\n${observationSnippets}\n\n` +
101
+ `Write an improved definition that incorporates the new observations. Keep it concise (2-4 sentences). Do not include any preamble.`;
102
+ const newDefinition = await llm.generate(prompt, {
103
+ temperature: 0.1,
104
+ maxTokens: 300,
105
+ });
106
+ if (!newDefinition || newDefinition.trim() === memory.definition.trim())
107
+ continue;
108
+ // Log the belief change before updating.
109
+ await store.putBelief({
110
+ concept_id: memory.id,
111
+ old_definition: memory.definition,
112
+ new_definition: newDefinition.trim(),
113
+ reason: `Dream refinement from ${relatedEdges.length} observations`,
114
+ changed_at: new Date(),
115
+ });
116
+ // Re-embed the refined definition.
117
+ const newEmbedding = await embed.embed(newDefinition.trim());
118
+ await store.updateMemory(memory.id, {
119
+ definition: newDefinition.trim(),
120
+ embedding: newEmbedding,
121
+ updated_at: new Date(),
122
+ });
123
+ refined++;
124
+ }
125
+ catch {
126
+ // One memory failing to refine should not stop the rest.
127
+ continue;
128
+ }
129
+ }
130
+ return { refined };
131
+ }
132
+ // ─── Phase 3: Create ──────────────────────────────────────────────────────────
133
+ /**
134
+ * Promote unclustered observations to first-class memories.
135
+ * Category is inferred by the LLM; embedding reuses the observation's.
136
+ */
137
+ async function createFromUnclustered(store, embed, llm, unclusteredObs, options) {
138
+ const createLimit = options.create_limit ?? 10;
139
+ let created = 0;
140
+ const candidates = unclusteredObs.slice(0, createLimit);
141
+ for (const obs of candidates) {
142
+ try {
143
+ const categoryPrompt = `Classify this text into exactly one category: belief, pattern, entity, topic, value, project, insight, observation.\n\n` +
144
+ `Text: ${obs.content}\n\n` +
145
+ `Respond with only the category name, nothing else.`;
146
+ const rawCategory = await llm.generate(categoryPrompt, {
147
+ temperature: 0,
148
+ maxTokens: 20,
149
+ });
150
+ const validCategories = [
151
+ 'belief', 'pattern', 'entity', 'topic', 'value', 'project', 'insight', 'observation',
152
+ ];
153
+ const inferred = rawCategory.trim().toLowerCase();
154
+ const category = validCategories.includes(inferred) ? inferred : 'observation';
155
+ // Reuse existing embedding or generate a fresh one.
156
+ let embedding = obs.embedding;
157
+ if (!embedding || embedding.length === 0) {
158
+ embedding = await embed.embed(obs.content);
159
+ }
160
+ const name = obs.content.length > 60
161
+ ? obs.content.slice(0, 60)
162
+ : obs.content;
163
+ await store.putMemory({
164
+ name,
165
+ definition: obs.content,
166
+ category,
167
+ salience: obs.salience,
168
+ confidence: 0.5,
169
+ access_count: 0,
170
+ created_at: new Date(),
171
+ updated_at: new Date(),
172
+ last_accessed: new Date(),
173
+ source_files: obs.source_file ? [obs.source_file] : [],
174
+ embedding,
175
+ tags: obs.keywords.length > 0 ? obs.keywords : extractKeywords(obs.content),
176
+ fsrs: newFSRSState(),
177
+ });
178
+ await store.markObservationProcessed(obs.id);
179
+ created++;
180
+ }
181
+ catch {
182
+ continue;
183
+ }
184
+ }
185
+ return { created };
186
+ }
187
+ /**
188
+ * For recently updated memories, check each pair and create edges when
189
+ * the LLM detects a meaningful relationship that does not yet exist.
190
+ */
191
+ async function discoverEdges(store, llm, _options) {
192
+ let edges_discovered = 0;
193
+ let allMemories;
194
+ try {
195
+ allMemories = await store.getAllMemories();
196
+ }
197
+ catch {
198
+ return { edges_discovered: 0 };
199
+ }
200
+ const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
201
+ const recent = allMemories
202
+ .filter((m) => m.updated_at.getTime() >= sevenDaysAgo)
203
+ .slice(0, 15); // cap to avoid O(n²) explosion
204
+ if (recent.length < 2)
205
+ return { edges_discovered: 0 };
206
+ for (let i = 0; i < recent.length; i++) {
207
+ for (let j = i + 1; j < recent.length; j++) {
208
+ const memA = recent[i];
209
+ const memB = recent[j];
210
+ try {
211
+ // Check if an edge already exists in either direction.
212
+ const edgesFromA = await store.getEdgesFrom(memA.id);
213
+ const alreadyConnected = edgesFromA.some((e) => e.target_id === memB.id || e.source_id === memB.id);
214
+ if (alreadyConnected)
215
+ continue;
216
+ const prompt = `Do these two concepts have a meaningful relationship?\n\n` +
217
+ `Concept A: ${memA.name} — ${memA.definition}\n` +
218
+ `Concept B: ${memB.name} — ${memB.definition}\n\n` +
219
+ `If yes, respond with JSON: {"relation": "extends|refines|contradicts|tensions-with|questions|supports|exemplifies|caused|related", "evidence": "brief explanation"}\n` +
220
+ `If no meaningful relationship, respond with: {"relation": null}`;
221
+ const result = await llm.generateJSON(prompt, {
222
+ temperature: 0.2,
223
+ });
224
+ if (result.relation !== null && result.relation !== undefined) {
225
+ const validRelations = [
226
+ 'extends', 'refines', 'contradicts', 'tensions-with',
227
+ 'questions', 'supports', 'exemplifies', 'caused', 'related',
228
+ ];
229
+ if (!validRelations.includes(result.relation))
230
+ continue;
231
+ await store.putEdge({
232
+ source_id: memA.id,
233
+ target_id: memB.id,
234
+ relation: result.relation,
235
+ weight: 0.7,
236
+ evidence: result.evidence ?? '',
237
+ created_at: new Date(),
238
+ });
239
+ edges_discovered++;
240
+ }
241
+ }
242
+ catch {
243
+ continue;
244
+ }
245
+ }
246
+ }
247
+ return { edges_discovered };
248
+ }
249
+ // ─── Phase 5: Score ───────────────────────────────────────────────────────────
250
+ /**
251
+ * Passive FSRS review for memories currently in 'review' or 'learning' state.
252
+ * Recent access = rating 3 (Good); otherwise rating 2 (Hard).
253
+ */
254
+ async function scoreMemories(store, _options) {
255
+ let scored = 0;
256
+ let allMemories;
257
+ try {
258
+ allMemories = await store.getAllMemories();
259
+ }
260
+ catch {
261
+ return { scored: 0 };
262
+ }
263
+ const threeDaysAgo = Date.now() - 3 * 24 * 60 * 60 * 1000;
264
+ const reviewable = allMemories.filter((m) => m.fsrs.state === 'review' || m.fsrs.state === 'learning');
265
+ for (const memory of reviewable) {
266
+ try {
267
+ const elapsed = elapsedDaysSince(memory.fsrs.last_review);
268
+ const recentlyAccessed = memory.last_accessed.getTime() >= threeDaysAgo;
269
+ const rating = recentlyAccessed ? 3 : 2;
270
+ const scheduled = scheduleNext(memory.fsrs, rating, elapsed);
271
+ await store.touchMemory(memory.id, {
272
+ stability: scheduled.stability,
273
+ difficulty: scheduled.difficulty,
274
+ reps: memory.fsrs.reps + 1,
275
+ lapses: memory.fsrs.lapses,
276
+ state: scheduled.state,
277
+ last_review: new Date(),
278
+ });
279
+ scored++;
280
+ }
281
+ catch {
282
+ continue;
283
+ }
284
+ }
285
+ return { scored };
286
+ }
287
+ // ─── Phase 6: Abstract (REM) ──────────────────────────────────────────────────
288
+ /**
289
+ * REM sleep phase: sample recent memories across categories and attempt
290
+ * to synthesize higher-level cross-domain abstractions.
291
+ */
292
+ async function abstractCrossDomain(store, embed, llm, options) {
293
+ const attempts = options.abstraction_attempts ?? 5;
294
+ const noveltyThreshold = options.abstraction_novelty_threshold ?? 0.88;
295
+ let abstractions = 0;
296
+ let allMemories;
297
+ try {
298
+ allMemories = await store.getAllMemories();
299
+ }
300
+ catch {
301
+ return { abstractions: 0 };
302
+ }
303
+ // Work from 60 most recently updated memories.
304
+ const recent = allMemories
305
+ .sort((a, b) => b.updated_at.getTime() - a.updated_at.getTime())
306
+ .slice(0, 60);
307
+ // Group by category.
308
+ const byCategory = new Map();
309
+ for (const m of recent) {
310
+ const group = byCategory.get(m.category) ?? [];
311
+ group.push(m);
312
+ byCategory.set(m.category, group);
313
+ }
314
+ const categories = Array.from(byCategory.keys());
315
+ if (categories.length < 3)
316
+ return { abstractions: 0 };
317
+ for (let attempt = 0; attempt < attempts; attempt++) {
318
+ try {
319
+ // Pick 4 different random categories (or as many as available, min 3).
320
+ const shuffled = categories.sort(() => Math.random() - 0.5);
321
+ const selected = shuffled.slice(0, Math.min(4, shuffled.length));
322
+ // Pick one random memory from each selected category.
323
+ const sampledMemories = selected.map((cat) => {
324
+ const group = byCategory.get(cat);
325
+ return group[Math.floor(Math.random() * group.length)];
326
+ });
327
+ const conceptLines = sampledMemories
328
+ .map((m) => `[${m.category}] ${m.name}: ${m.definition}`)
329
+ .join('\n\n');
330
+ const prompt = `Find a higher-level principle or pattern that connects these diverse concepts:\n\n` +
331
+ `${conceptLines}\n\n` +
332
+ `Write a concise abstraction (1-2 sentences) that captures the deeper connection. ` +
333
+ `If no meaningful connection exists, respond with 'NO_ABSTRACTION'.`;
334
+ const result = await llm.generate(prompt, {
335
+ temperature: 0.4,
336
+ maxTokens: 200,
337
+ });
338
+ const trimmed = result.trim();
339
+ if (!trimmed || trimmed === 'NO_ABSTRACTION')
340
+ continue;
341
+ // Check novelty — don't store abstractions too similar to existing memories.
342
+ const abstEmbedding = await embed.embed(trimmed);
343
+ const nearest = await store.findNearest(abstEmbedding, 1);
344
+ if (nearest.length > 0 && nearest[0].score >= noveltyThreshold) {
345
+ // Too similar to an existing memory — skip.
346
+ continue;
347
+ }
348
+ await store.putMemory({
349
+ name: trimmed.length > 60 ? trimmed.slice(0, 60) : trimmed,
350
+ definition: trimmed,
351
+ category: 'insight',
352
+ salience: 0.8,
353
+ confidence: 0.6,
354
+ access_count: 0,
355
+ created_at: new Date(),
356
+ updated_at: new Date(),
357
+ last_accessed: new Date(),
358
+ source_files: [],
359
+ embedding: abstEmbedding,
360
+ tags: extractKeywords(trimmed),
361
+ fsrs: newFSRSState(),
362
+ });
363
+ abstractions++;
364
+ }
365
+ catch {
366
+ continue;
367
+ }
368
+ }
369
+ return { abstractions };
370
+ }
371
+ // ─── Phase 7: Report ──────────────────────────────────────────────────────────
372
+ /**
373
+ * Generate a human-readable narrative of what the dream cycle accomplished.
374
+ * Called last so it can include abstraction count.
375
+ */
376
+ async function generateReport(llm, cluster, refine, create, connect, score, abstract) {
377
+ try {
378
+ const prompt = `Summarize this dream consolidation session in 2-3 sentences.\n\n` +
379
+ `Stats: ${cluster.clustered} observations clustered, ${refine.refined} memories refined, ` +
380
+ `${create.created} new memories created, ${connect.edges_discovered} edges discovered, ` +
381
+ `${score.scored} memories reviewed, ${abstract.abstractions} abstractions formed.\n\n` +
382
+ `Write a brief, reflective summary of what was learned and consolidated.`;
383
+ const text = await llm.generate(prompt, {
384
+ temperature: 0.7,
385
+ maxTokens: 200,
386
+ });
387
+ return { text: text.trim() };
388
+ }
389
+ catch {
390
+ const fallback = `Dream cycle complete. ` +
391
+ `Clustered ${cluster.clustered} observations, refined ${refine.refined} memories, ` +
392
+ `created ${create.created} new memories, discovered ${connect.edges_discovered} edges, ` +
393
+ `reviewed ${score.scored} memories, formed ${abstract.abstractions} abstractions.`;
394
+ return { text: fallback };
395
+ }
396
+ }
397
+ // ─── Main: dreamConsolidate ───────────────────────────────────────────────────
398
+ /**
399
+ * Run the full 7-phase dream consolidation cycle.
400
+ *
401
+ * Phase ordering:
402
+ * 1 Cluster → 2 Refine → 3 Create → 4 Connect → 5 Score → 6 Abstract → 7 Report
403
+ *
404
+ * Report runs last so it can include abstraction stats.
405
+ * A phase error is caught internally — the cycle continues with degraded output.
406
+ */
407
+ export async function dreamConsolidate(store, embed, llm, options = {}) {
408
+ const start = Date.now();
409
+ // Phase 1 — Cluster
410
+ const clusterResult = await clusterObservations(store, embed, options);
411
+ // Phase 2 — Refine
412
+ const refineResult = await refineMemories(store, embed, llm, options);
413
+ // Phase 3 — Create
414
+ const createResult = await createFromUnclustered(store, embed, llm, clusterResult.unclusteredObs, options);
415
+ // Phase 4 — Connect
416
+ const connectResult = await discoverEdges(store, llm, options);
417
+ // Phase 5 — Score
418
+ const scoreResult = await scoreMemories(store, options);
419
+ // Phase 6 — Abstract (REM)
420
+ const abstractResult = await abstractCrossDomain(store, embed, llm, options);
421
+ // Phase 7 — Report (runs after abstract to include abstraction count)
422
+ const reportResult = await generateReport(llm, clusterResult, refineResult, createResult, connectResult, scoreResult, abstractResult);
423
+ const duration_ms = Date.now() - start;
424
+ const total = clusterResult.clustered + clusterResult.unclustered;
425
+ const integration_rate = total > 0 ? clusterResult.clustered / total : 0;
426
+ return {
427
+ phases: {
428
+ cluster: { clustered: clusterResult.clustered, unclustered: clusterResult.unclustered },
429
+ refine: { refined: refineResult.refined },
430
+ create: { created: createResult.created },
431
+ connect: { edges_discovered: connectResult.edges_discovered },
432
+ score: { scored: scoreResult.scored },
433
+ report: { text: reportResult.text },
434
+ abstract: { abstractions: abstractResult.abstractions },
435
+ },
436
+ total_processed: clusterResult.clustered + createResult.created,
437
+ duration_ms,
438
+ integration_rate,
439
+ };
440
+ }
441
+ //# sourceMappingURL=cognition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cognition.js","sourceRoot":"","sources":["../../src/engines/cognition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Digest engine — document ingestion pipeline for cortex.
3
+ *
4
+ * Takes raw document content (markdown with optional YAML frontmatter) and
5
+ * runs it through a configurable pipeline of cognitive steps. Each step is
6
+ * isolated in a try/catch so a single failure does not abort the pipeline.
7
+ *
8
+ * Pipeline steps:
9
+ * observe — embed and store content as observations (with prediction error gating)
10
+ * reflect — generate LLM insights connecting content to existing memories
11
+ * predict — extract forward-looking claims and store as prediction observations
12
+ */
13
+ import type { CortexStore } from '../core/store.js';
14
+ import type { EmbedProvider } from '../core/embed.js';
15
+ import type { LLMProvider } from '../core/llm.js';
16
+ export interface DigestOptions {
17
+ /** Pipeline of cognitive steps. Default: ['observe', 'reflect'] */
18
+ pipeline?: string[];
19
+ /** Target namespace (default: 'default') */
20
+ namespace?: string;
21
+ /** Source file path for provenance */
22
+ source_file?: string;
23
+ /** Salience override (default: auto-detect from content) */
24
+ salience?: number;
25
+ }
26
+ export interface DigestResult {
27
+ /** IDs of observations created */
28
+ observation_ids: string[];
29
+ /** Memories that were linked or created */
30
+ memories_linked: string[];
31
+ /** Insights generated during reflect step */
32
+ insights: string[];
33
+ /** Pipeline steps that ran */
34
+ pipeline_executed: string[];
35
+ /** Timestamp of processing */
36
+ processed_at: Date;
37
+ /** Duration in ms */
38
+ duration_ms: number;
39
+ }
40
+ /**
41
+ * Process a document through the cortex ingestion pipeline.
42
+ *
43
+ * Parses frontmatter, detects salience, then runs each requested pipeline step
44
+ * in sequence. Steps are isolated — a single step failure does not abort the
45
+ * pipeline; it is logged as skipped.
46
+ *
47
+ * Supported steps: 'observe', 'reflect', 'predict'
48
+ * Unknown steps are silently skipped and recorded in pipeline_executed as
49
+ * 'skipped:<name>'.
50
+ */
51
+ export declare function digestDocument(content: string, store: CortexStore, embed: EmbedProvider, llm: LLMProvider, options?: DigestOptions): Promise<DigestResult>;
52
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/engines/digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,2CAA2C;IAC3C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8BAA8B;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,8BAA8B;IAC9B,YAAY,EAAE,IAAI,CAAC;IACnB,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAiVD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,WAAW,EAChB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC,CAqFvB"}