claude-conversation-memory-mcp 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.
- package/LICENSE +21 -0
- package/README.md +223 -0
- package/dist/ConversationMemory.d.ts +80 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +203 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/documentation/CodeAnalyzer.d.ts +29 -0
- package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
- package/dist/documentation/CodeAnalyzer.js +122 -0
- package/dist/documentation/CodeAnalyzer.js.map +1 -0
- package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
- package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
- package/dist/documentation/ConversationAnalyzer.js +156 -0
- package/dist/documentation/ConversationAnalyzer.js.map +1 -0
- package/dist/documentation/CrossReferencer.d.ts +67 -0
- package/dist/documentation/CrossReferencer.d.ts.map +1 -0
- package/dist/documentation/CrossReferencer.js +247 -0
- package/dist/documentation/CrossReferencer.js.map +1 -0
- package/dist/documentation/DocumentationGenerator.d.ts +22 -0
- package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
- package/dist/documentation/DocumentationGenerator.js +57 -0
- package/dist/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/documentation/MarkdownFormatter.d.ts +26 -0
- package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
- package/dist/documentation/MarkdownFormatter.js +301 -0
- package/dist/documentation/MarkdownFormatter.js.map +1 -0
- package/dist/documentation/types.d.ts +176 -0
- package/dist/documentation/types.d.ts.map +1 -0
- package/dist/documentation/types.js +5 -0
- package/dist/documentation/types.js.map +1 -0
- package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
- package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingConfig.js +132 -0
- package/dist/embeddings/EmbeddingConfig.js.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +129 -0
- package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
- package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingProvider.js +6 -0
- package/dist/embeddings/EmbeddingProvider.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +75 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +220 -0
- package/dist/embeddings/VectorStore.js.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +138 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +325 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +76 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +305 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +71 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +283 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +86 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +341 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +70 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +252 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +90 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +352 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +53 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +249 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +88 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +281 -0
- package/dist/storage/SQLiteManager.js.map +1 -0
- package/dist/storage/migrations.d.ts +54 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +153 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +321 -0
- package/dist/tools/ToolDefinitions.d.ts +265 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +261 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +56 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +431 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +333 -0
- package/dist/types/ToolTypes.d.ts.map +1 -0
- package/dist/types/ToolTypes.js +6 -0
- package/dist/types/ToolTypes.js.map +1 -0
- package/dist/utils/sanitization.d.ts +35 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +97 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database migration system
|
|
3
|
+
* Follows patterns from code-graph-rag-mcp for versioned schema updates
|
|
4
|
+
*/
|
|
5
|
+
import { SQLiteManager } from "./SQLiteManager.js";
|
|
6
|
+
export interface Migration {
|
|
7
|
+
version: number;
|
|
8
|
+
description: string;
|
|
9
|
+
up: string;
|
|
10
|
+
down?: string;
|
|
11
|
+
checksum?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const migrations: Migration[];
|
|
14
|
+
export declare class MigrationManager {
|
|
15
|
+
private db;
|
|
16
|
+
constructor(db: SQLiteManager);
|
|
17
|
+
/**
|
|
18
|
+
* Get current schema version
|
|
19
|
+
*/
|
|
20
|
+
getCurrentVersion(): number;
|
|
21
|
+
/**
|
|
22
|
+
* Get all pending migrations
|
|
23
|
+
*/
|
|
24
|
+
getPendingMigrations(): Migration[];
|
|
25
|
+
/**
|
|
26
|
+
* Apply a single migration
|
|
27
|
+
*/
|
|
28
|
+
applyMigration(migration: Migration): void;
|
|
29
|
+
/**
|
|
30
|
+
* Apply all pending migrations
|
|
31
|
+
*/
|
|
32
|
+
applyPendingMigrations(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Rollback to a specific version
|
|
35
|
+
*/
|
|
36
|
+
rollbackTo(targetVersion: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Calculate migration checksum for verification
|
|
39
|
+
*/
|
|
40
|
+
private calculateChecksum;
|
|
41
|
+
/**
|
|
42
|
+
* Verify migration integrity
|
|
43
|
+
*/
|
|
44
|
+
verifyMigrations(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Get migration history
|
|
47
|
+
*/
|
|
48
|
+
getHistory(): Array<{
|
|
49
|
+
version: number;
|
|
50
|
+
description: string;
|
|
51
|
+
applied_at: number;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/storage/migrations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,UAAU,EAAE,SAAS,EAiBjC,CAAC;AAEF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAgB;gBAEd,EAAE,EAAE,aAAa;IAI7B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,oBAAoB,IAAI,SAAS,EAAE;IAKnC;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAiC1C;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAiB9B;;OAEG;IACH,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAyCvC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IA2B3B;;OAEG;IACH,UAAU,IAAI,KAAK,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CAWH"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database migration system
|
|
3
|
+
* Follows patterns from code-graph-rag-mcp for versioned schema updates
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from "crypto";
|
|
6
|
+
export const migrations = [
|
|
7
|
+
{
|
|
8
|
+
version: 1,
|
|
9
|
+
description: "Initial schema with 17 tables for conversation memory",
|
|
10
|
+
up: `
|
|
11
|
+
-- Schema is already created by schema.sql during initialization
|
|
12
|
+
-- This migration just records the version
|
|
13
|
+
`,
|
|
14
|
+
},
|
|
15
|
+
// Future migrations will be added here
|
|
16
|
+
// Example:
|
|
17
|
+
// {
|
|
18
|
+
// version: 2,
|
|
19
|
+
// description: "Add new column for X",
|
|
20
|
+
// up: "ALTER TABLE conversations ADD COLUMN new_field TEXT",
|
|
21
|
+
// down: "ALTER TABLE conversations DROP COLUMN new_field"
|
|
22
|
+
// }
|
|
23
|
+
];
|
|
24
|
+
export class MigrationManager {
|
|
25
|
+
db;
|
|
26
|
+
constructor(db) {
|
|
27
|
+
this.db = db;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get current schema version
|
|
31
|
+
*/
|
|
32
|
+
getCurrentVersion() {
|
|
33
|
+
return this.db.getSchemaVersion();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get all pending migrations
|
|
37
|
+
*/
|
|
38
|
+
getPendingMigrations() {
|
|
39
|
+
const currentVersion = this.getCurrentVersion();
|
|
40
|
+
return migrations.filter((m) => m.version > currentVersion);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Apply a single migration
|
|
44
|
+
*/
|
|
45
|
+
applyMigration(migration) {
|
|
46
|
+
console.log(`Applying migration v${migration.version}: ${migration.description}`);
|
|
47
|
+
// Calculate checksum
|
|
48
|
+
const checksum = this.calculateChecksum(migration);
|
|
49
|
+
// Execute migration in a transaction
|
|
50
|
+
this.db.transaction(() => {
|
|
51
|
+
// Execute the migration SQL
|
|
52
|
+
if (migration.up && migration.up.trim()) {
|
|
53
|
+
const statements = migration.up
|
|
54
|
+
.split(";")
|
|
55
|
+
.map((s) => s.trim())
|
|
56
|
+
.filter((s) => s.length > 0 && !s.startsWith("--"));
|
|
57
|
+
for (const statement of statements) {
|
|
58
|
+
this.db.exec(statement);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Record migration
|
|
62
|
+
this.db
|
|
63
|
+
.prepare("INSERT INTO schema_version (version, applied_at, description, checksum) VALUES (?, ?, ?, ?)")
|
|
64
|
+
.run(migration.version, Date.now(), migration.description, checksum);
|
|
65
|
+
});
|
|
66
|
+
console.log(`Migration v${migration.version} applied successfully`);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Apply all pending migrations
|
|
70
|
+
*/
|
|
71
|
+
applyPendingMigrations() {
|
|
72
|
+
const pending = this.getPendingMigrations();
|
|
73
|
+
if (pending.length === 0) {
|
|
74
|
+
console.log("No pending migrations");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
console.log(`Found ${pending.length} pending migrations`);
|
|
78
|
+
for (const migration of pending) {
|
|
79
|
+
this.applyMigration(migration);
|
|
80
|
+
}
|
|
81
|
+
console.log("All migrations applied successfully");
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Rollback to a specific version
|
|
85
|
+
*/
|
|
86
|
+
rollbackTo(targetVersion) {
|
|
87
|
+
const currentVersion = this.getCurrentVersion();
|
|
88
|
+
if (targetVersion >= currentVersion) {
|
|
89
|
+
console.log("Nothing to rollback");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Get migrations to rollback (in reverse order)
|
|
93
|
+
const toRollback = migrations
|
|
94
|
+
.filter((m) => m.version > targetVersion && m.version <= currentVersion)
|
|
95
|
+
.sort((a, b) => b.version - a.version);
|
|
96
|
+
for (const migration of toRollback) {
|
|
97
|
+
if (!migration.down) {
|
|
98
|
+
throw new Error(`Migration v${migration.version} does not support rollback`);
|
|
99
|
+
}
|
|
100
|
+
console.log(`Rolling back migration v${migration.version}`);
|
|
101
|
+
const downSql = migration.down;
|
|
102
|
+
if (!downSql) {
|
|
103
|
+
throw new Error(`Migration v${migration.version} has no rollback SQL`);
|
|
104
|
+
}
|
|
105
|
+
this.db.transaction(() => {
|
|
106
|
+
// Execute rollback SQL
|
|
107
|
+
this.db.exec(downSql);
|
|
108
|
+
// Remove migration record
|
|
109
|
+
this.db
|
|
110
|
+
.prepare("DELETE FROM schema_version WHERE version = ?")
|
|
111
|
+
.run(migration.version);
|
|
112
|
+
});
|
|
113
|
+
console.log(`Migration v${migration.version} rolled back`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Calculate migration checksum for verification
|
|
118
|
+
*/
|
|
119
|
+
calculateChecksum(migration) {
|
|
120
|
+
const content = `${migration.version}:${migration.description}:${migration.up}`;
|
|
121
|
+
return createHash("sha256").update(content).digest("hex");
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Verify migration integrity
|
|
125
|
+
*/
|
|
126
|
+
verifyMigrations() {
|
|
127
|
+
const applied = this.db
|
|
128
|
+
.prepare("SELECT version, checksum FROM schema_version WHERE version > 0 ORDER BY version")
|
|
129
|
+
.all();
|
|
130
|
+
for (const record of applied) {
|
|
131
|
+
const migration = migrations.find((m) => m.version === record.version);
|
|
132
|
+
if (!migration) {
|
|
133
|
+
console.error(`Migration v${record.version} not found in code`);
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
const expectedChecksum = this.calculateChecksum(migration);
|
|
137
|
+
if (record.checksum && record.checksum !== expectedChecksum) {
|
|
138
|
+
console.error(`Migration v${record.version} checksum mismatch - database may be corrupted`);
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get migration history
|
|
146
|
+
*/
|
|
147
|
+
getHistory() {
|
|
148
|
+
return this.db
|
|
149
|
+
.prepare("SELECT version, description, applied_at FROM schema_version ORDER BY version")
|
|
150
|
+
.all();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/storage/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
-- Claude Conversation Memory Database Schema
|
|
2
|
+
-- Version: 1.0.0
|
|
3
|
+
-- Optimized for SQLite + sqlite-vec
|
|
4
|
+
|
|
5
|
+
-- ==================================================
|
|
6
|
+
-- CORE TABLES
|
|
7
|
+
-- ==================================================
|
|
8
|
+
|
|
9
|
+
-- Table 1: Conversations
|
|
10
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
11
|
+
id TEXT PRIMARY KEY, -- sessionId from JSONL
|
|
12
|
+
project_path TEXT NOT NULL, -- Derived from directory name
|
|
13
|
+
first_message_at INTEGER NOT NULL,
|
|
14
|
+
last_message_at INTEGER NOT NULL,
|
|
15
|
+
message_count INTEGER DEFAULT 0,
|
|
16
|
+
git_branch TEXT, -- Most recent branch
|
|
17
|
+
claude_version TEXT, -- Most recent version
|
|
18
|
+
metadata TEXT, -- JSON: {cwd, tags}
|
|
19
|
+
created_at INTEGER NOT NULL,
|
|
20
|
+
updated_at INTEGER NOT NULL
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_conv_project ON conversations(project_path);
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_conv_time ON conversations(last_message_at);
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_conv_branch ON conversations(git_branch);
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_conv_created ON conversations(created_at);
|
|
27
|
+
|
|
28
|
+
-- Table 2: Messages
|
|
29
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
30
|
+
id TEXT PRIMARY KEY, -- uuid from JSONL
|
|
31
|
+
conversation_id TEXT NOT NULL,
|
|
32
|
+
parent_id TEXT, -- parentUuid (threading)
|
|
33
|
+
message_type TEXT NOT NULL, -- user/assistant/system/summary/file-history-snapshot
|
|
34
|
+
role TEXT, -- user/assistant (for user/assistant types)
|
|
35
|
+
content TEXT, -- Main message content
|
|
36
|
+
timestamp INTEGER NOT NULL,
|
|
37
|
+
is_sidechain INTEGER DEFAULT 0, -- Agent messages (boolean as integer)
|
|
38
|
+
agent_id TEXT, -- For agent messages
|
|
39
|
+
request_id TEXT, -- API request ID
|
|
40
|
+
git_branch TEXT,
|
|
41
|
+
cwd TEXT,
|
|
42
|
+
metadata TEXT, -- JSON: full message metadata
|
|
43
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
|
|
44
|
+
FOREIGN KEY (parent_id) REFERENCES messages(id) ON DELETE SET NULL
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_msg_conv ON messages(conversation_id);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_msg_parent ON messages(parent_id);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_msg_type ON messages(message_type);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_msg_time ON messages(timestamp);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_msg_conv_time ON messages(conversation_id, timestamp);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_msg_role ON messages(role);
|
|
53
|
+
|
|
54
|
+
-- Table 3: Tool Uses
|
|
55
|
+
CREATE TABLE IF NOT EXISTS tool_uses (
|
|
56
|
+
id TEXT PRIMARY KEY, -- tool_use_id (toolu_xxx)
|
|
57
|
+
message_id TEXT NOT NULL,
|
|
58
|
+
tool_name TEXT NOT NULL, -- Bash, Read, Write, Edit, etc.
|
|
59
|
+
tool_input TEXT NOT NULL, -- JSON parameters
|
|
60
|
+
timestamp INTEGER NOT NULL,
|
|
61
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_tool_msg ON tool_uses(message_id);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_tool_name ON tool_uses(tool_name);
|
|
66
|
+
CREATE INDEX IF NOT EXISTS idx_tool_time ON tool_uses(timestamp);
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_tool_name_time ON tool_uses(tool_name, timestamp);
|
|
68
|
+
|
|
69
|
+
-- Table 4: Tool Results
|
|
70
|
+
CREATE TABLE IF NOT EXISTS tool_results (
|
|
71
|
+
id TEXT PRIMARY KEY,
|
|
72
|
+
tool_use_id TEXT NOT NULL,
|
|
73
|
+
message_id TEXT NOT NULL,
|
|
74
|
+
content TEXT,
|
|
75
|
+
is_error INTEGER DEFAULT 0, -- Boolean as integer
|
|
76
|
+
stdout TEXT,
|
|
77
|
+
stderr TEXT,
|
|
78
|
+
is_image INTEGER DEFAULT 0, -- Boolean as integer
|
|
79
|
+
timestamp INTEGER NOT NULL,
|
|
80
|
+
FOREIGN KEY (tool_use_id) REFERENCES tool_uses(id) ON DELETE CASCADE,
|
|
81
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_result_tool ON tool_results(tool_use_id);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_result_msg ON tool_results(message_id);
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_result_error ON tool_results(is_error);
|
|
87
|
+
|
|
88
|
+
-- Table 5: File Edits
|
|
89
|
+
CREATE TABLE IF NOT EXISTS file_edits (
|
|
90
|
+
id TEXT PRIMARY KEY,
|
|
91
|
+
conversation_id TEXT NOT NULL,
|
|
92
|
+
file_path TEXT NOT NULL,
|
|
93
|
+
message_id TEXT NOT NULL,
|
|
94
|
+
backup_version INTEGER,
|
|
95
|
+
backup_time INTEGER,
|
|
96
|
+
snapshot_timestamp INTEGER NOT NULL,
|
|
97
|
+
metadata TEXT, -- JSON from trackedFileBackups
|
|
98
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
|
|
99
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_edit_file ON file_edits(file_path);
|
|
103
|
+
CREATE INDEX IF NOT EXISTS idx_edit_conv ON file_edits(conversation_id);
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_edit_time ON file_edits(snapshot_timestamp);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_edit_file_time ON file_edits(file_path, snapshot_timestamp);
|
|
106
|
+
|
|
107
|
+
-- Table 6: Thinking Blocks
|
|
108
|
+
CREATE TABLE IF NOT EXISTS thinking_blocks (
|
|
109
|
+
id TEXT PRIMARY KEY,
|
|
110
|
+
message_id TEXT NOT NULL,
|
|
111
|
+
thinking_content TEXT NOT NULL,
|
|
112
|
+
signature TEXT,
|
|
113
|
+
timestamp INTEGER NOT NULL,
|
|
114
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_think_msg ON thinking_blocks(message_id);
|
|
118
|
+
|
|
119
|
+
-- ==================================================
|
|
120
|
+
-- ENHANCED MEMORY TABLES
|
|
121
|
+
-- ==================================================
|
|
122
|
+
|
|
123
|
+
-- Table 7: Decisions (Critical for preventing regressions)
|
|
124
|
+
CREATE TABLE IF NOT EXISTS decisions (
|
|
125
|
+
id TEXT PRIMARY KEY,
|
|
126
|
+
conversation_id TEXT NOT NULL,
|
|
127
|
+
message_id TEXT NOT NULL,
|
|
128
|
+
decision_text TEXT NOT NULL,
|
|
129
|
+
rationale TEXT,
|
|
130
|
+
alternatives_considered TEXT, -- JSON array
|
|
131
|
+
rejected_reasons TEXT, -- JSON object
|
|
132
|
+
context TEXT, -- What feature/area
|
|
133
|
+
related_files TEXT, -- JSON array
|
|
134
|
+
related_commits TEXT, -- JSON array (git hashes)
|
|
135
|
+
timestamp INTEGER NOT NULL,
|
|
136
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
|
|
137
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_decision_conv ON decisions(conversation_id);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_decision_time ON decisions(timestamp);
|
|
142
|
+
CREATE INDEX IF NOT EXISTS idx_decision_context ON decisions(context);
|
|
143
|
+
|
|
144
|
+
-- Table 8: Git Commits (Essential for linking code to conversations)
|
|
145
|
+
CREATE TABLE IF NOT EXISTS git_commits (
|
|
146
|
+
hash TEXT PRIMARY KEY,
|
|
147
|
+
message TEXT NOT NULL,
|
|
148
|
+
author TEXT,
|
|
149
|
+
timestamp INTEGER NOT NULL,
|
|
150
|
+
branch TEXT,
|
|
151
|
+
files_changed TEXT, -- JSON array
|
|
152
|
+
conversation_id TEXT, -- Linked conversation
|
|
153
|
+
related_message_id TEXT, -- Message that led to commit
|
|
154
|
+
metadata TEXT, -- JSON: stats, etc.
|
|
155
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE SET NULL,
|
|
156
|
+
FOREIGN KEY (related_message_id) REFERENCES messages(id) ON DELETE SET NULL
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
CREATE INDEX IF NOT EXISTS idx_commit_conv ON git_commits(conversation_id);
|
|
160
|
+
CREATE INDEX IF NOT EXISTS idx_commit_time ON git_commits(timestamp);
|
|
161
|
+
CREATE INDEX IF NOT EXISTS idx_commit_branch ON git_commits(branch);
|
|
162
|
+
|
|
163
|
+
-- Table 9: Mistakes (Learning from errors)
|
|
164
|
+
CREATE TABLE IF NOT EXISTS mistakes (
|
|
165
|
+
id TEXT PRIMARY KEY,
|
|
166
|
+
conversation_id TEXT NOT NULL,
|
|
167
|
+
message_id TEXT NOT NULL,
|
|
168
|
+
mistake_type TEXT NOT NULL, -- logic_error, wrong_approach, misunderstanding
|
|
169
|
+
what_went_wrong TEXT NOT NULL,
|
|
170
|
+
correction TEXT,
|
|
171
|
+
user_correction_message TEXT,
|
|
172
|
+
files_affected TEXT, -- JSON array
|
|
173
|
+
timestamp INTEGER NOT NULL,
|
|
174
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
|
|
175
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
CREATE INDEX IF NOT EXISTS idx_mistake_conv ON mistakes(conversation_id);
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_mistake_type ON mistakes(mistake_type);
|
|
180
|
+
CREATE INDEX IF NOT EXISTS idx_mistake_time ON mistakes(timestamp);
|
|
181
|
+
|
|
182
|
+
-- Table 10: File Evolution (Timeline tracking)
|
|
183
|
+
CREATE TABLE IF NOT EXISTS file_evolution (
|
|
184
|
+
id TEXT PRIMARY KEY,
|
|
185
|
+
file_path TEXT NOT NULL,
|
|
186
|
+
conversation_id TEXT NOT NULL,
|
|
187
|
+
change_summary TEXT,
|
|
188
|
+
decision_ids TEXT, -- JSON array
|
|
189
|
+
commit_hash TEXT,
|
|
190
|
+
fixes_mistake_id TEXT,
|
|
191
|
+
timestamp INTEGER NOT NULL,
|
|
192
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
|
|
193
|
+
FOREIGN KEY (commit_hash) REFERENCES git_commits(hash) ON DELETE SET NULL,
|
|
194
|
+
FOREIGN KEY (fixes_mistake_id) REFERENCES mistakes(id) ON DELETE SET NULL
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
CREATE INDEX IF NOT EXISTS idx_evolution_file ON file_evolution(file_path);
|
|
198
|
+
CREATE INDEX IF NOT EXISTS idx_evolution_time ON file_evolution(timestamp);
|
|
199
|
+
CREATE INDEX IF NOT EXISTS idx_evolution_file_time ON file_evolution(file_path, timestamp);
|
|
200
|
+
|
|
201
|
+
-- Table 11: Requirements (Constraints tracking)
|
|
202
|
+
CREATE TABLE IF NOT EXISTS requirements (
|
|
203
|
+
id TEXT PRIMARY KEY,
|
|
204
|
+
type TEXT NOT NULL, -- dependency, performance, compatibility, business
|
|
205
|
+
description TEXT NOT NULL,
|
|
206
|
+
rationale TEXT,
|
|
207
|
+
affects_components TEXT, -- JSON array
|
|
208
|
+
conversation_id TEXT NOT NULL,
|
|
209
|
+
message_id TEXT NOT NULL,
|
|
210
|
+
timestamp INTEGER NOT NULL,
|
|
211
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
|
|
212
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
CREATE INDEX IF NOT EXISTS idx_req_type ON requirements(type);
|
|
216
|
+
CREATE INDEX IF NOT EXISTS idx_req_conv ON requirements(conversation_id);
|
|
217
|
+
|
|
218
|
+
-- Table 12: Validations (Testing context)
|
|
219
|
+
CREATE TABLE IF NOT EXISTS validations (
|
|
220
|
+
id TEXT PRIMARY KEY,
|
|
221
|
+
conversation_id TEXT NOT NULL,
|
|
222
|
+
what_was_tested TEXT NOT NULL,
|
|
223
|
+
test_command TEXT,
|
|
224
|
+
result TEXT NOT NULL, -- passed, failed, error
|
|
225
|
+
performance_data TEXT, -- JSON
|
|
226
|
+
files_tested TEXT, -- JSON array
|
|
227
|
+
timestamp INTEGER NOT NULL,
|
|
228
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
CREATE INDEX IF NOT EXISTS idx_valid_conv ON validations(conversation_id);
|
|
232
|
+
CREATE INDEX IF NOT EXISTS idx_valid_result ON validations(result);
|
|
233
|
+
|
|
234
|
+
-- Table 13: User Preferences (Pattern learning)
|
|
235
|
+
CREATE TABLE IF NOT EXISTS user_preferences (
|
|
236
|
+
id TEXT PRIMARY KEY,
|
|
237
|
+
category TEXT NOT NULL, -- coding_style, architecture, tooling
|
|
238
|
+
preference TEXT NOT NULL,
|
|
239
|
+
rationale TEXT,
|
|
240
|
+
examples TEXT, -- JSON array of conversation_ids
|
|
241
|
+
established_date INTEGER NOT NULL,
|
|
242
|
+
updated_at INTEGER NOT NULL
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
CREATE INDEX IF NOT EXISTS idx_pref_category ON user_preferences(category);
|
|
246
|
+
|
|
247
|
+
-- ==================================================
|
|
248
|
+
-- VECTOR & SEARCH TABLES
|
|
249
|
+
-- ==================================================
|
|
250
|
+
|
|
251
|
+
-- Table 14: Message Embeddings (for semantic search)
|
|
252
|
+
CREATE TABLE IF NOT EXISTS message_embeddings (
|
|
253
|
+
id TEXT PRIMARY KEY,
|
|
254
|
+
message_id TEXT NOT NULL,
|
|
255
|
+
content TEXT NOT NULL,
|
|
256
|
+
embedding BLOB NOT NULL,
|
|
257
|
+
model_name TEXT DEFAULT 'all-MiniLM-L6-v2',
|
|
258
|
+
created_at INTEGER NOT NULL,
|
|
259
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
CREATE INDEX IF NOT EXISTS idx_embed_msg ON message_embeddings(message_id);
|
|
263
|
+
|
|
264
|
+
-- Table 15: Decision Embeddings
|
|
265
|
+
CREATE TABLE IF NOT EXISTS decision_embeddings (
|
|
266
|
+
id TEXT PRIMARY KEY,
|
|
267
|
+
decision_id TEXT NOT NULL,
|
|
268
|
+
embedding BLOB NOT NULL,
|
|
269
|
+
created_at INTEGER NOT NULL,
|
|
270
|
+
FOREIGN KEY (decision_id) REFERENCES decisions(id) ON DELETE CASCADE
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
CREATE INDEX IF NOT EXISTS idx_dec_embed ON decision_embeddings(decision_id);
|
|
274
|
+
|
|
275
|
+
-- Table 16: Full-Text Search Index for Messages
|
|
276
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
|
|
277
|
+
id UNINDEXED,
|
|
278
|
+
content,
|
|
279
|
+
context,
|
|
280
|
+
metadata,
|
|
281
|
+
content=messages,
|
|
282
|
+
content_rowid=rowid
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
-- Table 17: Full-Text Search Index for Decisions
|
|
286
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS decisions_fts USING fts5(
|
|
287
|
+
id UNINDEXED,
|
|
288
|
+
decision_text,
|
|
289
|
+
rationale,
|
|
290
|
+
context,
|
|
291
|
+
content=decisions,
|
|
292
|
+
content_rowid=rowid
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
-- ==================================================
|
|
296
|
+
-- PERFORMANCE & CACHING
|
|
297
|
+
-- ==================================================
|
|
298
|
+
|
|
299
|
+
-- Query Cache (Performance optimization)
|
|
300
|
+
CREATE TABLE IF NOT EXISTS query_cache (
|
|
301
|
+
cache_key TEXT PRIMARY KEY,
|
|
302
|
+
result TEXT NOT NULL,
|
|
303
|
+
created_at INTEGER NOT NULL,
|
|
304
|
+
expires_at INTEGER NOT NULL,
|
|
305
|
+
hit_count INTEGER DEFAULT 0,
|
|
306
|
+
last_accessed INTEGER
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
CREATE INDEX IF NOT EXISTS idx_cache_expires ON query_cache(expires_at);
|
|
310
|
+
|
|
311
|
+
-- ==================================================
|
|
312
|
+
-- METADATA TABLE
|
|
313
|
+
-- ==================================================
|
|
314
|
+
|
|
315
|
+
-- Schema Version Tracking
|
|
316
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
317
|
+
version INTEGER PRIMARY KEY,
|
|
318
|
+
applied_at INTEGER NOT NULL,
|
|
319
|
+
description TEXT,
|
|
320
|
+
checksum TEXT
|
|
321
|
+
);
|