@devflow-tools/memory-engine 0.13.1 → 0.14.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 (56) hide show
  1. package/dist/consolidator.d.ts +13 -0
  2. package/dist/consolidator.d.ts.map +1 -0
  3. package/dist/consolidator.js +184 -0
  4. package/dist/consolidator.js.map +1 -0
  5. package/dist/event-grouper.d.ts +13 -0
  6. package/dist/event-grouper.d.ts.map +1 -0
  7. package/dist/event-grouper.js +178 -0
  8. package/dist/event-grouper.js.map +1 -0
  9. package/dist/graph-store.d.ts.map +1 -1
  10. package/dist/graph-store.js +2 -4
  11. package/dist/graph-store.js.map +1 -1
  12. package/dist/hybrid-search.d.ts +6 -4
  13. package/dist/hybrid-search.d.ts.map +1 -1
  14. package/dist/hybrid-search.js +23 -5
  15. package/dist/hybrid-search.js.map +1 -1
  16. package/dist/index.d.ts +14 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +7 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/l2-evaluator.d.ts +31 -0
  21. package/dist/l2-evaluator.d.ts.map +1 -0
  22. package/dist/l2-evaluator.js +103 -0
  23. package/dist/l2-evaluator.js.map +1 -0
  24. package/dist/llm-provider.d.ts +9 -0
  25. package/dist/llm-provider.d.ts.map +1 -0
  26. package/dist/llm-provider.js +37 -0
  27. package/dist/llm-provider.js.map +1 -0
  28. package/dist/memory-engine.d.ts +27 -4
  29. package/dist/memory-engine.d.ts.map +1 -1
  30. package/dist/memory-engine.js +274 -181
  31. package/dist/memory-engine.js.map +1 -1
  32. package/dist/memory-gate.d.ts +116 -0
  33. package/dist/memory-gate.d.ts.map +1 -0
  34. package/dist/memory-gate.js +385 -0
  35. package/dist/memory-gate.js.map +1 -0
  36. package/dist/memory-store.d.ts +234 -32
  37. package/dist/memory-store.d.ts.map +1 -1
  38. package/dist/memory-store.js +729 -142
  39. package/dist/memory-store.js.map +1 -1
  40. package/dist/project-validator.d.ts +10 -0
  41. package/dist/project-validator.d.ts.map +1 -0
  42. package/dist/project-validator.js +36 -0
  43. package/dist/project-validator.js.map +1 -0
  44. package/dist/session-summarizer.d.ts +10 -0
  45. package/dist/session-summarizer.d.ts.map +1 -0
  46. package/dist/session-summarizer.js +197 -0
  47. package/dist/session-summarizer.js.map +1 -0
  48. package/dist/signal-buffer.d.ts +42 -0
  49. package/dist/signal-buffer.d.ts.map +1 -0
  50. package/dist/signal-buffer.js +104 -0
  51. package/dist/signal-buffer.js.map +1 -0
  52. package/dist/signal-detector.d.ts +39 -0
  53. package/dist/signal-detector.d.ts.map +1 -0
  54. package/dist/signal-detector.js +239 -0
  55. package/dist/signal-detector.js.map +1 -0
  56. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -1,8 +1,15 @@
1
1
  export { MemoryEngine } from "./memory-engine.js";
2
2
  export { MemoryStore } from "./memory-store.js";
3
+ export { MemoryGate } from "./memory-gate.js";
4
+ export { SignalBuffer } from "./signal-buffer.js";
5
+ export { SignalDetector } from "./signal-detector.js";
6
+ export { validateProjectRoot, hasForceInitSentinel, writeForceInitSentinel } from "./project-validator.js";
3
7
  export { EmbeddingProvider } from "./embedding-provider.js";
4
8
  export { HybridSearch } from "./hybrid-search.js";
5
9
  export { GraphStore } from "./graph-store.js";
10
+ export { setLLMClient } from "./llm-provider.js";
6
11
  export { extractMemories, extractCandidates, extractFromEvents, setExtractionLLMClient, isExtractionAvailable } from "./extractor.js";
12
+ export { L2Evaluator, getL2Evaluator, setL2LLMClient } from "./l2-evaluator.js";
13
+ export { consolidate } from './consolidator.js';
7
14
  export { checkOllama, getOllamaInfoMessage } from "./ollama-checker.js";
8
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtI,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAE3G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtI,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { LLMClient } from '@devflow-tools/sdk';
2
+ export interface L2Candidate {
3
+ eventId: string;
4
+ toolName: string;
5
+ command?: string;
6
+ stderr?: string;
7
+ userMessage?: string;
8
+ l1Score: number;
9
+ dialogScore: number;
10
+ cumulativeScore: number;
11
+ }
12
+ export interface L2Decision {
13
+ eventId: string;
14
+ decision: 'keep' | 'discard' | 'merge';
15
+ mergeTargetId?: string;
16
+ category: 'failure_lesson' | 'project_knowledge' | 'procedural' | 'semantic' | 'mcp_correction';
17
+ content: string;
18
+ confidence: number;
19
+ }
20
+ export declare class L2Evaluator {
21
+ private llmClient;
22
+ setLLMClient(client: LLMClient): void;
23
+ get isAvailable(): boolean;
24
+ evaluate(candidates: L2Candidate[], sessionId: string): Promise<L2Decision[]>;
25
+ private callLLM;
26
+ /** Rule-based fallback when LLM is unavailable. */
27
+ private ruleFallback;
28
+ }
29
+ export declare function getL2Evaluator(): L2Evaluator;
30
+ export declare function setL2LLMClient(client: LLMClient): void;
31
+ //# sourceMappingURL=l2-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l2-evaluator.d.ts","sourceRoot":"","sources":["../src/l2-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,YAAY,GAAG,UAAU,GAAG,gBAAgB,CAAC;IAChG,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0BD,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAA0B;IAE3C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIrC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YAkBrE,OAAO;IA6BrB,mDAAmD;IACnD,OAAO,CAAC,YAAY;CAmBrB;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAG5C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEtD"}
@@ -0,0 +1,103 @@
1
+ const L2_EVALUATION_PROMPT = `You are a memory curator for a developer tool. Evaluate whether each event should be saved as a permanent memory.
2
+
3
+ Judgment dimensions:
4
+ 1. Reusability: How likely is this exact scenario to recur? (1-5)
5
+ 2. Long-tail value: Would this still be useful 30 days later? (1-5)
6
+ 3. Specificity: Is this project-specific knowledge, or generic programming knowledge? (1-5)
7
+ 4. Actionability: Can someone act on this memory? (1-5)
8
+
9
+ Decision rules:
10
+ - Reusability >= 4 AND Long-tail >= 4 → keep
11
+ - Specificity >= 3 AND Actionability >= 4 → keep
12
+ - Otherwise → discard
13
+ - If very similar to an existing approved memory → merge (pick the better one)
14
+
15
+ Categories:
16
+ - "failure_lesson": Error patterns and their fixes
17
+ - "project_knowledge": Project-specific config, tooling, or conventions
18
+ - "procedural": Multi-step procedures and workflows
19
+ - "semantic": Facts about the codebase
20
+ - "mcp_correction": Corrections to MCP tool behavior
21
+
22
+ Output ONLY a JSON array, no other text. Each element:
23
+ {"eventId":"...","decision":"keep|discard|merge","mergeTargetId":"...","category":"...","content":"one concise sentence","confidence":0.0-1.0}`;
24
+ export class L2Evaluator {
25
+ llmClient = null;
26
+ setLLMClient(client) {
27
+ this.llmClient = client;
28
+ }
29
+ get isAvailable() {
30
+ return this.llmClient?.isAvailable ?? false;
31
+ }
32
+ async evaluate(candidates, sessionId) {
33
+ if (!this.llmClient?.isAvailable || candidates.length === 0) {
34
+ return this.ruleFallback(candidates);
35
+ }
36
+ try {
37
+ const result = await Promise.race([
38
+ this.callLLM(candidates, sessionId),
39
+ new Promise((_, reject) => setTimeout(() => reject(new Error('L2 evaluation timeout')), 30_000)),
40
+ ]);
41
+ return result;
42
+ }
43
+ catch {
44
+ return this.ruleFallback(candidates);
45
+ }
46
+ }
47
+ async callLLM(candidates, sessionId) {
48
+ const eventsJson = candidates.map(c => ({
49
+ eventId: c.eventId,
50
+ tool: c.toolName,
51
+ command: c.command,
52
+ error: c.stderr?.slice(0, 200),
53
+ userMessage: c.userMessage?.slice(0, 200),
54
+ scores: { l1: c.l1Score, dialog: c.dialogScore },
55
+ }));
56
+ const response = await this.llmClient.chat({
57
+ systemPrompt: L2_EVALUATION_PROMPT,
58
+ messages: [{
59
+ role: 'user',
60
+ content: `Session: ${sessionId}\nEvents to evaluate:\n${JSON.stringify(eventsJson, null, 2)}`,
61
+ }],
62
+ maxTokens: 2048,
63
+ });
64
+ const text = response.content;
65
+ const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) ?? [null, text];
66
+ try {
67
+ const decisions = JSON.parse(jsonMatch[1].trim());
68
+ return decisions.filter(d => d.eventId && d.decision);
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ /** Rule-based fallback when LLM is unavailable. */
75
+ ruleFallback(candidates) {
76
+ return candidates
77
+ .filter(c => {
78
+ // Keep events with clear error patterns
79
+ const hasError = /error|fail|exception|timeout|refused|denied/i.test([c.stderr, c.command].filter(Boolean).join(' '));
80
+ return hasError && c.cumulativeScore >= 0.4;
81
+ })
82
+ .map(c => ({
83
+ eventId: c.eventId,
84
+ decision: 'keep',
85
+ category: 'failure_lesson',
86
+ content: c.stderr
87
+ ? `Error with \`${c.command ?? c.toolName}\`: ${c.stderr.slice(0, 120)}`
88
+ : `Issue with \`${c.command ?? c.toolName}\``,
89
+ confidence: 0.55,
90
+ }));
91
+ }
92
+ }
93
+ /** Singleton — shared across MemoryGate instances in the same process. */
94
+ let instance = null;
95
+ export function getL2Evaluator() {
96
+ if (!instance)
97
+ instance = new L2Evaluator();
98
+ return instance;
99
+ }
100
+ export function setL2LLMClient(client) {
101
+ getL2Evaluator().setLLMClient(client);
102
+ }
103
+ //# sourceMappingURL=l2-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l2-evaluator.js","sourceRoot":"","sources":["../src/l2-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { LLMClient } from '@devflow-tools/sdk';
2
+ export interface LLMResponse {
3
+ content: string;
4
+ provider: string;
5
+ latencyMs: number;
6
+ }
7
+ export declare function setLLMClient(client: LLMClient): void;
8
+ export declare function callLLM(systemPrompt: string, userMessage: string): Promise<LLMResponse>;
9
+ //# sourceMappingURL=llm-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.d.ts","sourceRoot":"","sources":["../src/llm-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEpD;AAED,wBAAsB,OAAO,CAC3B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAgCtB"}
@@ -0,0 +1,37 @@
1
+ let llmClient = null;
2
+ export function setLLMClient(client) {
3
+ llmClient = client;
4
+ }
5
+ export async function callLLM(systemPrompt, userMessage) {
6
+ const start = Date.now();
7
+ if (llmClient?.isAvailable) {
8
+ try {
9
+ const response = await llmClient.chat({
10
+ systemPrompt,
11
+ messages: [{ role: 'user', content: userMessage }],
12
+ maxTokens: 2048,
13
+ });
14
+ console.log('[LLMProvider] Used LLM client', {
15
+ provider: llmClient.name,
16
+ latencyMs: Date.now() - start,
17
+ });
18
+ return {
19
+ content: response.content,
20
+ provider: llmClient.name,
21
+ latencyMs: Date.now() - start,
22
+ };
23
+ }
24
+ catch (err) {
25
+ console.warn('[LLMProvider] LLM client failed, using rule fallback', {
26
+ error: err.message,
27
+ });
28
+ }
29
+ }
30
+ console.log('[LLMProvider] Using rule fallback (no LLM available)');
31
+ return {
32
+ content: 'No LLM available',
33
+ provider: 'rules',
34
+ latencyMs: Date.now() - start,
35
+ };
36
+ }
37
+ //# sourceMappingURL=llm-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../src/llm-provider.ts"],"names":[],"mappings":"AAQA,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEvC,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,SAAS,GAAG,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,YAAoB,EACpB,WAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;gBACpC,YAAY;gBACZ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBAClD,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE;gBAC3C,QAAQ,EAAE,SAAS,CAAC,IAAI;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC9B,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,SAAS,CAAC,IAAI;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE;gBACnE,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO;QACL,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC9B,CAAC;AACJ,CAAC"}
@@ -1,12 +1,14 @@
1
- import type { IMemoryEngine, UserPrefs, Convention, ProjectContext, SessionEntry, SessionMemory, MemoryCandidate, KnowledgeEntry, MemoryEntryRecord, MemoryFilter, MemorySearchOptions, MemorySearchResult } from '@devflow-tools/sdk';
1
+ import type { IMemoryEngine, UserPrefs, Convention, ProjectContext, SessionEntry, SessionMemory, MemoryCandidate, KnowledgeEntry, MemoryEntryRecord, MemoryFilter, MemorySearchOptions, MemorySearchResult, LLMClient } from '@devflow-tools/sdk';
2
+ import { MemoryStore } from './memory-store.js';
3
+ import type { Signal } from './signal-detector.js';
2
4
  import { EmbeddingProvider } from './embedding-provider.js';
3
5
  export declare class MemoryEngine implements IMemoryEngine {
4
- private store;
6
+ readonly store: MemoryStore;
5
7
  private embedder;
6
8
  private searcher;
7
9
  private graph;
8
10
  private rootPath;
9
- constructor(rootPath: string, embedder?: EmbeddingProvider);
11
+ constructor(rootPath: string, embedder?: EmbeddingProvider, llmClient?: LLMClient);
10
12
  private _initPromise;
11
13
  private _embedderAvailable;
12
14
  private ensureInit;
@@ -34,6 +36,8 @@ export declare class MemoryEngine implements IMemoryEngine {
34
36
  search(query: string, options?: MemorySearchOptions): Promise<MemorySearchResult[]>;
35
37
  listMemories(filter?: MemoryFilter): Promise<MemoryEntryRecord[]>;
36
38
  addMemory(entry: Omit<MemoryEntryRecord, 'id' | 'createdAt' | 'status'>): Promise<MemoryEntryRecord>;
39
+ /** Map internal MemoryRow → SDK MemoryEntryRecord */
40
+ private _rowToRecord;
37
41
  updateMemory(id: string, updates: Partial<Pick<MemoryEntryRecord, 'content' | 'status' | 'scope'>>): Promise<void>;
38
42
  deleteMemory(id: string): Promise<void>;
39
43
  getPendingMemories(): Promise<MemoryEntryRecord[]>;
@@ -42,7 +46,17 @@ export declare class MemoryEngine implements IMemoryEngine {
42
46
  extractMemories(events: Array<Record<string, unknown>>): Promise<MemoryEntryRecord[]>;
43
47
  getOllamaStatus(): Promise<import("./ollama-checker.js").OllamaStatus>;
44
48
  consolidateSession(sessionId: string): Promise<MemoryEntryRecord | null>;
45
- detectContradictions(memoryId: string): Promise<void>;
49
+ /**
50
+ * Pre-write contradiction check with LLM arbitration.
51
+ * Returns the decision: 'keep' (write new), 'merge' (update existing), 'skip' (don't write).
52
+ */
53
+ detectAndArbitrateContradiction(content: string, embedding: Float32Array): Promise<{
54
+ decision: 'keep' | 'merge' | 'skip';
55
+ conflictingId?: string;
56
+ mergedContent?: string;
57
+ confidence?: number;
58
+ reason?: string;
59
+ }>;
46
60
  close(): void;
47
61
  recordEvent(event: {
48
62
  id: string;
@@ -53,7 +67,11 @@ export declare class MemoryEngine implements IMemoryEngine {
53
67
  stderr?: string;
54
68
  durationMs?: number;
55
69
  createdAt: number;
70
+ l1Score?: number;
71
+ dialogScore?: number;
72
+ userMessage?: string;
56
73
  }): Promise<void>;
74
+ recordSignals(signals: Signal[]): void;
57
75
  getEffectiveConfidence(entry: {
58
76
  confidence: number;
59
77
  createdAt: number;
@@ -72,5 +90,10 @@ export declare class MemoryEngine implements IMemoryEngine {
72
90
  approved: number;
73
91
  pending: number;
74
92
  }>;
93
+ /** New: summarize a specific session's events into observations. */
94
+ summarizeSessionEvents(sessionId: string, projectRoot: string): Promise<{
95
+ observationCount: number;
96
+ provider: string;
97
+ }>;
75
98
  }
76
99
  //# sourceMappingURL=memory-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-engine.d.ts","sourceRoot":"","sources":["../src/memory-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-engine.d.ts","sourceRoot":"","sources":["../src/memory-engine.ts"],"names":[],"mappings":"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"}