@codemcp/workflows-core 4.1.1 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conversation-manager.d.ts +2 -2
- package/dist/conversation-manager.js +1 -1
- package/dist/conversation-manager.js.map +1 -1
- package/dist/database.d.ts +3 -1
- package/dist/database.js +4 -0
- package/dist/database.js.map +1 -1
- package/dist/file-storage.d.ts +96 -0
- package/dist/file-storage.js +310 -0
- package/dist/file-storage.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/interaction-logger.d.ts +3 -3
- package/dist/interaction-logger.js +1 -1
- package/dist/interaction-logger.js.map +1 -1
- package/dist/migration.d.ts +36 -0
- package/dist/migration.js +216 -0
- package/dist/migration.js.map +1 -0
- package/dist/persistence-interface.d.ts +91 -0
- package/dist/persistence-interface.js +9 -0
- package/dist/persistence-interface.js.map +1 -0
- package/package.json +1 -1
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* between components. Generates unique conversation identifiers from
|
|
6
6
|
* project path + git branch combination.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import type { IPersistence } from './persistence-interface.js';
|
|
9
9
|
import type { ConversationState, ConversationContext } from './types.js';
|
|
10
10
|
import { WorkflowManager } from './workflow-manager.js';
|
|
11
11
|
export declare class ConversationManager {
|
|
12
12
|
private database;
|
|
13
13
|
private projectPath;
|
|
14
14
|
private workflowManager;
|
|
15
|
-
constructor(database:
|
|
15
|
+
constructor(database: IPersistence, workflowManager: WorkflowManager, projectPath: string);
|
|
16
16
|
/**
|
|
17
17
|
* Get conversation state by ID
|
|
18
18
|
*/
|
|
@@ -191,7 +191,7 @@ export class ConversationManager {
|
|
|
191
191
|
.replace(/-+/g, '-')
|
|
192
192
|
.replace(/^-|-$/g, '');
|
|
193
193
|
// For tests, use a deterministic ID
|
|
194
|
-
if (process.env
|
|
194
|
+
if (process.env['NODE_ENV'] === 'test') {
|
|
195
195
|
return `${projectName}-${cleanBranch}-p423k1`;
|
|
196
196
|
}
|
|
197
197
|
// Generate a deterministic ID based on project path and branch
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../src/conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAEnD,MAAM,OAAO,mBAAmB;IACtB,QAAQ,
|
|
1
|
+
{"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../src/conversation-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/database.d.ts
CHANGED
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
* Uses @sqlite.org/sqlite-wasm for reliable cross-platform WebAssembly bindings.
|
|
6
6
|
*/
|
|
7
7
|
import type { ConversationState, InteractionLog } from './types.js';
|
|
8
|
+
import type { IPersistence } from './persistence-interface.js';
|
|
8
9
|
/**
|
|
9
10
|
* Database connection and operations manager
|
|
11
|
+
* @deprecated Use FileStorage for new implementations. This class will be removed in a future version.
|
|
10
12
|
*/
|
|
11
|
-
export declare class Database {
|
|
13
|
+
export declare class Database implements IPersistence {
|
|
12
14
|
private db;
|
|
13
15
|
private sqlite3;
|
|
14
16
|
private dbPath;
|
package/dist/database.js
CHANGED
|
@@ -11,6 +11,7 @@ import { createLogger } from './logger.js';
|
|
|
11
11
|
const logger = createLogger('Database');
|
|
12
12
|
/**
|
|
13
13
|
* Database connection and operations manager
|
|
14
|
+
* @deprecated Use FileStorage for new implementations. This class will be removed in a future version.
|
|
14
15
|
*/
|
|
15
16
|
export class Database {
|
|
16
17
|
db = null;
|
|
@@ -199,6 +200,9 @@ export class Database {
|
|
|
199
200
|
return null;
|
|
200
201
|
}
|
|
201
202
|
const row = result[0];
|
|
203
|
+
if (!row) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
202
206
|
return {
|
|
203
207
|
conversationId: row[0],
|
|
204
208
|
projectPath: row[1],
|
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,iBAGN,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-Based Storage Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements the IPersistence interface using a file-based approach with
|
|
5
|
+
* directory-per-conversation structure. Provides transparent, human-readable
|
|
6
|
+
* persistence without SQLite dependencies.
|
|
7
|
+
*
|
|
8
|
+
* Directory Structure:
|
|
9
|
+
* .vibe/conversations/{conversationId}/
|
|
10
|
+
* state.json - ConversationState data
|
|
11
|
+
* interactions.jsonl - Append-only interaction logs (one JSON per line)
|
|
12
|
+
*/
|
|
13
|
+
import type { IPersistence } from './persistence-interface.js';
|
|
14
|
+
import type { ConversationState, InteractionLog } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* File-based persistence implementation
|
|
17
|
+
*/
|
|
18
|
+
export declare class FileStorage implements IPersistence {
|
|
19
|
+
private conversationsDir;
|
|
20
|
+
private basePath;
|
|
21
|
+
/**
|
|
22
|
+
* @param basePath - Path to the storage location (e.g., .vibe/conversation.sqlite for backward compat)
|
|
23
|
+
* In the future, this should just be the .vibe directory path.
|
|
24
|
+
* TODO: Change to accept .vibe directory path directly in v5.0 (see issue #155)
|
|
25
|
+
*/
|
|
26
|
+
constructor(basePath: string);
|
|
27
|
+
/**
|
|
28
|
+
* Initialize file-based storage
|
|
29
|
+
* Creates the conversations directory if it doesn't exist
|
|
30
|
+
* Automatically migrates from legacy SQLite if needed
|
|
31
|
+
*/
|
|
32
|
+
initialize(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Get the directory path for a conversation
|
|
35
|
+
*/
|
|
36
|
+
private getConversationDir;
|
|
37
|
+
/**
|
|
38
|
+
* Get the state file path for a conversation
|
|
39
|
+
*/
|
|
40
|
+
private getStateFilePath;
|
|
41
|
+
/**
|
|
42
|
+
* Get the interactions file path for a conversation
|
|
43
|
+
*/
|
|
44
|
+
private getInteractionsFilePath;
|
|
45
|
+
/**
|
|
46
|
+
* Write data atomically using temp file + rename
|
|
47
|
+
* Uses unique temp file names to prevent concurrent write collisions
|
|
48
|
+
*/
|
|
49
|
+
private writeAtomic;
|
|
50
|
+
/**
|
|
51
|
+
* Save or update a conversation state
|
|
52
|
+
*/
|
|
53
|
+
saveConversationState(state: ConversationState): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Get a conversation state by ID
|
|
56
|
+
* Returns null if not found or corrupted
|
|
57
|
+
*/
|
|
58
|
+
getConversationState(conversationId: string): Promise<ConversationState | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Get all conversation states
|
|
61
|
+
* Skips corrupted state files
|
|
62
|
+
*/
|
|
63
|
+
getAllConversationStates(): Promise<ConversationState[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Delete a conversation state
|
|
66
|
+
* Returns true if deleted, false if not found
|
|
67
|
+
*/
|
|
68
|
+
deleteConversationState(conversationId: string): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Log an interaction
|
|
71
|
+
* Appends to interactions.jsonl file
|
|
72
|
+
*/
|
|
73
|
+
logInteraction(log: InteractionLog): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get interaction logs for a conversation
|
|
76
|
+
* Skips corrupted JSONL lines, returns empty array if file doesn't exist
|
|
77
|
+
*/
|
|
78
|
+
getInteractionLogs(conversationId: string): Promise<InteractionLog[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Get interaction logs by conversation ID (alias for compatibility)
|
|
81
|
+
*/
|
|
82
|
+
getInteractionsByConversationId(conversationId: string): Promise<InteractionLog[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Soft delete interaction logs
|
|
85
|
+
* Actually performs hard delete (removes interactions.jsonl file)
|
|
86
|
+
*/
|
|
87
|
+
softDeleteInteractionLogs(conversationId: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Reset conversation state (update timestamp)
|
|
90
|
+
*/
|
|
91
|
+
resetConversationState(conversationId: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Close file storage (no-op for file-based storage)
|
|
94
|
+
*/
|
|
95
|
+
close(): Promise<void>;
|
|
96
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-Based Storage Implementation
|
|
3
|
+
*
|
|
4
|
+
* Implements the IPersistence interface using a file-based approach with
|
|
5
|
+
* directory-per-conversation structure. Provides transparent, human-readable
|
|
6
|
+
* persistence without SQLite dependencies.
|
|
7
|
+
*
|
|
8
|
+
* Directory Structure:
|
|
9
|
+
* .vibe/conversations/{conversationId}/
|
|
10
|
+
* state.json - ConversationState data
|
|
11
|
+
* interactions.jsonl - Append-only interaction logs (one JSON per line)
|
|
12
|
+
*/
|
|
13
|
+
import { promises as fs } from 'node:fs';
|
|
14
|
+
import { join, dirname } from 'node:path';
|
|
15
|
+
import { createLogger } from './logger.js';
|
|
16
|
+
import { autoMigrateIfNeeded } from './migration.js';
|
|
17
|
+
const logger = createLogger('FileStorage');
|
|
18
|
+
/**
|
|
19
|
+
* File-based persistence implementation
|
|
20
|
+
*/
|
|
21
|
+
export class FileStorage {
|
|
22
|
+
conversationsDir;
|
|
23
|
+
basePath;
|
|
24
|
+
/**
|
|
25
|
+
* @param basePath - Path to the storage location (e.g., .vibe/conversation.sqlite for backward compat)
|
|
26
|
+
* In the future, this should just be the .vibe directory path.
|
|
27
|
+
* TODO: Change to accept .vibe directory path directly in v5.0 (see issue #155)
|
|
28
|
+
*/
|
|
29
|
+
constructor(basePath) {
|
|
30
|
+
// For backward compatibility, basePath currently points to where conversation.sqlite was
|
|
31
|
+
// We derive the conversations directory from this
|
|
32
|
+
// TODO: In v5.0, accept .vibe directory path directly and use join(basePath, 'conversations')
|
|
33
|
+
this.basePath = basePath;
|
|
34
|
+
this.conversationsDir = join(dirname(basePath), 'conversations');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize file-based storage
|
|
38
|
+
* Creates the conversations directory if it doesn't exist
|
|
39
|
+
* Automatically migrates from legacy SQLite if needed
|
|
40
|
+
*/
|
|
41
|
+
async initialize() {
|
|
42
|
+
try {
|
|
43
|
+
// Check for legacy SQLite and migrate if needed
|
|
44
|
+
await autoMigrateIfNeeded(this.basePath);
|
|
45
|
+
// Create conversations directory
|
|
46
|
+
await fs.mkdir(this.conversationsDir, { recursive: true });
|
|
47
|
+
logger.debug('FileStorage initialized', {
|
|
48
|
+
conversationsDir: this.conversationsDir,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.error('Failed to initialize FileStorage', error);
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the directory path for a conversation
|
|
58
|
+
*/
|
|
59
|
+
getConversationDir(conversationId) {
|
|
60
|
+
return join(this.conversationsDir, conversationId);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the state file path for a conversation
|
|
64
|
+
*/
|
|
65
|
+
getStateFilePath(conversationId) {
|
|
66
|
+
return join(this.getConversationDir(conversationId), 'state.json');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the interactions file path for a conversation
|
|
70
|
+
*/
|
|
71
|
+
getInteractionsFilePath(conversationId) {
|
|
72
|
+
return join(this.getConversationDir(conversationId), 'interactions.jsonl');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Write data atomically using temp file + rename
|
|
76
|
+
* Uses unique temp file names to prevent concurrent write collisions
|
|
77
|
+
*/
|
|
78
|
+
async writeAtomic(filePath, data) {
|
|
79
|
+
// Use timestamp + random suffix to ensure unique temp file names for concurrent operations
|
|
80
|
+
const uniqueSuffix = `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
81
|
+
const tempPath = `${filePath}.tmp.${uniqueSuffix}`;
|
|
82
|
+
try {
|
|
83
|
+
await fs.writeFile(tempPath, data, 'utf-8');
|
|
84
|
+
await fs.rename(tempPath, filePath);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
// Clean up temp file if it exists
|
|
88
|
+
try {
|
|
89
|
+
await fs.unlink(tempPath);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Ignore cleanup errors
|
|
93
|
+
}
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Save or update a conversation state
|
|
99
|
+
*/
|
|
100
|
+
async saveConversationState(state) {
|
|
101
|
+
const conversationDir = this.getConversationDir(state.conversationId);
|
|
102
|
+
const stateFilePath = this.getStateFilePath(state.conversationId);
|
|
103
|
+
try {
|
|
104
|
+
// Ensure conversation directory exists
|
|
105
|
+
await fs.mkdir(conversationDir, { recursive: true });
|
|
106
|
+
// Write state atomically
|
|
107
|
+
const stateJson = JSON.stringify(state, null, 2);
|
|
108
|
+
await this.writeAtomic(stateFilePath, stateJson);
|
|
109
|
+
logger.debug('Conversation state saved', {
|
|
110
|
+
conversationId: state.conversationId,
|
|
111
|
+
currentPhase: state.currentPhase,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
logger.error('Failed to save conversation state', error, {
|
|
116
|
+
conversationId: state.conversationId,
|
|
117
|
+
});
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get a conversation state by ID
|
|
123
|
+
* Returns null if not found or corrupted
|
|
124
|
+
*/
|
|
125
|
+
async getConversationState(conversationId) {
|
|
126
|
+
const stateFilePath = this.getStateFilePath(conversationId);
|
|
127
|
+
try {
|
|
128
|
+
const stateJson = await fs.readFile(stateFilePath, 'utf-8');
|
|
129
|
+
const state = JSON.parse(stateJson);
|
|
130
|
+
return state;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error.code === 'ENOENT') {
|
|
134
|
+
// File doesn't exist - return null (expected for non-existent conversations)
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
// JSON parse error or other error - log warning and return null
|
|
138
|
+
logger.warn('Failed to read conversation state, returning null', {
|
|
139
|
+
conversationId,
|
|
140
|
+
error: error.message,
|
|
141
|
+
});
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get all conversation states
|
|
147
|
+
* Skips corrupted state files
|
|
148
|
+
*/
|
|
149
|
+
async getAllConversationStates() {
|
|
150
|
+
try {
|
|
151
|
+
const entries = await fs.readdir(this.conversationsDir, {
|
|
152
|
+
withFileTypes: true,
|
|
153
|
+
});
|
|
154
|
+
const states = [];
|
|
155
|
+
for (const entry of entries) {
|
|
156
|
+
if (entry.isDirectory()) {
|
|
157
|
+
const conversationId = entry.name;
|
|
158
|
+
const state = await this.getConversationState(conversationId);
|
|
159
|
+
if (state) {
|
|
160
|
+
states.push(state);
|
|
161
|
+
}
|
|
162
|
+
// Corrupted states are already logged and skipped by getConversationState
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Sort by updatedAt DESC (most recent first)
|
|
166
|
+
states.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
167
|
+
return states;
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error.code === 'ENOENT') {
|
|
171
|
+
// Conversations directory doesn't exist yet - return empty array
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
logger.error('Failed to get all conversation states', error);
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Delete a conversation state
|
|
180
|
+
* Returns true if deleted, false if not found
|
|
181
|
+
*/
|
|
182
|
+
async deleteConversationState(conversationId) {
|
|
183
|
+
const conversationDir = this.getConversationDir(conversationId);
|
|
184
|
+
try {
|
|
185
|
+
await fs.rm(conversationDir, { recursive: true, force: true });
|
|
186
|
+
logger.debug('Conversation state deleted', { conversationId });
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
if (error.code === 'ENOENT') {
|
|
191
|
+
// Directory doesn't exist - return false
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
logger.error('Failed to delete conversation state', error, {
|
|
195
|
+
conversationId,
|
|
196
|
+
});
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Log an interaction
|
|
202
|
+
* Appends to interactions.jsonl file
|
|
203
|
+
*/
|
|
204
|
+
async logInteraction(log) {
|
|
205
|
+
const interactionsFilePath = this.getInteractionsFilePath(log.conversationId);
|
|
206
|
+
const conversationDir = this.getConversationDir(log.conversationId);
|
|
207
|
+
try {
|
|
208
|
+
// Ensure conversation directory exists
|
|
209
|
+
await fs.mkdir(conversationDir, { recursive: true });
|
|
210
|
+
// Append to JSONL file (one JSON per line)
|
|
211
|
+
const logLine = JSON.stringify(log) + '\n';
|
|
212
|
+
await fs.appendFile(interactionsFilePath, logLine, 'utf-8');
|
|
213
|
+
logger.debug('Interaction logged', {
|
|
214
|
+
conversationId: log.conversationId,
|
|
215
|
+
toolName: log.toolName,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
logger.error('Failed to log interaction', error, {
|
|
220
|
+
conversationId: log.conversationId,
|
|
221
|
+
toolName: log.toolName,
|
|
222
|
+
});
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get interaction logs for a conversation
|
|
228
|
+
* Skips corrupted JSONL lines, returns empty array if file doesn't exist
|
|
229
|
+
*/
|
|
230
|
+
async getInteractionLogs(conversationId) {
|
|
231
|
+
const interactionsFilePath = this.getInteractionsFilePath(conversationId);
|
|
232
|
+
try {
|
|
233
|
+
const content = await fs.readFile(interactionsFilePath, 'utf-8');
|
|
234
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
235
|
+
const logs = [];
|
|
236
|
+
for (const line of lines) {
|
|
237
|
+
try {
|
|
238
|
+
const log = JSON.parse(line);
|
|
239
|
+
logs.push(log);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Skip corrupted line, log warning
|
|
243
|
+
logger.warn('Skipping corrupted interaction log line', {
|
|
244
|
+
conversationId,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return logs;
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
if (error.code === 'ENOENT') {
|
|
252
|
+
// File doesn't exist - return empty array
|
|
253
|
+
return [];
|
|
254
|
+
}
|
|
255
|
+
logger.error('Failed to get interaction logs', error, {
|
|
256
|
+
conversationId,
|
|
257
|
+
});
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get interaction logs by conversation ID (alias for compatibility)
|
|
263
|
+
*/
|
|
264
|
+
async getInteractionsByConversationId(conversationId) {
|
|
265
|
+
return this.getInteractionLogs(conversationId);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Soft delete interaction logs
|
|
269
|
+
* Actually performs hard delete (removes interactions.jsonl file)
|
|
270
|
+
*/
|
|
271
|
+
async softDeleteInteractionLogs(conversationId) {
|
|
272
|
+
const interactionsFilePath = this.getInteractionsFilePath(conversationId);
|
|
273
|
+
try {
|
|
274
|
+
await fs.unlink(interactionsFilePath);
|
|
275
|
+
logger.debug('Interaction logs deleted', { conversationId });
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (error.code === 'ENOENT') {
|
|
279
|
+
// File doesn't exist - nothing to delete
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
logger.warn('Failed to delete interaction logs', {
|
|
283
|
+
conversationId,
|
|
284
|
+
error: error.message,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Reset conversation state (update timestamp)
|
|
290
|
+
*/
|
|
291
|
+
async resetConversationState(conversationId) {
|
|
292
|
+
const state = await this.getConversationState(conversationId);
|
|
293
|
+
if (!state) {
|
|
294
|
+
throw new Error(`Conversation state not found for ID: ${conversationId}`);
|
|
295
|
+
}
|
|
296
|
+
const updatedState = {
|
|
297
|
+
...state,
|
|
298
|
+
updatedAt: new Date().toISOString(),
|
|
299
|
+
};
|
|
300
|
+
await this.saveConversationState(updatedState);
|
|
301
|
+
logger.debug('Conversation state reset', { conversationId });
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Close file storage (no-op for file-based storage)
|
|
305
|
+
*/
|
|
306
|
+
async close() {
|
|
307
|
+
logger.debug('FileStorage closed');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=file-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-storage.js","sourceRoot":"","sources":["../src/file-storage.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,10 @@ export * from './state-machine.js';
|
|
|
4
4
|
export * from './state-machine-loader.js';
|
|
5
5
|
export * from './workflow-manager.js';
|
|
6
6
|
export * from './transition-engine.js';
|
|
7
|
+
export * from './persistence-interface.js';
|
|
7
8
|
export * from './database.js';
|
|
9
|
+
export * from './file-storage.js';
|
|
10
|
+
export * from './migration.js';
|
|
8
11
|
export * from './conversation-manager.js';
|
|
9
12
|
export * from './plan-manager.js';
|
|
10
13
|
export * from './template-manager.js';
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,10 @@ export * from './state-machine-loader.js';
|
|
|
7
7
|
export * from './workflow-manager.js';
|
|
8
8
|
export * from './transition-engine.js';
|
|
9
9
|
// Data management
|
|
10
|
+
export * from './persistence-interface.js';
|
|
10
11
|
export * from './database.js';
|
|
12
|
+
export * from './file-storage.js';
|
|
13
|
+
export * from './migration.js';
|
|
11
14
|
export * from './conversation-manager.js';
|
|
12
15
|
// Project and plan management
|
|
13
16
|
export * from './plan-manager.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AAEzC,wCAAwC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,kBAAkB;AAClB,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAE1C,8BAA8B;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,2BAA2B;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AAEzC,wCAAwC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,kBAAkB;AAClB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAE1C,8BAA8B;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,2BAA2B;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles logging of tool interactions to the database for auditing and debugging.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import type { IPersistence } from './persistence-interface.js';
|
|
7
7
|
import type { InteractionLog } from './types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Handles logging of tool interactions to the database
|
|
@@ -13,9 +13,9 @@ export declare class InteractionLogger {
|
|
|
13
13
|
/**
|
|
14
14
|
* Create a new InteractionLogger
|
|
15
15
|
*
|
|
16
|
-
* @param database -
|
|
16
|
+
* @param database - Persistence instance to use for logging
|
|
17
17
|
*/
|
|
18
|
-
constructor(database:
|
|
18
|
+
constructor(database: IPersistence);
|
|
19
19
|
/**
|
|
20
20
|
* Log an interaction with a tool
|
|
21
21
|
*
|
|
@@ -13,7 +13,7 @@ export class InteractionLogger {
|
|
|
13
13
|
/**
|
|
14
14
|
* Create a new InteractionLogger
|
|
15
15
|
*
|
|
16
|
-
* @param database -
|
|
16
|
+
* @param database - Persistence instance to use for logging
|
|
17
17
|
*/
|
|
18
18
|
constructor(database) {
|
|
19
19
|
this.database = database;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction-logger.js","sourceRoot":"","sources":["../src/interaction-logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACpB,QAAQ,
|
|
1
|
+
{"version":3,"file":"interaction-logger.js","sourceRoot":"","sources":["../src/interaction-logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACpB,QAAQ,CAAe;IAE/B;;;;OAIG;IACH,YAAY,QAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,cAAc,CAClB,cAAsB,EACtB,QAAgB,EAChB,WAAoB,EACpB,YAAqB,EACrB,YAAoB;QAEpB,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;YAClC,cAAc;YACd,QAAQ;YACR,YAAY;SACb,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE3C,MAAM,GAAG,GAAmB;gBAC1B,cAAc;gBACd,QAAQ;gBACR,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;gBACxC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;gBAC1C,YAAY;gBACZ,SAAS;aACV,CAAC;YAEF,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAExC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,cAAc;gBACd,QAAQ;gBACR,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAc,EAAE;gBACxD,cAAc;gBACd,QAAQ;aACT,CAAC,CAAC;YACH,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,+BAA+B,CACnC,cAAsB;QAEtB,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,MAAM,IAAI,GACR,MAAM,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CAAC,cAAc,CAAC,CAAC;YAEtE,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBACxC,cAAc;gBACd,KAAK,EAAE,IAAI,CAAC,MAAM;aACnB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAc,EAAE;gBAC7D,cAAc;aACf,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles migration from SQLite-based persistence to file-based persistence.
|
|
5
|
+
* Automatically detects legacy SQLite databases and migrates conversation states
|
|
6
|
+
* to the new file-based structure.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Check if a legacy SQLite database exists
|
|
10
|
+
* Checks both conversation.sqlite and conversation-state.sqlite (legacy names)
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectLegacyDatabase(basePath: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Check if file-based storage already exists
|
|
15
|
+
*/
|
|
16
|
+
export declare function fileStorageExists(basePath: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Migrate from SQLite to file-based storage
|
|
19
|
+
*
|
|
20
|
+
* @param basePath - Path to the SQLite database (e.g., .vibe/conversation.sqlite)
|
|
21
|
+
* @returns Migration result with statistics
|
|
22
|
+
*/
|
|
23
|
+
export declare function migrateSQLiteToFiles(basePath: string): Promise<{
|
|
24
|
+
success: boolean;
|
|
25
|
+
migratedCount: number;
|
|
26
|
+
backupPath: string;
|
|
27
|
+
message: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if migration is needed and perform it
|
|
31
|
+
* Called automatically during FileStorage initialization
|
|
32
|
+
*
|
|
33
|
+
* @param basePath - Path to the SQLite database location
|
|
34
|
+
* @returns True if migration was performed or not needed, false if migration failed
|
|
35
|
+
*/
|
|
36
|
+
export declare function autoMigrateIfNeeded(basePath: string): Promise<boolean>;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles migration from SQLite-based persistence to file-based persistence.
|
|
5
|
+
* Automatically detects legacy SQLite databases and migrates conversation states
|
|
6
|
+
* to the new file-based structure.
|
|
7
|
+
*/
|
|
8
|
+
import { promises as fs } from 'node:fs';
|
|
9
|
+
import { join, dirname } from 'node:path';
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { createLogger } from './logger.js';
|
|
12
|
+
import { Database } from './database.js';
|
|
13
|
+
const logger = createLogger('Migration');
|
|
14
|
+
/**
|
|
15
|
+
* Check if a legacy SQLite database exists
|
|
16
|
+
* Checks both conversation.sqlite and conversation-state.sqlite (legacy names)
|
|
17
|
+
*/
|
|
18
|
+
export function detectLegacyDatabase(basePath) {
|
|
19
|
+
const sqlitePath = basePath;
|
|
20
|
+
const legacyStatePath = sqlitePath.replace('conversation.sqlite', 'conversation-state.sqlite');
|
|
21
|
+
const exists = existsSync(sqlitePath) || existsSync(legacyStatePath);
|
|
22
|
+
if (exists) {
|
|
23
|
+
logger.debug('Legacy SQLite database detected', {
|
|
24
|
+
sqlitePath: existsSync(sqlitePath) ? sqlitePath : legacyStatePath,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return exists;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the actual legacy SQLite path (could be conversation.sqlite or conversation-state.sqlite)
|
|
31
|
+
*/
|
|
32
|
+
function getLegacySQLitePath(basePath) {
|
|
33
|
+
const sqlitePath = basePath;
|
|
34
|
+
const legacyStatePath = sqlitePath.replace('conversation.sqlite', 'conversation-state.sqlite');
|
|
35
|
+
if (existsSync(sqlitePath)) {
|
|
36
|
+
return sqlitePath;
|
|
37
|
+
}
|
|
38
|
+
if (existsSync(legacyStatePath)) {
|
|
39
|
+
return legacyStatePath;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if file-based storage already exists
|
|
45
|
+
*/
|
|
46
|
+
export async function fileStorageExists(basePath) {
|
|
47
|
+
const conversationsDir = join(dirname(basePath), 'conversations');
|
|
48
|
+
try {
|
|
49
|
+
const stats = await fs.stat(conversationsDir);
|
|
50
|
+
return stats.isDirectory();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a backup of the SQLite database
|
|
58
|
+
*/
|
|
59
|
+
async function createBackup(sqlitePath) {
|
|
60
|
+
const backupPath = `${sqlitePath}.backup-${Date.now()}`;
|
|
61
|
+
try {
|
|
62
|
+
await fs.copyFile(sqlitePath, backupPath);
|
|
63
|
+
logger.info('Created SQLite backup', { sqlitePath, backupPath });
|
|
64
|
+
return backupPath;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.error('Failed to create SQLite backup', error, {
|
|
68
|
+
sqlitePath,
|
|
69
|
+
backupPath,
|
|
70
|
+
});
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read all conversation states from SQLite database
|
|
76
|
+
*/
|
|
77
|
+
async function readSQLiteStates(sqlitePath) {
|
|
78
|
+
const database = new Database(sqlitePath);
|
|
79
|
+
try {
|
|
80
|
+
await database.initialize();
|
|
81
|
+
const states = await database.getAllConversationStates();
|
|
82
|
+
await database.close();
|
|
83
|
+
logger.debug('Read conversation states from SQLite', {
|
|
84
|
+
count: states.length,
|
|
85
|
+
});
|
|
86
|
+
return states;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
await database.close();
|
|
90
|
+
logger.error('Failed to read SQLite states', error);
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Write conversation states to file-based storage
|
|
96
|
+
*/
|
|
97
|
+
async function writeFileStates(states, conversationsDir) {
|
|
98
|
+
// Create conversations directory
|
|
99
|
+
await fs.mkdir(conversationsDir, { recursive: true });
|
|
100
|
+
for (const state of states) {
|
|
101
|
+
const stateDir = join(conversationsDir, state.conversationId);
|
|
102
|
+
const stateFilePath = join(stateDir, 'state.json');
|
|
103
|
+
try {
|
|
104
|
+
// Create conversation directory
|
|
105
|
+
await fs.mkdir(stateDir, { recursive: true });
|
|
106
|
+
// Write state.json
|
|
107
|
+
const stateJson = JSON.stringify(state, null, 2);
|
|
108
|
+
await fs.writeFile(stateFilePath, stateJson, 'utf-8');
|
|
109
|
+
logger.debug('Migrated conversation state to file', {
|
|
110
|
+
conversationId: state.conversationId,
|
|
111
|
+
stateFilePath,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
logger.error('Failed to write conversation state to file', error, {
|
|
116
|
+
conversationId: state.conversationId,
|
|
117
|
+
stateFilePath,
|
|
118
|
+
});
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Migrate from SQLite to file-based storage
|
|
125
|
+
*
|
|
126
|
+
* @param basePath - Path to the SQLite database (e.g., .vibe/conversation.sqlite)
|
|
127
|
+
* @returns Migration result with statistics
|
|
128
|
+
*/
|
|
129
|
+
export async function migrateSQLiteToFiles(basePath) {
|
|
130
|
+
// Get actual legacy SQLite path (could be conversation.sqlite or conversation-state.sqlite)
|
|
131
|
+
const actualSQLitePath = getLegacySQLitePath(basePath);
|
|
132
|
+
if (!actualSQLitePath) {
|
|
133
|
+
return {
|
|
134
|
+
success: true,
|
|
135
|
+
migratedCount: 0,
|
|
136
|
+
backupPath: '',
|
|
137
|
+
message: 'No legacy SQLite database found',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const conversationsDir = join(dirname(basePath), 'conversations');
|
|
141
|
+
logger.info('Starting SQLite to file-based migration', {
|
|
142
|
+
sqlitePath: actualSQLitePath,
|
|
143
|
+
});
|
|
144
|
+
try {
|
|
145
|
+
// Step 1: Read all states from SQLite first (before backup)
|
|
146
|
+
const states = await readSQLiteStates(actualSQLitePath);
|
|
147
|
+
if (states.length === 0) {
|
|
148
|
+
logger.info('No conversation states to migrate');
|
|
149
|
+
return {
|
|
150
|
+
success: true,
|
|
151
|
+
migratedCount: 0,
|
|
152
|
+
backupPath: '',
|
|
153
|
+
message: 'No conversation states found in SQLite database',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Step 2: Create backup (only if there are states to migrate)
|
|
157
|
+
const backupPath = await createBackup(actualSQLitePath);
|
|
158
|
+
// Step 3: Write states to file-based storage
|
|
159
|
+
await writeFileStates(states, conversationsDir);
|
|
160
|
+
const message = `Successfully migrated ${states.length} conversation state(s) from SQLite to file-based storage. Backup created at ${backupPath}`;
|
|
161
|
+
logger.info('Migration completed successfully', {
|
|
162
|
+
migratedCount: states.length,
|
|
163
|
+
backupPath,
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
success: true,
|
|
167
|
+
migratedCount: states.length,
|
|
168
|
+
backupPath,
|
|
169
|
+
message,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
const errorMessage = `Migration failed: ${error.message}`;
|
|
174
|
+
logger.error('Migration failed', error);
|
|
175
|
+
return {
|
|
176
|
+
success: false,
|
|
177
|
+
migratedCount: 0,
|
|
178
|
+
backupPath: '',
|
|
179
|
+
message: errorMessage,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check if migration is needed and perform it
|
|
185
|
+
* Called automatically during FileStorage initialization
|
|
186
|
+
*
|
|
187
|
+
* @param basePath - Path to the SQLite database location
|
|
188
|
+
* @returns True if migration was performed or not needed, false if migration failed
|
|
189
|
+
*/
|
|
190
|
+
export async function autoMigrateIfNeeded(basePath) {
|
|
191
|
+
// Check if legacy SQLite exists
|
|
192
|
+
const hasLegacySQLite = detectLegacyDatabase(basePath);
|
|
193
|
+
if (!hasLegacySQLite) {
|
|
194
|
+
logger.debug('No legacy SQLite database found, skipping migration');
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
// Check if file-based storage already exists
|
|
198
|
+
const hasFileStorage = await fileStorageExists(basePath);
|
|
199
|
+
if (hasFileStorage) {
|
|
200
|
+
logger.debug('File-based storage already exists, skipping migration');
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
// Perform migration
|
|
204
|
+
logger.info('Legacy SQLite detected and no file storage exists, starting migration');
|
|
205
|
+
const result = await migrateSQLiteToFiles(basePath);
|
|
206
|
+
if (result.success) {
|
|
207
|
+
logger.info('Auto-migration completed', {
|
|
208
|
+
migratedCount: result.migratedCount,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
logger.error('Auto-migration failed', new Error(result.message));
|
|
213
|
+
}
|
|
214
|
+
return result.success;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for conversation state and interaction log persistence.
|
|
5
|
+
* This interface abstracts the storage mechanism, allowing for different
|
|
6
|
+
* implementations (SQLite, file-based, etc.) to be used interchangeably.
|
|
7
|
+
*/
|
|
8
|
+
import type { ConversationState, InteractionLog } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Interface for persistence operations
|
|
11
|
+
*
|
|
12
|
+
* Implementations must handle errors gracefully, especially user-corrupted data:
|
|
13
|
+
* - Missing files/data should return null or empty arrays
|
|
14
|
+
* - Corrupted data should be logged but not crash the application
|
|
15
|
+
* - Partial recovery should be attempted when possible (e.g., skip corrupted lines)
|
|
16
|
+
*/
|
|
17
|
+
export interface IPersistence {
|
|
18
|
+
/**
|
|
19
|
+
* Initialize the persistence layer
|
|
20
|
+
* Creates necessary storage structures (tables, directories, etc.)
|
|
21
|
+
*
|
|
22
|
+
* @throws Error if initialization fails
|
|
23
|
+
*/
|
|
24
|
+
initialize(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Save or update a conversation state
|
|
27
|
+
*
|
|
28
|
+
* @param state - The conversation state to save
|
|
29
|
+
* @throws Error if save operation fails
|
|
30
|
+
*/
|
|
31
|
+
saveConversationState(state: ConversationState): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get a conversation state by ID
|
|
34
|
+
*
|
|
35
|
+
* @param conversationId - The conversation ID to retrieve
|
|
36
|
+
* @returns The conversation state, or null if not found or corrupted
|
|
37
|
+
*/
|
|
38
|
+
getConversationState(conversationId: string): Promise<ConversationState | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Get all conversation states
|
|
41
|
+
*
|
|
42
|
+
* @returns Array of all conversation states (skips corrupted entries)
|
|
43
|
+
*/
|
|
44
|
+
getAllConversationStates(): Promise<ConversationState[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Delete a conversation state
|
|
47
|
+
*
|
|
48
|
+
* @param conversationId - The conversation ID to delete
|
|
49
|
+
* @returns True if deleted, false if not found
|
|
50
|
+
*/
|
|
51
|
+
deleteConversationState(conversationId: string): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Log an interaction
|
|
54
|
+
*
|
|
55
|
+
* @param log - The interaction log entry to save
|
|
56
|
+
* @throws Error if logging fails
|
|
57
|
+
*/
|
|
58
|
+
logInteraction(log: InteractionLog): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Get interaction logs for a conversation
|
|
61
|
+
*
|
|
62
|
+
* @param conversationId - The conversation ID to get logs for
|
|
63
|
+
* @returns Array of interaction logs (skips corrupted entries, empty if none exist)
|
|
64
|
+
*/
|
|
65
|
+
getInteractionLogs(conversationId: string): Promise<InteractionLog[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Get interaction logs by conversation ID (alias for compatibility)
|
|
68
|
+
*
|
|
69
|
+
* @param conversationId - The conversation ID to get logs for
|
|
70
|
+
* @returns Array of interaction logs (skips corrupted entries, empty if none exist)
|
|
71
|
+
*/
|
|
72
|
+
getInteractionsByConversationId(conversationId: string): Promise<InteractionLog[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Soft delete interaction logs for a conversation
|
|
75
|
+
* (Actual behavior depends on implementation - may be hard delete)
|
|
76
|
+
*
|
|
77
|
+
* @param conversationId - The conversation ID to delete logs for
|
|
78
|
+
*/
|
|
79
|
+
softDeleteInteractionLogs(conversationId: string): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Reset conversation state (update timestamp)
|
|
82
|
+
* Used for testing and state management
|
|
83
|
+
*
|
|
84
|
+
* @param conversationId - The conversation ID to reset
|
|
85
|
+
*/
|
|
86
|
+
resetConversationState(conversationId: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Close the persistence layer and clean up resources
|
|
89
|
+
*/
|
|
90
|
+
close(): Promise<void>;
|
|
91
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for conversation state and interaction log persistence.
|
|
5
|
+
* This interface abstracts the storage mechanism, allowing for different
|
|
6
|
+
* implementations (SQLite, file-based, etc.) to be used interchangeably.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=persistence-interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence-interface.js","sourceRoot":"","sources":["../src/persistence-interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|