cccmemory 1.8.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 +349 -0
- package/dist/ConversationMemory.d.ts +231 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +357 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/cache/QueryCache.d.ts +215 -0
- package/dist/cache/QueryCache.d.ts.map +1 -0
- package/dist/cache/QueryCache.js +294 -0
- package/dist/cache/QueryCache.js.map +1 -0
- package/dist/cli/commands.d.ts +9 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +954 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/help.d.ts +16 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +361 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +30 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context/ContextInjector.d.ts +38 -0
- package/dist/context/ContextInjector.d.ts.map +1 -0
- package/dist/context/ContextInjector.js +235 -0
- package/dist/context/ContextInjector.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 +157 -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/ConfigManager.d.ts +46 -0
- package/dist/embeddings/ConfigManager.d.ts.map +1 -0
- package/dist/embeddings/ConfigManager.js +177 -0
- package/dist/embeddings/ConfigManager.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 +51 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +157 -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/ModelRegistry.d.ts +48 -0
- package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
- package/dist/embeddings/ModelRegistry.js +170 -0
- package/dist/embeddings/ModelRegistry.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +114 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +393 -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 +125 -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 +129 -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 +115 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/handoff/SessionHandoffStore.d.ts +80 -0
- package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
- package/dist/handoff/SessionHandoffStore.js +314 -0
- package/dist/handoff/SessionHandoffStore.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +157 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory/WorkingMemoryStore.d.ts +83 -0
- package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
- package/dist/memory/WorkingMemoryStore.js +318 -0
- package/dist/memory/WorkingMemoryStore.js.map +1 -0
- package/dist/memory/types.d.ts +192 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/parsers/CodexConversationParser.d.ts +51 -0
- package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
- package/dist/parsers/CodexConversationParser.js +301 -0
- package/dist/parsers/CodexConversationParser.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +286 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +795 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +144 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +434 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +156 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +348 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +151 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +460 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +166 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +338 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/realtime/ConversationWatcher.d.ts +87 -0
- package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
- package/dist/realtime/ConversationWatcher.js +204 -0
- package/dist/realtime/ConversationWatcher.js.map +1 -0
- package/dist/realtime/IncrementalParser.d.ts +83 -0
- package/dist/realtime/IncrementalParser.d.ts.map +1 -0
- package/dist/realtime/IncrementalParser.js +232 -0
- package/dist/realtime/IncrementalParser.js.map +1 -0
- package/dist/realtime/LiveExtractor.d.ts +72 -0
- package/dist/realtime/LiveExtractor.d.ts.map +1 -0
- package/dist/realtime/LiveExtractor.js +288 -0
- package/dist/realtime/LiveExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +121 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +823 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/BackupManager.d.ts +58 -0
- package/dist/storage/BackupManager.d.ts.map +1 -0
- package/dist/storage/BackupManager.js +223 -0
- package/dist/storage/BackupManager.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +341 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +792 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/DeletionService.d.ts +70 -0
- package/dist/storage/DeletionService.d.ts.map +1 -0
- package/dist/storage/DeletionService.js +253 -0
- package/dist/storage/DeletionService.js.map +1 -0
- package/dist/storage/GlobalIndex.d.ts +133 -0
- package/dist/storage/GlobalIndex.d.ts.map +1 -0
- package/dist/storage/GlobalIndex.js +310 -0
- package/dist/storage/GlobalIndex.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +114 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +636 -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 +285 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +436 -0
- package/dist/tools/ToolDefinitions.d.ts +946 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +937 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +791 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +3262 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +824 -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/Logger.d.ts +70 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +131 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/McpConfig.d.ts +54 -0
- package/dist/utils/McpConfig.d.ts.map +1 -0
- package/dist/utils/McpConfig.js +136 -0
- package/dist/utils/McpConfig.js.map +1 -0
- package/dist/utils/ProjectMigration.d.ts +82 -0
- package/dist/utils/ProjectMigration.d.ts.map +1 -0
- package/dist/utils/ProjectMigration.js +416 -0
- package/dist/utils/ProjectMigration.js.map +1 -0
- package/dist/utils/constants.d.ts +75 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +105 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/safeJson.d.ts +37 -0
- package/dist/utils/safeJson.d.ts.map +1 -0
- package/dist/utils/safeJson.js +48 -0
- package/dist/utils/safeJson.js.map +1 -0
- package/dist/utils/sanitization.d.ts +45 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +153 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/dist/utils/worktree.d.ts +15 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +86 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +98 -0
- package/scripts/changelog-check.sh +62 -0
- package/scripts/check-node.js +17 -0
- package/scripts/dev-config.js +56 -0
- package/scripts/postinstall.js +117 -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,EA4JjC,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;IA2B1C;;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,285 @@
|
|
|
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
|
+
{
|
|
16
|
+
version: 2,
|
|
17
|
+
description: "Add source_type column and global index support",
|
|
18
|
+
up: `
|
|
19
|
+
ALTER TABLE conversations ADD COLUMN source_type TEXT DEFAULT 'claude-code';
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_conv_source ON conversations(source_type)
|
|
21
|
+
`,
|
|
22
|
+
down: `
|
|
23
|
+
-- SQLite doesn't support DROP COLUMN, would need table recreation
|
|
24
|
+
`,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
version: 3,
|
|
28
|
+
description: "Fix messages_fts schema - remove non-existent context column",
|
|
29
|
+
up: `
|
|
30
|
+
-- FTS5 virtual tables can't be altered, must drop and recreate
|
|
31
|
+
-- The old schema had 'context' column which doesn't exist in messages table
|
|
32
|
+
DROP TABLE IF EXISTS messages_fts;
|
|
33
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
|
|
34
|
+
id UNINDEXED,
|
|
35
|
+
content,
|
|
36
|
+
metadata,
|
|
37
|
+
content=messages,
|
|
38
|
+
content_rowid=rowid
|
|
39
|
+
);
|
|
40
|
+
-- Rebuild FTS index from messages table
|
|
41
|
+
INSERT INTO messages_fts(messages_fts) VALUES('rebuild')
|
|
42
|
+
`,
|
|
43
|
+
down: `
|
|
44
|
+
-- Rollback: recreate old (broken) schema
|
|
45
|
+
DROP TABLE IF EXISTS messages_fts;
|
|
46
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
|
|
47
|
+
id UNINDEXED,
|
|
48
|
+
content,
|
|
49
|
+
context,
|
|
50
|
+
metadata,
|
|
51
|
+
content=messages,
|
|
52
|
+
content_rowid=rowid
|
|
53
|
+
)
|
|
54
|
+
`,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
version: 4,
|
|
58
|
+
description: "Add mistake_embeddings table and mistakes_fts for semantic search",
|
|
59
|
+
up: `
|
|
60
|
+
-- Create mistake_embeddings table for semantic search
|
|
61
|
+
CREATE TABLE IF NOT EXISTS mistake_embeddings (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
mistake_id TEXT NOT NULL,
|
|
64
|
+
embedding BLOB NOT NULL,
|
|
65
|
+
created_at INTEGER NOT NULL,
|
|
66
|
+
FOREIGN KEY (mistake_id) REFERENCES mistakes(id) ON DELETE CASCADE
|
|
67
|
+
);
|
|
68
|
+
CREATE INDEX IF NOT EXISTS idx_mistake_embeddings_mistake_id ON mistake_embeddings(mistake_id);
|
|
69
|
+
|
|
70
|
+
-- Create mistakes_fts FTS5 table (standalone, not content-synced)
|
|
71
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS mistakes_fts USING fts5(
|
|
72
|
+
id,
|
|
73
|
+
what_went_wrong,
|
|
74
|
+
correction,
|
|
75
|
+
mistake_type
|
|
76
|
+
);
|
|
77
|
+
-- Populate FTS from existing mistakes
|
|
78
|
+
INSERT INTO mistakes_fts(id, what_went_wrong, correction, mistake_type)
|
|
79
|
+
SELECT id, what_went_wrong, COALESCE(correction, ''), mistake_type FROM mistakes
|
|
80
|
+
`,
|
|
81
|
+
down: `
|
|
82
|
+
DROP TABLE IF EXISTS mistakes_fts;
|
|
83
|
+
DROP TABLE IF EXISTS mistake_embeddings
|
|
84
|
+
`,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
version: 5,
|
|
88
|
+
description: "Add live context layer tables: working_memory, session_handoffs, session_checkpoints",
|
|
89
|
+
up: `
|
|
90
|
+
-- Working Memory table for key-value context storage
|
|
91
|
+
CREATE TABLE IF NOT EXISTS working_memory (
|
|
92
|
+
id TEXT PRIMARY KEY,
|
|
93
|
+
key TEXT NOT NULL,
|
|
94
|
+
value TEXT NOT NULL,
|
|
95
|
+
context TEXT,
|
|
96
|
+
tags TEXT,
|
|
97
|
+
session_id TEXT,
|
|
98
|
+
project_path TEXT NOT NULL,
|
|
99
|
+
created_at INTEGER NOT NULL,
|
|
100
|
+
updated_at INTEGER NOT NULL,
|
|
101
|
+
expires_at INTEGER,
|
|
102
|
+
embedding BLOB,
|
|
103
|
+
UNIQUE(project_path, key)
|
|
104
|
+
);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_wm_session ON working_memory(session_id);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_wm_project ON working_memory(project_path);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_wm_expires ON working_memory(expires_at);
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_wm_key ON working_memory(key);
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_wm_project_key ON working_memory(project_path, key);
|
|
110
|
+
|
|
111
|
+
-- Session Handoffs table for context transfer
|
|
112
|
+
CREATE TABLE IF NOT EXISTS session_handoffs (
|
|
113
|
+
id TEXT PRIMARY KEY,
|
|
114
|
+
from_session_id TEXT NOT NULL,
|
|
115
|
+
project_path TEXT NOT NULL,
|
|
116
|
+
created_at INTEGER NOT NULL,
|
|
117
|
+
handoff_data TEXT NOT NULL,
|
|
118
|
+
resumed_by_session_id TEXT,
|
|
119
|
+
resumed_at INTEGER
|
|
120
|
+
);
|
|
121
|
+
CREATE INDEX IF NOT EXISTS idx_handoff_session ON session_handoffs(from_session_id);
|
|
122
|
+
CREATE INDEX IF NOT EXISTS idx_handoff_project ON session_handoffs(project_path);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_handoff_created ON session_handoffs(created_at);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_handoff_resumed ON session_handoffs(resumed_by_session_id);
|
|
125
|
+
|
|
126
|
+
-- Session Checkpoints table for real-time tracking
|
|
127
|
+
CREATE TABLE IF NOT EXISTS session_checkpoints (
|
|
128
|
+
id TEXT PRIMARY KEY,
|
|
129
|
+
session_id TEXT NOT NULL,
|
|
130
|
+
project_path TEXT NOT NULL,
|
|
131
|
+
checkpoint_number INTEGER NOT NULL,
|
|
132
|
+
created_at INTEGER NOT NULL,
|
|
133
|
+
decisions TEXT,
|
|
134
|
+
active_files TEXT,
|
|
135
|
+
task_state TEXT,
|
|
136
|
+
context_summary TEXT NOT NULL
|
|
137
|
+
);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_checkpoint_session ON session_checkpoints(session_id);
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_checkpoint_project ON session_checkpoints(project_path);
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_checkpoint_created ON session_checkpoints(created_at);
|
|
141
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_checkpoint_session_num ON session_checkpoints(session_id, checkpoint_number);
|
|
142
|
+
|
|
143
|
+
-- FTS for working memory
|
|
144
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS working_memory_fts USING fts5(
|
|
145
|
+
id UNINDEXED,
|
|
146
|
+
key,
|
|
147
|
+
value,
|
|
148
|
+
context,
|
|
149
|
+
content=working_memory,
|
|
150
|
+
content_rowid=rowid
|
|
151
|
+
)
|
|
152
|
+
`,
|
|
153
|
+
down: `
|
|
154
|
+
DROP TABLE IF EXISTS working_memory_fts;
|
|
155
|
+
DROP TABLE IF EXISTS session_checkpoints;
|
|
156
|
+
DROP TABLE IF EXISTS session_handoffs;
|
|
157
|
+
DROP TABLE IF EXISTS working_memory
|
|
158
|
+
`,
|
|
159
|
+
},
|
|
160
|
+
];
|
|
161
|
+
export class MigrationManager {
|
|
162
|
+
db;
|
|
163
|
+
constructor(db) {
|
|
164
|
+
this.db = db;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get current schema version
|
|
168
|
+
*/
|
|
169
|
+
getCurrentVersion() {
|
|
170
|
+
return this.db.getSchemaVersion();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get all pending migrations
|
|
174
|
+
*/
|
|
175
|
+
getPendingMigrations() {
|
|
176
|
+
const currentVersion = this.getCurrentVersion();
|
|
177
|
+
return migrations.filter((m) => m.version > currentVersion);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Apply a single migration
|
|
181
|
+
*/
|
|
182
|
+
applyMigration(migration) {
|
|
183
|
+
console.error(`Applying migration v${migration.version}: ${migration.description}`);
|
|
184
|
+
// Calculate checksum
|
|
185
|
+
const checksum = this.calculateChecksum(migration);
|
|
186
|
+
// Execute migration in a transaction
|
|
187
|
+
this.db.transaction(() => {
|
|
188
|
+
// Execute the migration SQL using db.exec() directly
|
|
189
|
+
// SQLite handles multiple statements and comments correctly
|
|
190
|
+
if (migration.up && migration.up.trim()) {
|
|
191
|
+
this.db.exec(migration.up);
|
|
192
|
+
}
|
|
193
|
+
// Record migration
|
|
194
|
+
this.db
|
|
195
|
+
.prepare("INSERT INTO schema_version (version, applied_at, description, checksum) VALUES (?, ?, ?, ?)")
|
|
196
|
+
.run(migration.version, Date.now(), migration.description, checksum);
|
|
197
|
+
});
|
|
198
|
+
console.error(`Migration v${migration.version} applied successfully`);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Apply all pending migrations
|
|
202
|
+
*/
|
|
203
|
+
applyPendingMigrations() {
|
|
204
|
+
const pending = this.getPendingMigrations();
|
|
205
|
+
if (pending.length === 0) {
|
|
206
|
+
console.error("No pending migrations");
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
console.error(`Found ${pending.length} pending migrations`);
|
|
210
|
+
for (const migration of pending) {
|
|
211
|
+
this.applyMigration(migration);
|
|
212
|
+
}
|
|
213
|
+
console.error("All migrations applied successfully");
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Rollback to a specific version
|
|
217
|
+
*/
|
|
218
|
+
rollbackTo(targetVersion) {
|
|
219
|
+
const currentVersion = this.getCurrentVersion();
|
|
220
|
+
if (targetVersion >= currentVersion) {
|
|
221
|
+
console.error("Nothing to rollback");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
// Get migrations to rollback (in reverse order)
|
|
225
|
+
const toRollback = migrations
|
|
226
|
+
.filter((m) => m.version > targetVersion && m.version <= currentVersion)
|
|
227
|
+
.sort((a, b) => b.version - a.version);
|
|
228
|
+
for (const migration of toRollback) {
|
|
229
|
+
if (!migration.down) {
|
|
230
|
+
throw new Error(`Migration v${migration.version} does not support rollback`);
|
|
231
|
+
}
|
|
232
|
+
console.error(`Rolling back migration v${migration.version}`);
|
|
233
|
+
const downSql = migration.down;
|
|
234
|
+
if (!downSql) {
|
|
235
|
+
throw new Error(`Migration v${migration.version} has no rollback SQL`);
|
|
236
|
+
}
|
|
237
|
+
this.db.transaction(() => {
|
|
238
|
+
// Execute rollback SQL
|
|
239
|
+
this.db.exec(downSql);
|
|
240
|
+
// Remove migration record
|
|
241
|
+
this.db
|
|
242
|
+
.prepare("DELETE FROM schema_version WHERE version = ?")
|
|
243
|
+
.run(migration.version);
|
|
244
|
+
});
|
|
245
|
+
console.error(`Migration v${migration.version} rolled back`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Calculate migration checksum for verification
|
|
250
|
+
*/
|
|
251
|
+
calculateChecksum(migration) {
|
|
252
|
+
const content = `${migration.version}:${migration.description}:${migration.up}`;
|
|
253
|
+
return createHash("sha256").update(content).digest("hex");
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Verify migration integrity
|
|
257
|
+
*/
|
|
258
|
+
verifyMigrations() {
|
|
259
|
+
const applied = this.db
|
|
260
|
+
.prepare("SELECT version, checksum FROM schema_version WHERE version > 0 ORDER BY version")
|
|
261
|
+
.all();
|
|
262
|
+
for (const record of applied) {
|
|
263
|
+
const migration = migrations.find((m) => m.version === record.version);
|
|
264
|
+
if (!migration) {
|
|
265
|
+
console.error(`Migration v${record.version} not found in code`);
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
const expectedChecksum = this.calculateChecksum(migration);
|
|
269
|
+
if (record.checksum && record.checksum !== expectedChecksum) {
|
|
270
|
+
console.error(`Migration v${record.version} checksum mismatch - database may be corrupted`);
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get migration history
|
|
278
|
+
*/
|
|
279
|
+
getHistory() {
|
|
280
|
+
return this.db
|
|
281
|
+
.prepare("SELECT version, description, applied_at FROM schema_version ORDER BY version")
|
|
282
|
+
.all();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/storage/migrations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAUpC,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,uDAAuD;QACpE,EAAE,EAAE;;;KAGH;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,iDAAiD;QAC9D,EAAE,EAAE;;;KAGH;QACD,IAAI,EAAE;;KAEL;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EACT,8DAA8D;QAChE,EAAE,EAAE;;;;;;;;;;;;;KAaH;QACD,IAAI,EAAE;;;;;;;;;;;KAWL;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,mEAAmE;QAChF,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;KAqBH;QACD,IAAI,EAAE;;;KAGL;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EACT,sFAAsF;QACxF,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+DH;QACD,IAAI,EAAE;;;;;KAKL;KACF;CACF,CAAC;AAEF,MAAM,OAAO,gBAAgB;IACnB,EAAE,CAAgB;IAE1B,YAAY,EAAiB;QAC3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAoB;QACjC,OAAO,CAAC,KAAK,CACX,uBAAuB,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,WAAW,EAAE,CACrE,CAAC;QAEF,qBAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEnD,qCAAqC;QACrC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,qDAAqD;YACrD,4DAA4D;YAC5D,IAAI,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN,6FAA6F,CAC9F;iBACA,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,cAAc,SAAS,CAAC,OAAO,uBAAuB,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,SAAS,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;QAE5D,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,aAAqB;QAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEhD,IAAI,aAAa,IAAI,cAAc,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,gDAAgD;QAChD,MAAM,UAAU,GAAG,UAAU;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,IAAI,CAAC,CAAC,OAAO,IAAI,cAAc,CAAC;aACvE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAEzC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,CAAC,OAAO,4BAA4B,CAC5D,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YAE9D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,CAAC,OAAO,sBAAsB,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBACvB,uBAAuB;gBACvB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAEtB,0BAA0B;gBAC1B,IAAI,CAAC,EAAE;qBACJ,OAAO,CAAC,8CAA8C,CAAC;qBACvD,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,KAAK,CAAC,cAAc,SAAS,CAAC,OAAO,cAAc,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,SAAoB;QAC5C,MAAM,OAAO,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;QAChF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,OAAO,CACN,iFAAiF,CAClF;aACA,GAAG,EAAyD,CAAC;QAEhE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;YAEvE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;gBAChE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;gBAC5D,OAAO,CAAC,KAAK,CACX,cAAc,MAAM,CAAC,OAAO,gDAAgD,CAC7E,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,UAAU;QAKR,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN,8EAA8E,CAC/E;aACA,GAAG,EAIJ,CAAC;IACL,CAAC;CACF"}
|