ai-mind-map 1.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.
- package/LICENSE +21 -0
- package/README.md +554 -0
- package/dist/change-tracker/change-log.d.ts +160 -0
- package/dist/change-tracker/change-log.d.ts.map +1 -0
- package/dist/change-tracker/change-log.js +507 -0
- package/dist/change-tracker/change-log.js.map +1 -0
- package/dist/change-tracker/diff-engine.d.ts +149 -0
- package/dist/change-tracker/diff-engine.d.ts.map +1 -0
- package/dist/change-tracker/diff-engine.js +530 -0
- package/dist/change-tracker/diff-engine.js.map +1 -0
- package/dist/change-tracker/watcher.d.ts +137 -0
- package/dist/change-tracker/watcher.d.ts.map +1 -0
- package/dist/change-tracker/watcher.js +300 -0
- package/dist/change-tracker/watcher.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +937 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +222 -0
- package/dist/config.js.map +1 -0
- package/dist/context/compressor.d.ts +49 -0
- package/dist/context/compressor.d.ts.map +1 -0
- package/dist/context/compressor.js +769 -0
- package/dist/context/compressor.js.map +1 -0
- package/dist/context/progressive-disclosure.d.ts +71 -0
- package/dist/context/progressive-disclosure.d.ts.map +1 -0
- package/dist/context/progressive-disclosure.js +470 -0
- package/dist/context/progressive-disclosure.js.map +1 -0
- package/dist/context/token-budget.d.ts +121 -0
- package/dist/context/token-budget.d.ts.map +1 -0
- package/dist/context/token-budget.js +282 -0
- package/dist/context/token-budget.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +944 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +66 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +946 -0
- package/dist/install.js.map +1 -0
- package/dist/knowledge-graph/architecture.d.ts +213 -0
- package/dist/knowledge-graph/architecture.d.ts.map +1 -0
- package/dist/knowledge-graph/architecture.js +585 -0
- package/dist/knowledge-graph/architecture.js.map +1 -0
- package/dist/knowledge-graph/cypher.d.ts +113 -0
- package/dist/knowledge-graph/cypher.d.ts.map +1 -0
- package/dist/knowledge-graph/cypher.js +1051 -0
- package/dist/knowledge-graph/cypher.js.map +1 -0
- package/dist/knowledge-graph/dead-code.d.ts +121 -0
- package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
- package/dist/knowledge-graph/dead-code.js +331 -0
- package/dist/knowledge-graph/dead-code.js.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.js +739 -0
- package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
- package/dist/knowledge-graph/graph.d.ts +291 -0
- package/dist/knowledge-graph/graph.d.ts.map +1 -0
- package/dist/knowledge-graph/graph.js +978 -0
- package/dist/knowledge-graph/graph.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +17 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +14 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/indexer.d.ts +112 -0
- package/dist/knowledge-graph/indexer.d.ts.map +1 -0
- package/dist/knowledge-graph/indexer.js +506 -0
- package/dist/knowledge-graph/indexer.js.map +1 -0
- package/dist/knowledge-graph/pagerank.d.ts +141 -0
- package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
- package/dist/knowledge-graph/pagerank.js +493 -0
- package/dist/knowledge-graph/pagerank.js.map +1 -0
- package/dist/knowledge-graph/parser.d.ts +55 -0
- package/dist/knowledge-graph/parser.d.ts.map +1 -0
- package/dist/knowledge-graph/parser.js +1090 -0
- package/dist/knowledge-graph/parser.js.map +1 -0
- package/dist/knowledge-graph/snapshot.d.ts +107 -0
- package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
- package/dist/knowledge-graph/snapshot.js +435 -0
- package/dist/knowledge-graph/snapshot.js.map +1 -0
- package/dist/memory/decision-log.d.ts +151 -0
- package/dist/memory/decision-log.d.ts.map +1 -0
- package/dist/memory/decision-log.js +482 -0
- package/dist/memory/decision-log.js.map +1 -0
- package/dist/memory/persistent-memory.d.ts +182 -0
- package/dist/memory/persistent-memory.d.ts.map +1 -0
- package/dist/memory/persistent-memory.js +579 -0
- package/dist/memory/persistent-memory.js.map +1 -0
- package/dist/memory/session-memory.d.ts +165 -0
- package/dist/memory/session-memory.d.ts.map +1 -0
- package/dist/memory/session-memory.js +382 -0
- package/dist/memory/session-memory.js.map +1 -0
- package/dist/stress-test.d.ts +10 -0
- package/dist/stress-test.d.ts.map +1 -0
- package/dist/stress-test.js +258 -0
- package/dist/stress-test.js.map +1 -0
- package/dist/tools/advanced-tools.d.ts +32 -0
- package/dist/tools/advanced-tools.d.ts.map +1 -0
- package/dist/tools/advanced-tools.js +480 -0
- package/dist/tools/advanced-tools.js.map +1 -0
- package/dist/tools/change-tools.d.ts +76 -0
- package/dist/tools/change-tools.d.ts.map +1 -0
- package/dist/tools/change-tools.js +93 -0
- package/dist/tools/change-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +68 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +141 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/debug-tools.d.ts +25 -0
- package/dist/tools/debug-tools.d.ts.map +1 -0
- package/dist/tools/debug-tools.js +286 -0
- package/dist/tools/debug-tools.js.map +1 -0
- package/dist/tools/evolving-tools.d.ts +23 -0
- package/dist/tools/evolving-tools.d.ts.map +1 -0
- package/dist/tools/evolving-tools.js +207 -0
- package/dist/tools/evolving-tools.js.map +1 -0
- package/dist/tools/flow-tools.d.ts +24 -0
- package/dist/tools/flow-tools.d.ts.map +1 -0
- package/dist/tools/flow-tools.js +265 -0
- package/dist/tools/flow-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +71 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +165 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +62 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +195 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/smart-tools.d.ts +23 -0
- package/dist/tools/smart-tools.d.ts.map +1 -0
- package/dist/tools/smart-tools.js +482 -0
- package/dist/tools/smart-tools.js.map +1 -0
- package/dist/tools/snapshot-tools.d.ts +19 -0
- package/dist/tools/snapshot-tools.d.ts.map +1 -0
- package/dist/tools/snapshot-tools.js +149 -0
- package/dist/tools/snapshot-tools.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +142 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/token-counter.d.ts +51 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +181 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/install.ps1 +321 -0
- package/install.sh +345 -0
- package/package.json +94 -0
- package/setup.bat +62 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Session Memory Manager
|
|
3
|
+
*
|
|
4
|
+
* Session-scoped memory management. Tracks facts and context within a single
|
|
5
|
+
* AI session: files worked on, tasks completed, decisions made, and token usage.
|
|
6
|
+
*
|
|
7
|
+
* Persists session data to SQLite so downstream components can query across
|
|
8
|
+
* sessions. Auto-generates a summary at session end.
|
|
9
|
+
*
|
|
10
|
+
* @module memory/session-memory
|
|
11
|
+
*/
|
|
12
|
+
import Database from 'better-sqlite3';
|
|
13
|
+
import type { SessionSummary } from '../types.js';
|
|
14
|
+
/** A fact recorded during a session. */
|
|
15
|
+
export interface SessionFact {
|
|
16
|
+
id: number;
|
|
17
|
+
sessionId: string;
|
|
18
|
+
kind: 'file_worked_on' | 'task_completed' | 'decision_made' | 'note' | 'error' | 'context';
|
|
19
|
+
content: string;
|
|
20
|
+
/** Optional JSON-serialized metadata (e.g. { filePath, lineRange }). */
|
|
21
|
+
metadata: string | null;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
}
|
|
24
|
+
/** Lightweight view returned by `listRecentSessions`. */
|
|
25
|
+
export interface SessionListItem {
|
|
26
|
+
sessionId: string;
|
|
27
|
+
startedAt: number;
|
|
28
|
+
endedAt: number | null;
|
|
29
|
+
totalFacts: number;
|
|
30
|
+
summary: string;
|
|
31
|
+
}
|
|
32
|
+
/** Token usage counters tracked per session. */
|
|
33
|
+
export interface TokenUsage {
|
|
34
|
+
inputTokens: number;
|
|
35
|
+
outputTokens: number;
|
|
36
|
+
contextTokens: number;
|
|
37
|
+
savedTokens: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Manages the lifecycle and content of an AI session.
|
|
41
|
+
*
|
|
42
|
+
* Usage:
|
|
43
|
+
* ```ts
|
|
44
|
+
* const sm = new SessionMemory(db);
|
|
45
|
+
* const id = sm.startSession();
|
|
46
|
+
* sm.addFact('file_worked_on', 'src/types.ts');
|
|
47
|
+
* sm.addFact('task_completed', 'Added Memory types');
|
|
48
|
+
* const summary = sm.endSession();
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class SessionMemory {
|
|
52
|
+
private db;
|
|
53
|
+
private currentSessionId;
|
|
54
|
+
private currentStartedAt;
|
|
55
|
+
private tokenUsage;
|
|
56
|
+
private stmtInsertSession;
|
|
57
|
+
private stmtEndSession;
|
|
58
|
+
private stmtInsertFact;
|
|
59
|
+
private stmtGetFacts;
|
|
60
|
+
private stmtGetSession;
|
|
61
|
+
private stmtRecentSessions;
|
|
62
|
+
private stmtFactCountByKind;
|
|
63
|
+
private stmtUpdateTokenUsage;
|
|
64
|
+
private stmtDeleteSession;
|
|
65
|
+
private stmtDeleteFacts;
|
|
66
|
+
constructor(db: Database.Database);
|
|
67
|
+
/** Create tables if they don't already exist. */
|
|
68
|
+
private ensureSchema;
|
|
69
|
+
/** Prepare reusable statements. */
|
|
70
|
+
private prepareStatements;
|
|
71
|
+
/**
|
|
72
|
+
* Start a new session.
|
|
73
|
+
*
|
|
74
|
+
* @param sessionId - Optional custom ID. If omitted, a timestamped UUID-ish
|
|
75
|
+
* ID is generated.
|
|
76
|
+
* @returns The session ID.
|
|
77
|
+
* @throws If a session is already active.
|
|
78
|
+
*/
|
|
79
|
+
startSession(sessionId?: string): string;
|
|
80
|
+
/**
|
|
81
|
+
* End the current session.
|
|
82
|
+
*
|
|
83
|
+
* Generates a summary from facts, persists token usage, and clears state.
|
|
84
|
+
*
|
|
85
|
+
* @returns The completed `SessionSummary`.
|
|
86
|
+
* @throws If no session is active.
|
|
87
|
+
*/
|
|
88
|
+
endSession(): SessionSummary;
|
|
89
|
+
/**
|
|
90
|
+
* Get the current active session ID (or `null`).
|
|
91
|
+
*/
|
|
92
|
+
getCurrentSessionId(): string | null;
|
|
93
|
+
/**
|
|
94
|
+
* Return full information about the currently active session.
|
|
95
|
+
*/
|
|
96
|
+
getCurrentSessionInfo(): {
|
|
97
|
+
sessionId: string;
|
|
98
|
+
startedAt: number;
|
|
99
|
+
facts: SessionFact[];
|
|
100
|
+
tokenUsage: TokenUsage;
|
|
101
|
+
durationMs: number;
|
|
102
|
+
} | null;
|
|
103
|
+
/**
|
|
104
|
+
* Record a fact in the current session.
|
|
105
|
+
*
|
|
106
|
+
* @param kind - Category of fact.
|
|
107
|
+
* @param content - Human-readable description.
|
|
108
|
+
* @param metadata - Optional structured metadata (will be JSON-stringified).
|
|
109
|
+
* @returns The inserted fact ID.
|
|
110
|
+
*/
|
|
111
|
+
addFact(kind: SessionFact['kind'], content: string, metadata?: Record<string, unknown>): number;
|
|
112
|
+
/**
|
|
113
|
+
* Retrieve all facts for a specific session.
|
|
114
|
+
*/
|
|
115
|
+
getSessionFacts(sessionId: string): SessionFact[];
|
|
116
|
+
/**
|
|
117
|
+
* Get distinct files worked on in the current session.
|
|
118
|
+
*/
|
|
119
|
+
getFilesWorkedOn(): string[];
|
|
120
|
+
/**
|
|
121
|
+
* Get tasks completed in the current session.
|
|
122
|
+
*/
|
|
123
|
+
getTasksCompleted(): string[];
|
|
124
|
+
/**
|
|
125
|
+
* Get decisions made in the current session.
|
|
126
|
+
*/
|
|
127
|
+
getDecisionsMade(): string[];
|
|
128
|
+
/**
|
|
129
|
+
* Record token usage for the current session.
|
|
130
|
+
*
|
|
131
|
+
* Values are *accumulated* (added to running totals).
|
|
132
|
+
*/
|
|
133
|
+
recordTokenUsage(usage: Partial<TokenUsage>): void;
|
|
134
|
+
/** Read token usage counters for the active session. */
|
|
135
|
+
getTokenUsage(): TokenUsage;
|
|
136
|
+
/**
|
|
137
|
+
* List the N most recent sessions.
|
|
138
|
+
*
|
|
139
|
+
* @param limit - Maximum number of sessions to return (default 10).
|
|
140
|
+
*/
|
|
141
|
+
listRecentSessions(limit?: number): SessionListItem[];
|
|
142
|
+
/**
|
|
143
|
+
* Get full details of a session by its ID.
|
|
144
|
+
*/
|
|
145
|
+
getSession(sessionId: string): (SessionSummary & {
|
|
146
|
+
tokenUsage: TokenUsage;
|
|
147
|
+
}) | null;
|
|
148
|
+
/**
|
|
149
|
+
* Delete a session and all its facts.
|
|
150
|
+
*
|
|
151
|
+
* @returns `true` if the session existed and was deleted.
|
|
152
|
+
*/
|
|
153
|
+
deleteSession(sessionId: string): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Build a `SessionSummary` from raw facts.
|
|
156
|
+
*
|
|
157
|
+
* Auto-generates a human-readable paragraph summarising the session's work.
|
|
158
|
+
*/
|
|
159
|
+
private generateSummary;
|
|
160
|
+
private getFactsInternal;
|
|
161
|
+
private assertActiveSession;
|
|
162
|
+
/** Generate a session ID based on timestamp + random suffix. */
|
|
163
|
+
private generateSessionId;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=session-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-memory.d.ts","sourceRoot":"","sources":["../../src/memory/session-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Session Memory Manager
|
|
3
|
+
*
|
|
4
|
+
* Session-scoped memory management. Tracks facts and context within a single
|
|
5
|
+
* AI session: files worked on, tasks completed, decisions made, and token usage.
|
|
6
|
+
*
|
|
7
|
+
* Persists session data to SQLite so downstream components can query across
|
|
8
|
+
* sessions. Auto-generates a summary at session end.
|
|
9
|
+
*
|
|
10
|
+
* @module memory/session-memory
|
|
11
|
+
*/
|
|
12
|
+
// ────────────────────────────────────────────────────────────────
|
|
13
|
+
// SessionMemory Class
|
|
14
|
+
// ────────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Manages the lifecycle and content of an AI session.
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* ```ts
|
|
20
|
+
* const sm = new SessionMemory(db);
|
|
21
|
+
* const id = sm.startSession();
|
|
22
|
+
* sm.addFact('file_worked_on', 'src/types.ts');
|
|
23
|
+
* sm.addFact('task_completed', 'Added Memory types');
|
|
24
|
+
* const summary = sm.endSession();
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class SessionMemory {
|
|
28
|
+
db;
|
|
29
|
+
currentSessionId = null;
|
|
30
|
+
currentStartedAt = null;
|
|
31
|
+
tokenUsage = { inputTokens: 0, outputTokens: 0, contextTokens: 0, savedTokens: 0 };
|
|
32
|
+
// ── Prepared statements (lazy-initialized) ─────────────────
|
|
33
|
+
stmtInsertSession;
|
|
34
|
+
stmtEndSession;
|
|
35
|
+
stmtInsertFact;
|
|
36
|
+
stmtGetFacts;
|
|
37
|
+
stmtGetSession;
|
|
38
|
+
stmtRecentSessions;
|
|
39
|
+
stmtFactCountByKind;
|
|
40
|
+
stmtUpdateTokenUsage;
|
|
41
|
+
stmtDeleteSession;
|
|
42
|
+
stmtDeleteFacts;
|
|
43
|
+
constructor(db) {
|
|
44
|
+
this.db = db;
|
|
45
|
+
this.ensureSchema();
|
|
46
|
+
this.prepareStatements();
|
|
47
|
+
}
|
|
48
|
+
// ────────────────────────────────────────────────────────────
|
|
49
|
+
// Schema
|
|
50
|
+
// ────────────────────────────────────────────────────────────
|
|
51
|
+
/** Create tables if they don't already exist. */
|
|
52
|
+
ensureSchema() {
|
|
53
|
+
this.db.exec(`
|
|
54
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
55
|
+
session_id TEXT PRIMARY KEY,
|
|
56
|
+
started_at INTEGER NOT NULL,
|
|
57
|
+
ended_at INTEGER,
|
|
58
|
+
summary TEXT NOT NULL DEFAULT '',
|
|
59
|
+
input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
60
|
+
output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
61
|
+
context_tokens INTEGER NOT NULL DEFAULT 0,
|
|
62
|
+
saved_tokens INTEGER NOT NULL DEFAULT 0
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
CREATE TABLE IF NOT EXISTS session_facts (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
+
session_id TEXT NOT NULL,
|
|
68
|
+
kind TEXT NOT NULL,
|
|
69
|
+
content TEXT NOT NULL,
|
|
70
|
+
metadata TEXT,
|
|
71
|
+
created_at INTEGER NOT NULL,
|
|
72
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_session_facts_session
|
|
76
|
+
ON session_facts(session_id);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_session_facts_kind
|
|
78
|
+
ON session_facts(session_id, kind);
|
|
79
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_started
|
|
80
|
+
ON sessions(started_at DESC);
|
|
81
|
+
`);
|
|
82
|
+
}
|
|
83
|
+
/** Prepare reusable statements. */
|
|
84
|
+
prepareStatements() {
|
|
85
|
+
this.stmtInsertSession = this.db.prepare(`
|
|
86
|
+
INSERT INTO sessions (session_id, started_at) VALUES (?, ?)
|
|
87
|
+
`);
|
|
88
|
+
this.stmtEndSession = this.db.prepare(`
|
|
89
|
+
UPDATE sessions SET ended_at = ?, summary = ? WHERE session_id = ?
|
|
90
|
+
`);
|
|
91
|
+
this.stmtInsertFact = this.db.prepare(`
|
|
92
|
+
INSERT INTO session_facts (session_id, kind, content, metadata, created_at)
|
|
93
|
+
VALUES (?, ?, ?, ?, ?)
|
|
94
|
+
`);
|
|
95
|
+
this.stmtGetFacts = this.db.prepare(`
|
|
96
|
+
SELECT id, session_id AS sessionId, kind, content, metadata, created_at AS createdAt
|
|
97
|
+
FROM session_facts WHERE session_id = ? ORDER BY created_at ASC
|
|
98
|
+
`);
|
|
99
|
+
this.stmtGetSession = this.db.prepare(`
|
|
100
|
+
SELECT session_id AS sessionId, started_at AS startedAt, ended_at AS endedAt,
|
|
101
|
+
summary, input_tokens AS inputTokens, output_tokens AS outputTokens,
|
|
102
|
+
context_tokens AS contextTokens, saved_tokens AS savedTokens
|
|
103
|
+
FROM sessions WHERE session_id = ?
|
|
104
|
+
`);
|
|
105
|
+
this.stmtRecentSessions = this.db.prepare(`
|
|
106
|
+
SELECT s.session_id AS sessionId, s.started_at AS startedAt,
|
|
107
|
+
s.ended_at AS endedAt, s.summary,
|
|
108
|
+
(SELECT COUNT(*) FROM session_facts f WHERE f.session_id = s.session_id) AS totalFacts
|
|
109
|
+
FROM sessions s ORDER BY s.started_at DESC LIMIT ?
|
|
110
|
+
`);
|
|
111
|
+
this.stmtFactCountByKind = this.db.prepare(`
|
|
112
|
+
SELECT kind, COUNT(*) AS cnt FROM session_facts WHERE session_id = ? GROUP BY kind
|
|
113
|
+
`);
|
|
114
|
+
this.stmtUpdateTokenUsage = this.db.prepare(`
|
|
115
|
+
UPDATE sessions
|
|
116
|
+
SET input_tokens = ?, output_tokens = ?, context_tokens = ?, saved_tokens = ?
|
|
117
|
+
WHERE session_id = ?
|
|
118
|
+
`);
|
|
119
|
+
this.stmtDeleteSession = this.db.prepare(`DELETE FROM sessions WHERE session_id = ?`);
|
|
120
|
+
this.stmtDeleteFacts = this.db.prepare(`DELETE FROM session_facts WHERE session_id = ?`);
|
|
121
|
+
}
|
|
122
|
+
// ────────────────────────────────────────────────────────────
|
|
123
|
+
// Session Lifecycle
|
|
124
|
+
// ────────────────────────────────────────────────────────────
|
|
125
|
+
/**
|
|
126
|
+
* Start a new session.
|
|
127
|
+
*
|
|
128
|
+
* @param sessionId - Optional custom ID. If omitted, a timestamped UUID-ish
|
|
129
|
+
* ID is generated.
|
|
130
|
+
* @returns The session ID.
|
|
131
|
+
* @throws If a session is already active.
|
|
132
|
+
*/
|
|
133
|
+
startSession(sessionId) {
|
|
134
|
+
if (this.currentSessionId !== null) {
|
|
135
|
+
throw new Error(`Session "${this.currentSessionId}" is already active. End it first.`);
|
|
136
|
+
}
|
|
137
|
+
const id = sessionId ?? this.generateSessionId();
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
this.stmtInsertSession.run(id, now);
|
|
140
|
+
this.currentSessionId = id;
|
|
141
|
+
this.currentStartedAt = now;
|
|
142
|
+
this.tokenUsage = { inputTokens: 0, outputTokens: 0, contextTokens: 0, savedTokens: 0 };
|
|
143
|
+
return id;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* End the current session.
|
|
147
|
+
*
|
|
148
|
+
* Generates a summary from facts, persists token usage, and clears state.
|
|
149
|
+
*
|
|
150
|
+
* @returns The completed `SessionSummary`.
|
|
151
|
+
* @throws If no session is active.
|
|
152
|
+
*/
|
|
153
|
+
endSession() {
|
|
154
|
+
this.assertActiveSession();
|
|
155
|
+
const sessionId = this.currentSessionId;
|
|
156
|
+
const now = Date.now();
|
|
157
|
+
const facts = this.getFactsInternal(sessionId);
|
|
158
|
+
const summary = this.generateSummary(sessionId, facts);
|
|
159
|
+
// Persist
|
|
160
|
+
this.stmtEndSession.run(now, summary.summary, sessionId);
|
|
161
|
+
this.stmtUpdateTokenUsage.run(this.tokenUsage.inputTokens, this.tokenUsage.outputTokens, this.tokenUsage.contextTokens, this.tokenUsage.savedTokens, sessionId);
|
|
162
|
+
// Reset
|
|
163
|
+
this.currentSessionId = null;
|
|
164
|
+
this.currentStartedAt = null;
|
|
165
|
+
this.tokenUsage = { inputTokens: 0, outputTokens: 0, contextTokens: 0, savedTokens: 0 };
|
|
166
|
+
return summary;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get the current active session ID (or `null`).
|
|
170
|
+
*/
|
|
171
|
+
getCurrentSessionId() {
|
|
172
|
+
return this.currentSessionId;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Return full information about the currently active session.
|
|
176
|
+
*/
|
|
177
|
+
getCurrentSessionInfo() {
|
|
178
|
+
if (this.currentSessionId === null || this.currentStartedAt === null) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
sessionId: this.currentSessionId,
|
|
183
|
+
startedAt: this.currentStartedAt,
|
|
184
|
+
facts: this.getFactsInternal(this.currentSessionId),
|
|
185
|
+
tokenUsage: { ...this.tokenUsage },
|
|
186
|
+
durationMs: Date.now() - this.currentStartedAt,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// ────────────────────────────────────────────────────────────
|
|
190
|
+
// Facts
|
|
191
|
+
// ────────────────────────────────────────────────────────────
|
|
192
|
+
/**
|
|
193
|
+
* Record a fact in the current session.
|
|
194
|
+
*
|
|
195
|
+
* @param kind - Category of fact.
|
|
196
|
+
* @param content - Human-readable description.
|
|
197
|
+
* @param metadata - Optional structured metadata (will be JSON-stringified).
|
|
198
|
+
* @returns The inserted fact ID.
|
|
199
|
+
*/
|
|
200
|
+
addFact(kind, content, metadata) {
|
|
201
|
+
this.assertActiveSession();
|
|
202
|
+
const now = Date.now();
|
|
203
|
+
const metaStr = metadata ? JSON.stringify(metadata) : null;
|
|
204
|
+
const info = this.stmtInsertFact.run(this.currentSessionId, kind, content, metaStr, now);
|
|
205
|
+
return Number(info.lastInsertRowid);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Retrieve all facts for a specific session.
|
|
209
|
+
*/
|
|
210
|
+
getSessionFacts(sessionId) {
|
|
211
|
+
return this.getFactsInternal(sessionId);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get distinct files worked on in the current session.
|
|
215
|
+
*/
|
|
216
|
+
getFilesWorkedOn() {
|
|
217
|
+
this.assertActiveSession();
|
|
218
|
+
const facts = this.getFactsInternal(this.currentSessionId);
|
|
219
|
+
return [...new Set(facts
|
|
220
|
+
.filter(f => f.kind === 'file_worked_on')
|
|
221
|
+
.map(f => f.content))];
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get tasks completed in the current session.
|
|
225
|
+
*/
|
|
226
|
+
getTasksCompleted() {
|
|
227
|
+
this.assertActiveSession();
|
|
228
|
+
return this.getFactsInternal(this.currentSessionId)
|
|
229
|
+
.filter(f => f.kind === 'task_completed')
|
|
230
|
+
.map(f => f.content);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get decisions made in the current session.
|
|
234
|
+
*/
|
|
235
|
+
getDecisionsMade() {
|
|
236
|
+
this.assertActiveSession();
|
|
237
|
+
return this.getFactsInternal(this.currentSessionId)
|
|
238
|
+
.filter(f => f.kind === 'decision_made')
|
|
239
|
+
.map(f => f.content);
|
|
240
|
+
}
|
|
241
|
+
// ────────────────────────────────────────────────────────────
|
|
242
|
+
// Token Tracking
|
|
243
|
+
// ────────────────────────────────────────────────────────────
|
|
244
|
+
/**
|
|
245
|
+
* Record token usage for the current session.
|
|
246
|
+
*
|
|
247
|
+
* Values are *accumulated* (added to running totals).
|
|
248
|
+
*/
|
|
249
|
+
recordTokenUsage(usage) {
|
|
250
|
+
this.assertActiveSession();
|
|
251
|
+
if (usage.inputTokens)
|
|
252
|
+
this.tokenUsage.inputTokens += usage.inputTokens;
|
|
253
|
+
if (usage.outputTokens)
|
|
254
|
+
this.tokenUsage.outputTokens += usage.outputTokens;
|
|
255
|
+
if (usage.contextTokens)
|
|
256
|
+
this.tokenUsage.contextTokens += usage.contextTokens;
|
|
257
|
+
if (usage.savedTokens)
|
|
258
|
+
this.tokenUsage.savedTokens += usage.savedTokens;
|
|
259
|
+
}
|
|
260
|
+
/** Read token usage counters for the active session. */
|
|
261
|
+
getTokenUsage() {
|
|
262
|
+
this.assertActiveSession();
|
|
263
|
+
return { ...this.tokenUsage };
|
|
264
|
+
}
|
|
265
|
+
// ────────────────────────────────────────────────────────────
|
|
266
|
+
// Queries (cross-session)
|
|
267
|
+
// ────────────────────────────────────────────────────────────
|
|
268
|
+
/**
|
|
269
|
+
* List the N most recent sessions.
|
|
270
|
+
*
|
|
271
|
+
* @param limit - Maximum number of sessions to return (default 10).
|
|
272
|
+
*/
|
|
273
|
+
listRecentSessions(limit = 10) {
|
|
274
|
+
return this.stmtRecentSessions.all(limit);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get full details of a session by its ID.
|
|
278
|
+
*/
|
|
279
|
+
getSession(sessionId) {
|
|
280
|
+
const row = this.stmtGetSession.get(sessionId);
|
|
281
|
+
if (!row)
|
|
282
|
+
return null;
|
|
283
|
+
const facts = this.getFactsInternal(sessionId);
|
|
284
|
+
return {
|
|
285
|
+
sessionId: row.sessionId,
|
|
286
|
+
startedAt: row.startedAt,
|
|
287
|
+
endedAt: row.endedAt ?? Date.now(),
|
|
288
|
+
tasksCompleted: facts.filter(f => f.kind === 'task_completed').map(f => f.content),
|
|
289
|
+
filesModified: [...new Set(facts.filter(f => f.kind === 'file_worked_on').map(f => f.content))],
|
|
290
|
+
decisionseMade: facts.filter(f => f.kind === 'decision_made').map(f => f.content),
|
|
291
|
+
memoriesCreated: 0, // Populated by caller if needed
|
|
292
|
+
tokensSaved: row.savedTokens,
|
|
293
|
+
summary: row.summary,
|
|
294
|
+
tokenUsage: {
|
|
295
|
+
inputTokens: row.inputTokens,
|
|
296
|
+
outputTokens: row.outputTokens,
|
|
297
|
+
contextTokens: row.contextTokens,
|
|
298
|
+
savedTokens: row.savedTokens,
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Delete a session and all its facts.
|
|
304
|
+
*
|
|
305
|
+
* @returns `true` if the session existed and was deleted.
|
|
306
|
+
*/
|
|
307
|
+
deleteSession(sessionId) {
|
|
308
|
+
if (sessionId === this.currentSessionId) {
|
|
309
|
+
throw new Error('Cannot delete the currently active session.');
|
|
310
|
+
}
|
|
311
|
+
const txn = this.db.transaction(() => {
|
|
312
|
+
this.stmtDeleteFacts.run(sessionId);
|
|
313
|
+
const info = this.stmtDeleteSession.run(sessionId);
|
|
314
|
+
return info.changes > 0;
|
|
315
|
+
});
|
|
316
|
+
return txn();
|
|
317
|
+
}
|
|
318
|
+
// ────────────────────────────────────────────────────────────
|
|
319
|
+
// Summary Generation
|
|
320
|
+
// ────────────────────────────────────────────────────────────
|
|
321
|
+
/**
|
|
322
|
+
* Build a `SessionSummary` from raw facts.
|
|
323
|
+
*
|
|
324
|
+
* Auto-generates a human-readable paragraph summarising the session's work.
|
|
325
|
+
*/
|
|
326
|
+
generateSummary(sessionId, facts) {
|
|
327
|
+
const files = [...new Set(facts.filter(f => f.kind === 'file_worked_on').map(f => f.content))];
|
|
328
|
+
const tasks = facts.filter(f => f.kind === 'task_completed').map(f => f.content);
|
|
329
|
+
const decisions = facts.filter(f => f.kind === 'decision_made').map(f => f.content);
|
|
330
|
+
const errors = facts.filter(f => f.kind === 'error');
|
|
331
|
+
const notes = facts.filter(f => f.kind === 'note' || f.kind === 'context');
|
|
332
|
+
// Build text summary
|
|
333
|
+
const parts = [];
|
|
334
|
+
if (tasks.length > 0) {
|
|
335
|
+
parts.push(`Completed ${tasks.length} task(s): ${tasks.join('; ')}.`);
|
|
336
|
+
}
|
|
337
|
+
if (files.length > 0) {
|
|
338
|
+
parts.push(`Modified ${files.length} file(s): ${files.slice(0, 10).join(', ')}${files.length > 10 ? ` (+${files.length - 10} more)` : ''}.`);
|
|
339
|
+
}
|
|
340
|
+
if (decisions.length > 0) {
|
|
341
|
+
parts.push(`Made ${decisions.length} decision(s): ${decisions.join('; ')}.`);
|
|
342
|
+
}
|
|
343
|
+
if (errors.length > 0) {
|
|
344
|
+
parts.push(`Encountered ${errors.length} error(s).`);
|
|
345
|
+
}
|
|
346
|
+
if (notes.length > 0) {
|
|
347
|
+
parts.push(`Recorded ${notes.length} note(s)/context item(s).`);
|
|
348
|
+
}
|
|
349
|
+
if (parts.length === 0) {
|
|
350
|
+
parts.push('No significant activity recorded.');
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
sessionId,
|
|
354
|
+
startedAt: this.currentStartedAt ?? Date.now(),
|
|
355
|
+
endedAt: Date.now(),
|
|
356
|
+
tasksCompleted: tasks,
|
|
357
|
+
filesModified: files,
|
|
358
|
+
decisionseMade: decisions,
|
|
359
|
+
memoriesCreated: 0,
|
|
360
|
+
tokensSaved: this.tokenUsage.savedTokens,
|
|
361
|
+
summary: parts.join(' '),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
// ────────────────────────────────────────────────────────────
|
|
365
|
+
// Helpers
|
|
366
|
+
// ────────────────────────────────────────────────────────────
|
|
367
|
+
getFactsInternal(sessionId) {
|
|
368
|
+
return this.stmtGetFacts.all(sessionId);
|
|
369
|
+
}
|
|
370
|
+
assertActiveSession() {
|
|
371
|
+
if (this.currentSessionId === null) {
|
|
372
|
+
throw new Error('No active session. Call startSession() first.');
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/** Generate a session ID based on timestamp + random suffix. */
|
|
376
|
+
generateSessionId() {
|
|
377
|
+
const ts = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);
|
|
378
|
+
const rand = Math.random().toString(36).slice(2, 8);
|
|
379
|
+
return `session-${ts}-${rand}`;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=session-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-memory.js","sourceRoot":"","sources":["../../src/memory/session-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — STRESS TEST on FlyShelf_PC
|
|
3
|
+
*
|
|
4
|
+
* Tests our MCP against a real ~1.2MB WPF codebase and measures
|
|
5
|
+
* actual token savings. No MCP protocol needed — uses modules directly.
|
|
6
|
+
*
|
|
7
|
+
* Run: node dist/stress-test.js
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=stress-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stress-test.d.ts","sourceRoot":"","sources":["../src/stress-test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|