stellar-memory 0.8.3 → 1.0.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/dist/api/routes/memories.js +5 -4
- package/dist/api/routes/memories.js.map +1 -1
- package/dist/api/websocket.d.ts +0 -6
- package/dist/api/websocket.js +1 -1
- package/dist/api/websocket.js.map +1 -1
- package/dist/engine/analytics.js +4 -33
- package/dist/engine/analytics.js.map +1 -1
- package/dist/engine/conflict.js +2 -4
- package/dist/engine/conflict.js.map +1 -1
- package/dist/engine/consolidation.js +3 -21
- package/dist/engine/consolidation.js.map +1 -1
- package/dist/engine/constellation.js +6 -14
- package/dist/engine/constellation.js.map +1 -1
- package/dist/engine/corona.js +3 -1
- package/dist/engine/corona.js.map +1 -1
- package/dist/engine/multiproject.js +6 -73
- package/dist/engine/multiproject.js.map +1 -1
- package/dist/engine/observation.d.ts +1 -42
- package/dist/engine/observation.js +4 -23
- package/dist/engine/observation.js.map +1 -1
- package/dist/engine/orbit.js +50 -11
- package/dist/engine/orbit.js.map +1 -1
- package/dist/engine/planet.d.ts +3 -0
- package/dist/engine/planet.js +16 -11
- package/dist/engine/planet.js.map +1 -1
- package/dist/engine/procedural.d.ts +0 -13
- package/dist/engine/procedural.js +2 -47
- package/dist/engine/procedural.js.map +1 -1
- package/dist/engine/services/commit-service.d.ts +29 -0
- package/dist/engine/services/commit-service.js +35 -0
- package/dist/engine/services/commit-service.js.map +1 -0
- package/dist/engine/services/index.d.ts +4 -0
- package/dist/engine/services/index.js +4 -0
- package/dist/engine/services/index.js.map +1 -0
- package/dist/engine/services/memory-service.d.ts +48 -0
- package/dist/engine/services/memory-service.js +85 -0
- package/dist/engine/services/memory-service.js.map +1 -0
- package/dist/engine/services/recall-service.d.ts +31 -0
- package/dist/engine/services/recall-service.js +35 -0
- package/dist/engine/services/recall-service.js.map +1 -0
- package/dist/engine/session-policy.d.ts +15 -0
- package/dist/engine/session-policy.js +103 -0
- package/dist/engine/session-policy.js.map +1 -0
- package/dist/engine/sun.d.ts +9 -5
- package/dist/engine/sun.js +128 -23
- package/dist/engine/sun.js.map +1 -1
- package/dist/engine/temporal.js +8 -67
- package/dist/engine/temporal.js.map +1 -1
- package/dist/engine/types.d.ts +0 -15
- package/dist/engine/types.js +0 -7
- package/dist/engine/types.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +88 -123
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/analytics-handlers.d.ts +20 -0
- package/dist/mcp/tools/analytics-handlers.js +292 -0
- package/dist/mcp/tools/analytics-handlers.js.map +1 -0
- package/dist/mcp/tools/graph-handlers.d.ts +20 -0
- package/dist/mcp/tools/graph-handlers.js +126 -0
- package/dist/mcp/tools/graph-handlers.js.map +1 -0
- package/dist/mcp/tools/memory-handlers.d.ts +27 -0
- package/dist/mcp/tools/memory-handlers.js +177 -0
- package/dist/mcp/tools/memory-handlers.js.map +1 -0
- package/dist/mcp/tools/memory-tools.d.ts +19 -117
- package/dist/mcp/tools/memory-tools.js +19 -1032
- package/dist/mcp/tools/memory-tools.js.map +1 -1
- package/dist/mcp/tools/observation-handlers.d.ts +15 -0
- package/dist/mcp/tools/observation-handlers.js +74 -0
- package/dist/mcp/tools/observation-handlers.js.map +1 -0
- package/dist/mcp/tools/shared.d.ts +36 -0
- package/dist/mcp/tools/shared.js +71 -0
- package/dist/mcp/tools/shared.js.map +1 -0
- package/dist/mcp/tools/sun-handler.d.ts +12 -0
- package/dist/mcp/tools/sun-handler.js +35 -0
- package/dist/mcp/tools/sun-handler.js.map +1 -0
- package/dist/mcp/tools/system-handlers.d.ts +27 -0
- package/dist/mcp/tools/system-handlers.js +259 -0
- package/dist/mcp/tools/system-handlers.js.map +1 -0
- package/dist/mcp/tools/temporal-handlers.d.ts +15 -0
- package/dist/mcp/tools/temporal-handlers.js +82 -0
- package/dist/mcp/tools/temporal-handlers.js.map +1 -0
- package/dist/scanner/local/filesystem.d.ts +0 -2
- package/dist/scanner/local/filesystem.js +1 -5
- package/dist/scanner/local/filesystem.js.map +1 -1
- package/dist/scanner/local/git.d.ts +0 -5
- package/dist/scanner/local/git.js +1 -1
- package/dist/scanner/local/git.js.map +1 -1
- package/dist/scanner/metadata-scanner.d.ts +3 -14
- package/dist/scanner/metadata-scanner.js +10 -10
- package/dist/scanner/metadata-scanner.js.map +1 -1
- package/dist/service/scheduler.js +32 -13
- package/dist/service/scheduler.js.map +1 -1
- package/dist/storage/database.js +81 -2
- package/dist/storage/database.js.map +1 -1
- package/dist/storage/queries/analytics-queries.d.ts +59 -0
- package/dist/storage/queries/analytics-queries.js +265 -0
- package/dist/storage/queries/analytics-queries.js.map +1 -0
- package/dist/storage/queries/conflict-queries.d.ts +16 -0
- package/dist/storage/queries/conflict-queries.js +56 -0
- package/dist/storage/queries/conflict-queries.js.map +1 -0
- package/dist/storage/queries/constellation-queries.d.ts +18 -0
- package/dist/storage/queries/constellation-queries.js +101 -0
- package/dist/storage/queries/constellation-queries.js.map +1 -0
- package/dist/storage/queries/datasource-queries.d.ts +9 -0
- package/dist/storage/queries/datasource-queries.js +53 -0
- package/dist/storage/queries/datasource-queries.js.map +1 -0
- package/dist/storage/queries/memory-queries.d.ts +53 -0
- package/dist/storage/queries/memory-queries.js +415 -0
- package/dist/storage/queries/memory-queries.js.map +1 -0
- package/dist/storage/queries/observation-queries.d.ts +7 -0
- package/dist/storage/queries/observation-queries.js +23 -0
- package/dist/storage/queries/observation-queries.js.map +1 -0
- package/dist/storage/queries/orbit-queries.d.ts +7 -0
- package/dist/storage/queries/orbit-queries.js +23 -0
- package/dist/storage/queries/orbit-queries.js.map +1 -0
- package/dist/storage/queries/shared.d.ts +106 -0
- package/dist/storage/queries/shared.js +120 -0
- package/dist/storage/queries/shared.js.map +1 -0
- package/dist/storage/queries/sun-queries.d.ts +9 -0
- package/dist/storage/queries/sun-queries.js +43 -0
- package/dist/storage/queries/sun-queries.js.map +1 -0
- package/dist/storage/queries/temporal-queries.d.ts +32 -0
- package/dist/storage/queries/temporal-queries.js +112 -0
- package/dist/storage/queries/temporal-queries.js.map +1 -0
- package/dist/storage/queries.d.ts +15 -84
- package/dist/storage/queries.js +15 -896
- package/dist/storage/queries.js.map +1 -1
- package/dist/storage/vec.d.ts +5 -1
- package/dist/storage/vec.js +48 -24
- package/dist/storage/vec.js.map +1 -1
- package/dist/utils/config.d.ts +0 -1
- package/dist/utils/config.js +1 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/logger.d.ts +0 -2
- package/dist/utils/logger.js +0 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/stopwords.d.ts +6 -0
- package/dist/utils/stopwords.js +22 -0
- package/dist/utils/stopwords.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +2 -1
- package/dist/utils/tokenizer.js +7 -5
- package/dist/utils/tokenizer.js.map +1 -1
- package/package.json +78 -78
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { randomUUID, createHash } from 'node:crypto';
|
|
15
15
|
import { getMemoriesByProject, insertMemory } from '../storage/queries.js';
|
|
16
16
|
import { getConfig } from '../utils/config.js';
|
|
17
|
+
import { STOP_WORDS } from '../utils/stopwords.js';
|
|
17
18
|
import { recencyScore, frequencyScore, importanceToDistance, } from './orbit.js';
|
|
18
19
|
// ---------------------------------------------------------------------------
|
|
19
20
|
// Pattern detection
|
|
@@ -40,17 +41,12 @@ function findRepeatedPatterns(memories) {
|
|
|
40
41
|
* Uses the most common non-trivial words across all content.
|
|
41
42
|
*/
|
|
42
43
|
function extractGroupKeywords(memories) {
|
|
43
|
-
const stopWords = new Set([
|
|
44
|
-
'the', 'a', 'an', 'is', 'it', 'in', 'on', 'at', 'to', 'for',
|
|
45
|
-
'of', 'and', 'or', 'but', 'with', 'from', 'that', 'this', 'was',
|
|
46
|
-
'are', 'be', 'been', 'been', 'by', 'as', 'not', 'use', 'used',
|
|
47
|
-
]);
|
|
48
44
|
const wordCount = new Map();
|
|
49
45
|
for (const mem of memories) {
|
|
50
46
|
const words = (mem.content + ' ' + mem.summary)
|
|
51
47
|
.toLowerCase()
|
|
52
48
|
.split(/[\s,.\-:;()\[\]{}'"!?/\\]+/)
|
|
53
|
-
.filter(w => w.length > 3 && !
|
|
49
|
+
.filter(w => w.length > 3 && !STOP_WORDS.has(w));
|
|
54
50
|
for (const w of words) {
|
|
55
51
|
wordCount.set(w, (wordCount.get(w) ?? 0) + 1);
|
|
56
52
|
}
|
|
@@ -215,45 +211,4 @@ export function formatProceduralSection(memories) {
|
|
|
215
211
|
export function getProceduralDecayMultiplier() {
|
|
216
212
|
return 0.3;
|
|
217
213
|
}
|
|
218
|
-
// ---------------------------------------------------------------------------
|
|
219
|
-
// Rule suggestion
|
|
220
|
-
// ---------------------------------------------------------------------------
|
|
221
|
-
/**
|
|
222
|
-
* Analyse the last 50 memories and suggest concrete procedural rules.
|
|
223
|
-
*
|
|
224
|
-
* Returns candidates sorted by confidence (highest first). Confidence is
|
|
225
|
-
* the proportion of the tag-group that supports a consistent pattern.
|
|
226
|
-
*
|
|
227
|
-
* Skips rules that already exist as procedural memories (by rule text match).
|
|
228
|
-
*/
|
|
229
|
-
export function suggestRules(recentMemories) {
|
|
230
|
-
const sample = recentMemories.slice(0, 50);
|
|
231
|
-
const groups = findRepeatedPatterns(sample);
|
|
232
|
-
const results = [];
|
|
233
|
-
for (const [tag, groupMemories] of groups) {
|
|
234
|
-
const total = groupMemories.length;
|
|
235
|
-
const type = dominantType(groupMemories);
|
|
236
|
-
const keywords = extractGroupKeywords(groupMemories);
|
|
237
|
-
// Confidence: how consistently the group points in one direction
|
|
238
|
-
const confidence = Math.min(1.0, (total - 2) / 10 + (type ? 0.2 : 0));
|
|
239
|
-
let rule;
|
|
240
|
-
if (type === 'error') {
|
|
241
|
-
rule = keywords.length > 0
|
|
242
|
-
? `When facing ${tag} errors: address ${keywords.slice(0, 2).join(' and ')}`
|
|
243
|
-
: `Document and track ${tag} error resolutions systematically`;
|
|
244
|
-
}
|
|
245
|
-
else if (type === 'decision') {
|
|
246
|
-
rule = keywords.length > 0
|
|
247
|
-
? `For ${tag} decisions: apply ${keywords.slice(0, 2).join(' and ')} criteria`
|
|
248
|
-
: `Maintain consistent decision criteria for ${tag}`;
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
rule = keywords.length > 0
|
|
252
|
-
? `${tag} work follows pattern: ${keywords.slice(0, 3).join(', ')}`
|
|
253
|
-
: `Track ${tag} as a key recurring theme`;
|
|
254
|
-
}
|
|
255
|
-
results.push({ rule, confidence, evidence: groupMemories });
|
|
256
|
-
}
|
|
257
|
-
return results.sort((a, b) => b.confidence - a.confidence);
|
|
258
|
-
}
|
|
259
214
|
//# sourceMappingURL=procedural.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"procedural.js","sourceRoot":"","sources":["../../src/engine/procedural.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,oBAAoB,CAAC,QAAkB;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChD,SAAS,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,QAAkB;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"procedural.js","sourceRoot":"","sources":["../../src/engine/procedural.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commit-service.ts — Unified business logic for session commit.
|
|
3
|
+
*
|
|
4
|
+
* Wraps commitToSun + recalculateOrbits so that both MCP handleCommit
|
|
5
|
+
* and API POST /api/sun/commit go through the same code path.
|
|
6
|
+
*
|
|
7
|
+
* The MCP handler also reads procedural memories, temporal summary, and
|
|
8
|
+
* conflict counts to format its response text — those are presentation
|
|
9
|
+
* concerns and stay in the MCP layer. This service returns the raw
|
|
10
|
+
* orbit changes so callers can decide what to display.
|
|
11
|
+
*/
|
|
12
|
+
import type { OrbitChange } from '../types.js';
|
|
13
|
+
export interface CommitInput {
|
|
14
|
+
current_work: string;
|
|
15
|
+
decisions?: string[];
|
|
16
|
+
next_steps?: string[];
|
|
17
|
+
errors?: string[];
|
|
18
|
+
context?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CommitResult {
|
|
21
|
+
orbitChanges: OrbitChange[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Persist session context to the sun and recalculate orbital distances.
|
|
25
|
+
*
|
|
26
|
+
* Mirrors the core logic of handleCommit, minus MCP response formatting.
|
|
27
|
+
*/
|
|
28
|
+
export declare function commitSession(input: CommitInput, project: string): CommitResult;
|
|
29
|
+
//# sourceMappingURL=commit-service.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commit-service.ts — Unified business logic for session commit.
|
|
3
|
+
*
|
|
4
|
+
* Wraps commitToSun + recalculateOrbits so that both MCP handleCommit
|
|
5
|
+
* and API POST /api/sun/commit go through the same code path.
|
|
6
|
+
*
|
|
7
|
+
* The MCP handler also reads procedural memories, temporal summary, and
|
|
8
|
+
* conflict counts to format its response text — those are presentation
|
|
9
|
+
* concerns and stay in the MCP layer. This service returns the raw
|
|
10
|
+
* orbit changes so callers can decide what to display.
|
|
11
|
+
*/
|
|
12
|
+
import { commitToSun } from '../sun.js';
|
|
13
|
+
import { recalculateOrbits } from '../orbit.js';
|
|
14
|
+
import { getConfig } from '../../utils/config.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// commitSession
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Persist session context to the sun and recalculate orbital distances.
|
|
20
|
+
*
|
|
21
|
+
* Mirrors the core logic of handleCommit, minus MCP response formatting.
|
|
22
|
+
*/
|
|
23
|
+
export function commitSession(input, project) {
|
|
24
|
+
commitToSun(project, {
|
|
25
|
+
current_work: input.current_work,
|
|
26
|
+
decisions: input.decisions ?? [],
|
|
27
|
+
next_steps: input.next_steps ?? [],
|
|
28
|
+
errors: input.errors ?? [],
|
|
29
|
+
context: input.context ?? '',
|
|
30
|
+
});
|
|
31
|
+
const config = getConfig();
|
|
32
|
+
const orbitChanges = recalculateOrbits(project, config);
|
|
33
|
+
return { orbitChanges };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=commit-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-service.js","sourceRoot":"","sources":["../../../src/engine/services/commit-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAkBlD,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAkB,EAClB,OAAe;IAEf,WAAW,CAAC,OAAO,EAAE;QACnB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,SAAS,EAAK,KAAK,CAAC,SAAS,IAAK,EAAE;QACpC,UAAU,EAAI,KAAK,CAAC,UAAU,IAAI,EAAE;QACpC,MAAM,EAAQ,KAAK,CAAC,MAAM,IAAQ,EAAE;QACpC,OAAO,EAAO,KAAK,CAAC,OAAO,IAAO,EAAE;KACrC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAExD,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memory-service.ts — Unified business logic for memory creation.
|
|
3
|
+
*
|
|
4
|
+
* Both MCP handlers and API routes call this instead of invoking
|
|
5
|
+
* planet.ts + individual engine modules independently.
|
|
6
|
+
*
|
|
7
|
+
* Replicates the full orchestration sequence from handleRemember:
|
|
8
|
+
* 1. createMemory (dedup, embedding scheduling, quality, corona)
|
|
9
|
+
* 2. extractRelationships (background, fire-and-forget)
|
|
10
|
+
* 3. setTemporalBounds (valid_from = now)
|
|
11
|
+
* 4. calculateQuality (with peer comparison for accurate uniqueness score)
|
|
12
|
+
* 5. detectConflicts (async, persists MemoryConflict rows)
|
|
13
|
+
* 6. detectSupersession (auto-supersede if pattern detected)
|
|
14
|
+
*/
|
|
15
|
+
import type { Memory, MemoryType, QualityScore, MemoryConflict } from '../types.js';
|
|
16
|
+
export interface CreateMemoryInput {
|
|
17
|
+
content: string;
|
|
18
|
+
type?: MemoryType;
|
|
19
|
+
tags?: string[];
|
|
20
|
+
impact?: number;
|
|
21
|
+
summary?: string;
|
|
22
|
+
source_path?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CreateMemoryResult {
|
|
25
|
+
memory: Memory;
|
|
26
|
+
quality: QualityScore;
|
|
27
|
+
qualityFeedback: string | null;
|
|
28
|
+
conflicts: MemoryConflict[];
|
|
29
|
+
conflictWarnings: string;
|
|
30
|
+
supersededId: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface ForgetMemoryInput {
|
|
33
|
+
id: string;
|
|
34
|
+
mode?: 'push' | 'delete';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a memory with full business logic applied.
|
|
38
|
+
*
|
|
39
|
+
* Mirrors the sequence in handleRemember, minus the MCP response formatting.
|
|
40
|
+
* Safe to call from both API routes and (eventually) MCP handlers.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createMemoryFull(input: CreateMemoryInput, project: string): Promise<CreateMemoryResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Forget a memory (push to Oort cloud or soft-delete).
|
|
45
|
+
* Thin wrapper kept here so API routes import from one place.
|
|
46
|
+
*/
|
|
47
|
+
export declare function forgetMemoryFull(input: ForgetMemoryInput): void;
|
|
48
|
+
//# sourceMappingURL=memory-service.d.ts.map
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memory-service.ts — Unified business logic for memory creation.
|
|
3
|
+
*
|
|
4
|
+
* Both MCP handlers and API routes call this instead of invoking
|
|
5
|
+
* planet.ts + individual engine modules independently.
|
|
6
|
+
*
|
|
7
|
+
* Replicates the full orchestration sequence from handleRemember:
|
|
8
|
+
* 1. createMemory (dedup, embedding scheduling, quality, corona)
|
|
9
|
+
* 2. extractRelationships (background, fire-and-forget)
|
|
10
|
+
* 3. setTemporalBounds (valid_from = now)
|
|
11
|
+
* 4. calculateQuality (with peer comparison for accurate uniqueness score)
|
|
12
|
+
* 5. detectConflicts (async, persists MemoryConflict rows)
|
|
13
|
+
* 6. detectSupersession (auto-supersede if pattern detected)
|
|
14
|
+
*/
|
|
15
|
+
import { createMemory, forgetMemory } from '../planet.js';
|
|
16
|
+
import { calculateQuality, getQualityFeedback } from '../quality.js';
|
|
17
|
+
import { detectConflicts, formatConflictWarnings } from '../conflict.js';
|
|
18
|
+
import { detectSupersession, supersedeMemory, setTemporalBounds } from '../temporal.js';
|
|
19
|
+
import { extractRelationships } from '../constellation.js';
|
|
20
|
+
import { getMemoriesByProject } from '../../storage/queries.js';
|
|
21
|
+
import { createLogger } from '../../utils/logger.js';
|
|
22
|
+
const log = createLogger('memory-service');
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// createMemoryFull
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Create a memory with full business logic applied.
|
|
28
|
+
*
|
|
29
|
+
* Mirrors the sequence in handleRemember, minus the MCP response formatting.
|
|
30
|
+
* Safe to call from both API routes and (eventually) MCP handlers.
|
|
31
|
+
*/
|
|
32
|
+
export async function createMemoryFull(input, project) {
|
|
33
|
+
// 1. Create memory — handles content dedup, semantic dedup, embedding
|
|
34
|
+
// scheduling, initial quality score, and corona cache placement.
|
|
35
|
+
const memory = createMemory({
|
|
36
|
+
project,
|
|
37
|
+
content: input.content,
|
|
38
|
+
summary: input.summary,
|
|
39
|
+
type: input.type ?? 'observation',
|
|
40
|
+
impact: input.impact,
|
|
41
|
+
tags: input.tags,
|
|
42
|
+
});
|
|
43
|
+
// 2. Background relationship extraction (constellation graph).
|
|
44
|
+
// Fire-and-forget — never blocks the caller.
|
|
45
|
+
extractRelationships(memory, project).catch(() => {
|
|
46
|
+
log.debug('Background constellation extraction failed', { id: memory.id });
|
|
47
|
+
});
|
|
48
|
+
// 3. Set valid_from to now so temporal queries work correctly.
|
|
49
|
+
setTemporalBounds(memory.id, new Date().toISOString(), undefined);
|
|
50
|
+
// 4. Quality scoring with full peer comparison for accurate uniqueness.
|
|
51
|
+
const allMemories = getMemoriesByProject(project);
|
|
52
|
+
const quality = calculateQuality(memory, allMemories);
|
|
53
|
+
const qualityFeedback = getQualityFeedback(quality);
|
|
54
|
+
// 5. Conflict detection — async, persists MemoryConflict rows.
|
|
55
|
+
const conflicts = await detectConflicts(memory, project);
|
|
56
|
+
const conflictWarnings = formatConflictWarnings(conflicts);
|
|
57
|
+
// 6. Temporal supersession — if the new memory signals a switch/replacement,
|
|
58
|
+
// auto-supersede the older conflicting memory.
|
|
59
|
+
let supersededId = null;
|
|
60
|
+
const supersessionCandidate = detectSupersession(memory, allMemories);
|
|
61
|
+
if (supersessionCandidate) {
|
|
62
|
+
supersedeMemory(supersessionCandidate.id, memory.id);
|
|
63
|
+
supersededId = supersessionCandidate.id;
|
|
64
|
+
log.debug('Auto-supersession applied', {
|
|
65
|
+
newId: memory.id,
|
|
66
|
+
oldId: supersessionCandidate.id,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
memory,
|
|
71
|
+
quality,
|
|
72
|
+
qualityFeedback,
|
|
73
|
+
conflicts,
|
|
74
|
+
conflictWarnings,
|
|
75
|
+
supersededId,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Forget a memory (push to Oort cloud or soft-delete).
|
|
80
|
+
* Thin wrapper kept here so API routes import from one place.
|
|
81
|
+
*/
|
|
82
|
+
export function forgetMemoryFull(input) {
|
|
83
|
+
forgetMemory(input.id, input.mode ?? 'push');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=memory-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-service.js","sourceRoot":"","sources":["../../../src/engine/services/memory-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AA6B3C,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAwB,EACxB,OAAe;IAEf,sEAAsE;IACtE,oEAAoE;IACpE,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO;QACP,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAK,KAAK,CAAC,IAAI,IAAI,aAAa;QACpC,MAAM,EAAG,KAAK,CAAC,MAAM;QACrB,IAAI,EAAK,KAAK,CAAC,IAAI;KACpB,CAAC,CAAC;IAEH,+DAA+D;IAC/D,gDAAgD;IAChD,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QAC/C,GAAG,CAAC,KAAK,CAAC,4CAA4C,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;IAElE,wEAAwE;IACxE,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAEpD,+DAA+D;IAC/D,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAE3D,6EAA6E;IAC7E,kDAAkD;IAClD,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtE,IAAI,qBAAqB,EAAE,CAAC;QAC1B,eAAe,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACrD,YAAY,GAAG,qBAAqB,CAAC,EAAE,CAAC;QACxC,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE;YACrC,KAAK,EAAG,MAAM,CAAC,EAAE;YACjB,KAAK,EAAG,qBAAqB,CAAC,EAAE;SACjC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,eAAe;QACf,SAAS;QACT,gBAAgB;QAChB,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAwB;IACvD,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recall-service.ts — Unified business logic for memory recall.
|
|
3
|
+
*
|
|
4
|
+
* Wraps recallMemoriesAsync with the same options shape that
|
|
5
|
+
* both MCP handleRecall and API GET /memories/search use.
|
|
6
|
+
*
|
|
7
|
+
* The key value-add vs calling recallMemoriesAsync directly:
|
|
8
|
+
* - Normalises the type filter ('all' → undefined internally)
|
|
9
|
+
* - Provides a typed RecallInput / RecallResult contract
|
|
10
|
+
*/
|
|
11
|
+
import type { Memory, MemoryType } from '../types.js';
|
|
12
|
+
export interface RecallInput {
|
|
13
|
+
query: string;
|
|
14
|
+
type?: MemoryType | 'all';
|
|
15
|
+
limit?: number;
|
|
16
|
+
minDistance?: number;
|
|
17
|
+
maxDistance?: number;
|
|
18
|
+
excludeIds?: Set<string>;
|
|
19
|
+
}
|
|
20
|
+
export interface RecallResult {
|
|
21
|
+
memories: Memory[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Recall memories using the full 3-tier hybrid pipeline
|
|
25
|
+
* (Corona cache → FTS5 active zone → FTS5+vector full hybrid).
|
|
26
|
+
*
|
|
27
|
+
* Access boost and orbit update are applied automatically by
|
|
28
|
+
* recallMemoriesAsync for all returned memories.
|
|
29
|
+
*/
|
|
30
|
+
export declare function recallMemories(input: RecallInput, project: string): Promise<RecallResult>;
|
|
31
|
+
//# sourceMappingURL=recall-service.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recall-service.ts — Unified business logic for memory recall.
|
|
3
|
+
*
|
|
4
|
+
* Wraps recallMemoriesAsync with the same options shape that
|
|
5
|
+
* both MCP handleRecall and API GET /memories/search use.
|
|
6
|
+
*
|
|
7
|
+
* The key value-add vs calling recallMemoriesAsync directly:
|
|
8
|
+
* - Normalises the type filter ('all' → undefined internally)
|
|
9
|
+
* - Provides a typed RecallInput / RecallResult contract
|
|
10
|
+
*/
|
|
11
|
+
import { recallMemoriesAsync } from '../planet.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// recallMemories
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Recall memories using the full 3-tier hybrid pipeline
|
|
17
|
+
* (Corona cache → FTS5 active zone → FTS5+vector full hybrid).
|
|
18
|
+
*
|
|
19
|
+
* Access boost and orbit update are applied automatically by
|
|
20
|
+
* recallMemoriesAsync for all returned memories.
|
|
21
|
+
*/
|
|
22
|
+
export async function recallMemories(input, project) {
|
|
23
|
+
const memoryType = input.type === 'all' || input.type === undefined
|
|
24
|
+
? undefined
|
|
25
|
+
: input.type;
|
|
26
|
+
const memories = await recallMemoriesAsync(project, input.query, {
|
|
27
|
+
type: memoryType,
|
|
28
|
+
minDistance: input.minDistance,
|
|
29
|
+
maxDistance: input.maxDistance,
|
|
30
|
+
limit: input.limit ?? 10,
|
|
31
|
+
excludeIds: input.excludeIds,
|
|
32
|
+
});
|
|
33
|
+
return { memories };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=recall-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-service.js","sourceRoot":"","sources":["../../../src/engine/services/recall-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAmBnD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAkB,EAClB,OAAe;IAEf,MAAM,UAAU,GACd,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAC9C,CAAC,CAAC,SAAS;QACX,CAAC,CAAE,KAAK,CAAC,IAAmB,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE;QAC/D,IAAI,EAAS,UAAU;QACvB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK,EAAQ,KAAK,CAAC,KAAK,IAAI,EAAE;QAC9B,UAAU,EAAG,KAAK,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Memory, SunState } from './types.js';
|
|
2
|
+
export interface SessionCommitDraft {
|
|
3
|
+
current_work?: string;
|
|
4
|
+
decisions: string[];
|
|
5
|
+
next_steps: string[];
|
|
6
|
+
errors: string[];
|
|
7
|
+
context?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function noteRecall(project: string, query: string): void;
|
|
10
|
+
export declare function noteRemember(project: string, memory: Pick<Memory, 'type' | 'summary' | 'content'>): void;
|
|
11
|
+
export declare function noteObserve(project: string, summary: string): void;
|
|
12
|
+
export declare function clearSessionActivity(project: string): void;
|
|
13
|
+
export declare function getSessionCommitDraft(project: string, existingSun?: SunState | null): SessionCommitDraft | null;
|
|
14
|
+
export declare function formatSessionDraftNote(project: string, existingSun?: SunState | null): string | null;
|
|
15
|
+
//# sourceMappingURL=session-policy.d.ts.map
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const MAX_RECALL_QUERIES = 5;
|
|
2
|
+
const MAX_TYPE_SUMMARIES = 8;
|
|
3
|
+
const MAX_OBSERVED_SUMMARIES = 5;
|
|
4
|
+
const activities = new Map();
|
|
5
|
+
function createEmptyRememberedByType() {
|
|
6
|
+
return {
|
|
7
|
+
decision: [],
|
|
8
|
+
observation: [],
|
|
9
|
+
task: [],
|
|
10
|
+
context: [],
|
|
11
|
+
error: [],
|
|
12
|
+
milestone: [],
|
|
13
|
+
procedural: [],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function normalizeSummary(value) {
|
|
17
|
+
return (value ?? '')
|
|
18
|
+
.replace(/\s+/g, ' ')
|
|
19
|
+
.trim()
|
|
20
|
+
.slice(0, 160);
|
|
21
|
+
}
|
|
22
|
+
function pushUnique(target, value, max) {
|
|
23
|
+
const normalized = normalizeSummary(value);
|
|
24
|
+
if (!normalized || target.includes(normalized))
|
|
25
|
+
return;
|
|
26
|
+
target.unshift(normalized);
|
|
27
|
+
if (target.length > max)
|
|
28
|
+
target.length = max;
|
|
29
|
+
}
|
|
30
|
+
function getActivity(project) {
|
|
31
|
+
let activity = activities.get(project);
|
|
32
|
+
if (!activity) {
|
|
33
|
+
activity = {
|
|
34
|
+
recallQueries: [],
|
|
35
|
+
rememberedByType: createEmptyRememberedByType(),
|
|
36
|
+
observedSummaries: [],
|
|
37
|
+
updatedAt: new Date(0).toISOString(),
|
|
38
|
+
};
|
|
39
|
+
activities.set(project, activity);
|
|
40
|
+
}
|
|
41
|
+
activity.updatedAt = new Date().toISOString();
|
|
42
|
+
return activity;
|
|
43
|
+
}
|
|
44
|
+
export function noteRecall(project, query) {
|
|
45
|
+
const activity = getActivity(project);
|
|
46
|
+
pushUnique(activity.recallQueries, query, MAX_RECALL_QUERIES);
|
|
47
|
+
}
|
|
48
|
+
export function noteRemember(project, memory) {
|
|
49
|
+
const activity = getActivity(project);
|
|
50
|
+
const summary = normalizeSummary(memory.summary) || normalizeSummary(memory.content);
|
|
51
|
+
pushUnique(activity.rememberedByType[memory.type], summary, MAX_TYPE_SUMMARIES);
|
|
52
|
+
}
|
|
53
|
+
export function noteObserve(project, summary) {
|
|
54
|
+
const activity = getActivity(project);
|
|
55
|
+
pushUnique(activity.observedSummaries, summary, MAX_OBSERVED_SUMMARIES);
|
|
56
|
+
}
|
|
57
|
+
export function clearSessionActivity(project) {
|
|
58
|
+
activities.delete(project);
|
|
59
|
+
}
|
|
60
|
+
export function getSessionCommitDraft(project, existingSun) {
|
|
61
|
+
const activity = activities.get(project);
|
|
62
|
+
if (!activity)
|
|
63
|
+
return null;
|
|
64
|
+
const decisions = [
|
|
65
|
+
...activity.rememberedByType.decision,
|
|
66
|
+
...activity.rememberedByType.milestone,
|
|
67
|
+
].slice(0, MAX_TYPE_SUMMARIES);
|
|
68
|
+
const next_steps = activity.rememberedByType.task.slice(0, MAX_TYPE_SUMMARIES);
|
|
69
|
+
const errors = activity.rememberedByType.error.slice(0, MAX_TYPE_SUMMARIES);
|
|
70
|
+
const current_work = existingSun?.current_work?.trim()
|
|
71
|
+
|| activity.recallQueries[0]
|
|
72
|
+
|| activity.rememberedByType.task[0]
|
|
73
|
+
|| activity.rememberedByType.context[0]
|
|
74
|
+
|| activity.rememberedByType.decision[0]
|
|
75
|
+
|| activity.observedSummaries[0];
|
|
76
|
+
const contextParts = [
|
|
77
|
+
...activity.rememberedByType.context.slice(0, 3),
|
|
78
|
+
...activity.observedSummaries.slice(0, 2),
|
|
79
|
+
];
|
|
80
|
+
const context = contextParts.length > 0 ? contextParts.join(' | ') : existingSun?.project_context;
|
|
81
|
+
if (!current_work && decisions.length === 0 && next_steps.length === 0 && errors.length === 0 && !context) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return { current_work, decisions, next_steps, errors, context };
|
|
85
|
+
}
|
|
86
|
+
export function formatSessionDraftNote(project, existingSun) {
|
|
87
|
+
const draft = getSessionCommitDraft(project, existingSun);
|
|
88
|
+
if (!draft)
|
|
89
|
+
return null;
|
|
90
|
+
const parts = [];
|
|
91
|
+
if (draft.current_work)
|
|
92
|
+
parts.push(`topic: ${draft.current_work}`);
|
|
93
|
+
if (draft.decisions.length > 0)
|
|
94
|
+
parts.push(`decisions: ${draft.decisions.length}`);
|
|
95
|
+
if (draft.next_steps.length > 0)
|
|
96
|
+
parts.push(`steps: ${draft.next_steps.length}`);
|
|
97
|
+
if (draft.errors.length > 0)
|
|
98
|
+
parts.push(`errors: ${draft.errors.length}`);
|
|
99
|
+
if (parts.length === 0)
|
|
100
|
+
return null;
|
|
101
|
+
return `Session draft active | ${parts.join(' | ')}`;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=session-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-policy.js","sourceRoot":"","sources":["../../src/engine/session-policy.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/sun.d.ts
CHANGED
|
@@ -40,12 +40,16 @@ export declare function commitToSun(project: string, data: {
|
|
|
40
40
|
* remaining token budget before being appended (progressive truncation).
|
|
41
41
|
* This ensures the most critical context always fits regardless of budget.
|
|
42
42
|
*
|
|
43
|
-
*
|
|
43
|
+
* Priority order (Corona-aware):
|
|
44
44
|
* 1. Header
|
|
45
|
-
* 2.
|
|
46
|
-
* 3.
|
|
47
|
-
* 4.
|
|
48
|
-
* 5.
|
|
45
|
+
* 2. ALERTS -- proactive conflict/stale-task/decision notices (high priority)
|
|
46
|
+
* 3. CORE -- core zone memories (instant recall, ~40% budget)
|
|
47
|
+
* 4. WORKING ON (current_work, ~10%)
|
|
48
|
+
* 5. NEAR -- near zone memories (~25%)
|
|
49
|
+
* 6. RECENT DECISIONS / NEXT STEPS / ACTIVE ISSUES (~25%)
|
|
50
|
+
*
|
|
51
|
+
* IMPORTANT: Callers must NOT append additional content to the result.
|
|
52
|
+
* All sections (alerts, core, near, working state) are budget-managed here.
|
|
49
53
|
*/
|
|
50
54
|
export declare function formatSunContent(sun: SunState, coreMemories: Memory[], nearMemories: Memory[]): string;
|
|
51
55
|
/**
|