@codemcp/workflows-core 3.1.16
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/.turbo/turbo-build.log +4 -0
- package/LICENSE +674 -0
- package/dist/config-manager.d.ts +24 -0
- package/dist/config-manager.js +68 -0
- package/dist/config-manager.js.map +1 -0
- package/dist/conversation-manager.d.ts +97 -0
- package/dist/conversation-manager.js +367 -0
- package/dist/conversation-manager.js.map +1 -0
- package/dist/database.d.ts +73 -0
- package/dist/database.js +500 -0
- package/dist/database.js.map +1 -0
- package/dist/file-detection-manager.d.ts +53 -0
- package/dist/file-detection-manager.js +221 -0
- package/dist/file-detection-manager.js.map +1 -0
- package/dist/git-manager.d.ts +14 -0
- package/dist/git-manager.js +59 -0
- package/dist/git-manager.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/instruction-generator.d.ts +69 -0
- package/dist/instruction-generator.js +133 -0
- package/dist/instruction-generator.js.map +1 -0
- package/dist/interaction-logger.d.ts +37 -0
- package/dist/interaction-logger.js +87 -0
- package/dist/interaction-logger.js.map +1 -0
- package/dist/logger.d.ts +64 -0
- package/dist/logger.js +283 -0
- package/dist/logger.js.map +1 -0
- package/dist/path-validation-utils.d.ts +51 -0
- package/dist/path-validation-utils.js +202 -0
- package/dist/path-validation-utils.js.map +1 -0
- package/dist/plan-manager.d.ts +65 -0
- package/dist/plan-manager.js +256 -0
- package/dist/plan-manager.js.map +1 -0
- package/dist/project-docs-manager.d.ts +119 -0
- package/dist/project-docs-manager.js +357 -0
- package/dist/project-docs-manager.js.map +1 -0
- package/dist/state-machine-loader.d.ts +60 -0
- package/dist/state-machine-loader.js +235 -0
- package/dist/state-machine-loader.js.map +1 -0
- package/dist/state-machine-types.d.ts +58 -0
- package/dist/state-machine-types.js +7 -0
- package/dist/state-machine-types.js.map +1 -0
- package/dist/state-machine.d.ts +52 -0
- package/dist/state-machine.js +256 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/system-prompt-generator.d.ts +17 -0
- package/dist/system-prompt-generator.js +113 -0
- package/dist/system-prompt-generator.js.map +1 -0
- package/dist/template-manager.d.ts +61 -0
- package/dist/template-manager.js +229 -0
- package/dist/template-manager.js.map +1 -0
- package/dist/transition-engine.d.ts +70 -0
- package/dist/transition-engine.js +240 -0
- package/dist/transition-engine.js.map +1 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-manager.d.ts +89 -0
- package/dist/workflow-manager.js +466 -0
- package/dist/workflow-manager.js.map +1 -0
- package/package.json +27 -0
- package/src/config-manager.ts +96 -0
- package/src/conversation-manager.ts +492 -0
- package/src/database.ts +685 -0
- package/src/file-detection-manager.ts +302 -0
- package/src/git-manager.ts +64 -0
- package/src/index.ts +28 -0
- package/src/instruction-generator.ts +210 -0
- package/src/interaction-logger.ts +109 -0
- package/src/logger.ts +353 -0
- package/src/path-validation-utils.ts +261 -0
- package/src/plan-manager.ts +323 -0
- package/src/project-docs-manager.ts +522 -0
- package/src/state-machine-loader.ts +308 -0
- package/src/state-machine-types.ts +72 -0
- package/src/state-machine.ts +370 -0
- package/src/system-prompt-generator.ts +122 -0
- package/src/template-manager.ts +321 -0
- package/src/transition-engine.ts +386 -0
- package/src/types.ts +60 -0
- package/src/workflow-manager.ts +601 -0
- package/test/unit/conversation-manager.test.ts +179 -0
- package/test/unit/custom-workflow-loading.test.ts +174 -0
- package/test/unit/directory-linking-and-extensions.test.ts +338 -0
- package/test/unit/file-linking-integration.test.ts +256 -0
- package/test/unit/git-commit-integration.test.ts +91 -0
- package/test/unit/git-manager.test.ts +86 -0
- package/test/unit/install-workflow.test.ts +138 -0
- package/test/unit/instruction-generator.test.ts +247 -0
- package/test/unit/list-workflows-filtering.test.ts +68 -0
- package/test/unit/none-template-functionality.test.ts +224 -0
- package/test/unit/project-docs-manager.test.ts +337 -0
- package/test/unit/state-machine-loader.test.ts +234 -0
- package/test/unit/template-manager.test.ts +217 -0
- package/test/unit/validate-workflow-name.test.ts +150 -0
- package/test/unit/workflow-domain-filtering.test.ts +75 -0
- package/test/unit/workflow-enum-generation.test.ts +92 -0
- package/test/unit/workflow-manager-enhanced-path-resolution.test.ts +369 -0
- package/test/unit/workflow-manager-path-resolution.test.ts +150 -0
- package/test/unit/workflow-migration.test.ts +155 -0
- package/test/unit/workflow-override-by-name.test.ts +116 -0
- package/test/unit/workflow-prioritization.test.ts +38 -0
- package/test/unit/workflow-validation.test.ts +303 -0
- package/test/utils/e2e-test-setup.ts +453 -0
- package/test/utils/run-server-in-dir.sh +27 -0
- package/test/utils/temp-files.ts +308 -0
- package/test/utils/test-access.ts +79 -0
- package/test/utils/test-helpers.ts +286 -0
- package/test/utils/test-setup.ts +78 -0
- package/tsconfig.build.json +21 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +18 -0
package/dist/database.js
ADDED
@@ -0,0 +1,500 @@
|
|
1
|
+
/**
|
2
|
+
* Database module for persistent state storage
|
3
|
+
*
|
4
|
+
* Manages SQLite database for conversation state persistence.
|
5
|
+
* Stores minimal state information to survive server restarts.
|
6
|
+
* Also stores interaction logs for auditing and debugging.
|
7
|
+
*/
|
8
|
+
import sqlite3 from 'sqlite3';
|
9
|
+
import { mkdir } from 'node:fs/promises';
|
10
|
+
import { dirname } from 'node:path';
|
11
|
+
import { join } from 'node:path';
|
12
|
+
import { createLogger } from './logger.js';
|
13
|
+
const logger = createLogger('Database');
|
14
|
+
// Database row validation utilities
|
15
|
+
function validateString(value, fieldName) {
|
16
|
+
if (typeof value === 'string') {
|
17
|
+
return value;
|
18
|
+
}
|
19
|
+
throw new Error(`Database field '${fieldName}' expected string but got ${typeof value}: ${value}`);
|
20
|
+
}
|
21
|
+
function parseJsonSafely(value, fieldName) {
|
22
|
+
if (!value) {
|
23
|
+
return undefined;
|
24
|
+
}
|
25
|
+
const stringValue = validateString(value, fieldName);
|
26
|
+
try {
|
27
|
+
return JSON.parse(stringValue);
|
28
|
+
}
|
29
|
+
catch (error) {
|
30
|
+
throw new Error(`Failed to parse JSON in field '${fieldName}': ${error instanceof Error ? error.message : String(error)}`);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
function mapRowToInteractionLog(row) {
|
34
|
+
return {
|
35
|
+
id: typeof row.id === 'number' ? row.id : undefined,
|
36
|
+
conversationId: validateString(row.conversationId, 'conversationId'),
|
37
|
+
toolName: validateString(row.toolName, 'toolName'),
|
38
|
+
inputParams: validateString(row.inputParams, 'inputParams'),
|
39
|
+
responseData: validateString(row.responseData, 'responseData'),
|
40
|
+
currentPhase: validateString(row.currentPhase, 'currentPhase'),
|
41
|
+
timestamp: validateString(row.timestamp, 'timestamp'),
|
42
|
+
isReset: typeof row.isReset === 'number' ? Boolean(row.isReset) : undefined,
|
43
|
+
resetAt: row.resetAt ? validateString(row.resetAt, 'resetAt') : undefined,
|
44
|
+
};
|
45
|
+
}
|
46
|
+
export class Database {
|
47
|
+
db = null;
|
48
|
+
dbPath;
|
49
|
+
constructor(projectPath) {
|
50
|
+
// Store database in .vibe subfolder of the project
|
51
|
+
const vibeDir = join(projectPath, '.vibe');
|
52
|
+
this.dbPath = join(vibeDir, 'conversation-state.sqlite');
|
53
|
+
logger.debug('Database path configured', {
|
54
|
+
projectPath,
|
55
|
+
dbPath: this.dbPath,
|
56
|
+
});
|
57
|
+
}
|
58
|
+
/**
|
59
|
+
* Initialize database connection and create tables
|
60
|
+
*/
|
61
|
+
async initialize() {
|
62
|
+
logger.debug('Initializing database', { dbPath: this.dbPath });
|
63
|
+
try {
|
64
|
+
// Ensure directory exists
|
65
|
+
await mkdir(dirname(this.dbPath), { recursive: true });
|
66
|
+
logger.debug('Database directory ensured', {
|
67
|
+
directory: dirname(this.dbPath),
|
68
|
+
});
|
69
|
+
// Create database connection
|
70
|
+
this.db = new sqlite3.Database(this.dbPath);
|
71
|
+
logger.debug('Database connection established');
|
72
|
+
// Create conversation_states table
|
73
|
+
await this.runQuery(`
|
74
|
+
CREATE TABLE IF NOT EXISTS conversation_states (
|
75
|
+
conversation_id TEXT PRIMARY KEY,
|
76
|
+
project_path TEXT NOT NULL,
|
77
|
+
git_branch TEXT NOT NULL,
|
78
|
+
current_phase TEXT NOT NULL,
|
79
|
+
plan_file_path TEXT NOT NULL,
|
80
|
+
workflow_name TEXT DEFAULT 'waterfall',
|
81
|
+
git_commit_config TEXT, -- JSON string for GitCommitConfig
|
82
|
+
created_at TEXT NOT NULL,
|
83
|
+
updated_at TEXT NOT NULL
|
84
|
+
)
|
85
|
+
`);
|
86
|
+
// Create index for efficient lookups
|
87
|
+
await this.runQuery(`
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_project_branch
|
89
|
+
ON conversation_states(project_path, git_branch)
|
90
|
+
`);
|
91
|
+
// Create interaction_logs table
|
92
|
+
await this.runQuery(`
|
93
|
+
CREATE TABLE IF NOT EXISTS interaction_logs (
|
94
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
95
|
+
conversation_id TEXT NOT NULL,
|
96
|
+
tool_name TEXT NOT NULL,
|
97
|
+
input_params TEXT NOT NULL,
|
98
|
+
response_data TEXT NOT NULL,
|
99
|
+
current_phase TEXT NOT NULL,
|
100
|
+
timestamp TEXT NOT NULL,
|
101
|
+
is_reset BOOLEAN DEFAULT FALSE,
|
102
|
+
reset_at TEXT,
|
103
|
+
FOREIGN KEY (conversation_id) REFERENCES conversation_states(conversation_id)
|
104
|
+
)
|
105
|
+
`);
|
106
|
+
// Create index for efficient lookups of interaction logs
|
107
|
+
await this.runQuery(`
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_interaction_conversation_id
|
109
|
+
ON interaction_logs(conversation_id)
|
110
|
+
`);
|
111
|
+
// Run migrations to add any missing columns
|
112
|
+
await this.runMigrations();
|
113
|
+
logger.info('Database initialized successfully', { dbPath: this.dbPath });
|
114
|
+
}
|
115
|
+
catch (error) {
|
116
|
+
logger.error('Failed to initialize database', error, {
|
117
|
+
dbPath: this.dbPath,
|
118
|
+
});
|
119
|
+
throw error;
|
120
|
+
}
|
121
|
+
}
|
122
|
+
/**
|
123
|
+
* Helper method to run queries with promises
|
124
|
+
*/
|
125
|
+
runQuery(sql, params = []) {
|
126
|
+
return new Promise((resolve, reject) => {
|
127
|
+
if (!this.db) {
|
128
|
+
reject(new Error('Database not initialized'));
|
129
|
+
return;
|
130
|
+
}
|
131
|
+
this.db.run(sql, params, function (err) {
|
132
|
+
if (err) {
|
133
|
+
reject(err);
|
134
|
+
}
|
135
|
+
else {
|
136
|
+
resolve();
|
137
|
+
}
|
138
|
+
});
|
139
|
+
});
|
140
|
+
}
|
141
|
+
/**
|
142
|
+
* Helper method to get single row with promises
|
143
|
+
*/
|
144
|
+
getRow(sql, params = []) {
|
145
|
+
return new Promise((resolve, reject) => {
|
146
|
+
if (!this.db) {
|
147
|
+
reject(new Error('Database not initialized'));
|
148
|
+
return;
|
149
|
+
}
|
150
|
+
this.db.get(sql, params, (err, row) => {
|
151
|
+
if (err) {
|
152
|
+
reject(err);
|
153
|
+
}
|
154
|
+
else {
|
155
|
+
resolve(row);
|
156
|
+
}
|
157
|
+
});
|
158
|
+
});
|
159
|
+
}
|
160
|
+
/**
|
161
|
+
* Helper method to get multiple rows with promises
|
162
|
+
*/
|
163
|
+
getAllRows(sql, params = []) {
|
164
|
+
return new Promise((resolve, reject) => {
|
165
|
+
if (!this.db) {
|
166
|
+
reject(new Error('Database not initialized'));
|
167
|
+
return;
|
168
|
+
}
|
169
|
+
this.db.all(sql, params, (err, rows) => {
|
170
|
+
if (err) {
|
171
|
+
reject(err);
|
172
|
+
}
|
173
|
+
else {
|
174
|
+
resolve(rows);
|
175
|
+
}
|
176
|
+
});
|
177
|
+
});
|
178
|
+
}
|
179
|
+
/**
|
180
|
+
* Get conversation state by ID
|
181
|
+
*/
|
182
|
+
async getConversationState(conversationId) {
|
183
|
+
logger.debug('Retrieving conversation state', { conversationId });
|
184
|
+
try {
|
185
|
+
const row = await this.getRow('SELECT * FROM conversation_states WHERE conversation_id = ?', [conversationId]);
|
186
|
+
if (!row) {
|
187
|
+
logger.debug('Conversation state not found', { conversationId });
|
188
|
+
return null;
|
189
|
+
}
|
190
|
+
const state = {
|
191
|
+
conversationId: validateString(row.conversation_id, 'conversation_id'),
|
192
|
+
projectPath: validateString(row.project_path, 'project_path'),
|
193
|
+
gitBranch: validateString(row.git_branch, 'git_branch'),
|
194
|
+
currentPhase: validateString(row.current_phase, 'current_phase'),
|
195
|
+
planFilePath: validateString(row.plan_file_path, 'plan_file_path'),
|
196
|
+
workflowName: validateString(row.workflow_name, 'workflow_name'),
|
197
|
+
gitCommitConfig: parseJsonSafely(row.git_commit_config, 'git_commit_config'),
|
198
|
+
requireReviewsBeforePhaseTransition: Boolean(row.require_reviews_before_phase_transition),
|
199
|
+
createdAt: validateString(row.created_at, 'created_at'),
|
200
|
+
updatedAt: validateString(row.updated_at, 'updated_at'),
|
201
|
+
};
|
202
|
+
logger.debug('Conversation state retrieved', {
|
203
|
+
conversationId,
|
204
|
+
currentPhase: state.currentPhase,
|
205
|
+
projectPath: state.projectPath,
|
206
|
+
});
|
207
|
+
return state;
|
208
|
+
}
|
209
|
+
catch (error) {
|
210
|
+
logger.error('Failed to retrieve conversation state', error, {
|
211
|
+
conversationId,
|
212
|
+
});
|
213
|
+
throw error;
|
214
|
+
}
|
215
|
+
}
|
216
|
+
/**
|
217
|
+
* Save or update conversation state
|
218
|
+
*/
|
219
|
+
async saveConversationState(state) {
|
220
|
+
logger.debug('Saving conversation state', {
|
221
|
+
conversationId: state.conversationId,
|
222
|
+
currentPhase: state.currentPhase,
|
223
|
+
projectPath: state.projectPath,
|
224
|
+
workflowName: state.workflowName,
|
225
|
+
});
|
226
|
+
try {
|
227
|
+
await this.runQuery(`INSERT OR REPLACE INTO conversation_states (
|
228
|
+
conversation_id, project_path, git_branch, current_phase,
|
229
|
+
plan_file_path, workflow_name, git_commit_config, require_reviews_before_phase_transition, created_at, updated_at
|
230
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
231
|
+
state.conversationId,
|
232
|
+
state.projectPath,
|
233
|
+
state.gitBranch,
|
234
|
+
state.currentPhase,
|
235
|
+
state.planFilePath,
|
236
|
+
state.workflowName,
|
237
|
+
state.gitCommitConfig ? JSON.stringify(state.gitCommitConfig) : null,
|
238
|
+
state.requireReviewsBeforePhaseTransition,
|
239
|
+
state.createdAt,
|
240
|
+
state.updatedAt,
|
241
|
+
]);
|
242
|
+
logger.info('Conversation state saved successfully', {
|
243
|
+
conversationId: state.conversationId,
|
244
|
+
currentPhase: state.currentPhase,
|
245
|
+
});
|
246
|
+
}
|
247
|
+
catch (error) {
|
248
|
+
logger.error('Failed to save conversation state', error, {
|
249
|
+
conversationId: state.conversationId,
|
250
|
+
});
|
251
|
+
throw error;
|
252
|
+
}
|
253
|
+
}
|
254
|
+
/**
|
255
|
+
* Find conversation by project path and git branch
|
256
|
+
*/
|
257
|
+
async findConversationByProject(projectPath, gitBranch) {
|
258
|
+
const row = await this.getRow('SELECT * FROM conversation_states WHERE project_path = ? AND git_branch = ?', [projectPath, gitBranch]);
|
259
|
+
if (!row) {
|
260
|
+
return null;
|
261
|
+
}
|
262
|
+
return {
|
263
|
+
conversationId: validateString(row.conversation_id, 'conversation_id'),
|
264
|
+
projectPath: validateString(row.project_path, 'project_path'),
|
265
|
+
gitBranch: validateString(row.git_branch, 'git_branch'),
|
266
|
+
currentPhase: validateString(row.current_phase, 'current_phase'),
|
267
|
+
planFilePath: validateString(row.plan_file_path, 'plan_file_path'),
|
268
|
+
workflowName: validateString(row.workflow_name, 'workflow_name'),
|
269
|
+
gitCommitConfig: parseJsonSafely(row.git_commit_config, 'git_commit_config'),
|
270
|
+
requireReviewsBeforePhaseTransition: Boolean(row.require_reviews_before_phase_transition),
|
271
|
+
createdAt: validateString(row.created_at, 'created_at'),
|
272
|
+
updatedAt: validateString(row.updated_at, 'updated_at'),
|
273
|
+
};
|
274
|
+
}
|
275
|
+
/**
|
276
|
+
* Delete conversation state
|
277
|
+
*/
|
278
|
+
async deleteConversationState(conversationId) {
|
279
|
+
await this.runQuery('DELETE FROM conversation_states WHERE conversation_id = ?', [conversationId]);
|
280
|
+
}
|
281
|
+
/**
|
282
|
+
* Log an interaction to the database
|
283
|
+
*/
|
284
|
+
async logInteraction(log) {
|
285
|
+
logger.debug('Logging interaction to database', {
|
286
|
+
conversationId: log.conversationId,
|
287
|
+
toolName: log.toolName,
|
288
|
+
});
|
289
|
+
try {
|
290
|
+
await this.runQuery(`INSERT INTO interaction_logs (
|
291
|
+
conversation_id, tool_name, input_params, response_data,
|
292
|
+
current_phase, timestamp
|
293
|
+
) VALUES (?, ?, ?, ?, ?, ?)`, [
|
294
|
+
log.conversationId,
|
295
|
+
log.toolName,
|
296
|
+
log.inputParams,
|
297
|
+
log.responseData,
|
298
|
+
log.currentPhase,
|
299
|
+
log.timestamp,
|
300
|
+
]);
|
301
|
+
logger.debug('Interaction logged successfully', {
|
302
|
+
conversationId: log.conversationId,
|
303
|
+
toolName: log.toolName,
|
304
|
+
timestamp: log.timestamp,
|
305
|
+
});
|
306
|
+
}
|
307
|
+
catch (error) {
|
308
|
+
logger.error('Failed to log interaction', error, {
|
309
|
+
conversationId: log.conversationId,
|
310
|
+
});
|
311
|
+
throw error;
|
312
|
+
}
|
313
|
+
}
|
314
|
+
/**
|
315
|
+
* Get all interactions for a specific conversation
|
316
|
+
*/
|
317
|
+
async getInteractionsByConversationId(conversationId) {
|
318
|
+
logger.debug('Getting interactions by conversation ID', { conversationId });
|
319
|
+
try {
|
320
|
+
const rows = await this.getAllRows('SELECT * FROM interaction_logs WHERE conversation_id = ? ORDER BY timestamp ASC', [conversationId]);
|
321
|
+
const logs = rows.map(row => ({
|
322
|
+
id: typeof row.id === 'number' ? row.id : undefined,
|
323
|
+
conversationId: validateString(row.conversation_id, 'conversation_id'),
|
324
|
+
toolName: validateString(row.tool_name, 'tool_name'),
|
325
|
+
inputParams: validateString(row.input_params, 'input_params'),
|
326
|
+
responseData: validateString(row.response_data, 'response_data'),
|
327
|
+
currentPhase: validateString(row.current_phase, 'current_phase'),
|
328
|
+
timestamp: validateString(row.timestamp, 'timestamp'),
|
329
|
+
}));
|
330
|
+
logger.debug('Retrieved interaction logs', {
|
331
|
+
conversationId,
|
332
|
+
count: logs.length,
|
333
|
+
});
|
334
|
+
return logs;
|
335
|
+
}
|
336
|
+
catch (error) {
|
337
|
+
logger.error('Failed to get interaction logs', error, {
|
338
|
+
conversationId,
|
339
|
+
});
|
340
|
+
throw error;
|
341
|
+
}
|
342
|
+
}
|
343
|
+
/**
|
344
|
+
* Run database migrations to add new columns
|
345
|
+
*/
|
346
|
+
async runMigrations() {
|
347
|
+
logger.debug('Running database migrations');
|
348
|
+
try {
|
349
|
+
// Check if interaction_logs table exists first
|
350
|
+
const tables = await this.getAllRows("SELECT name FROM sqlite_master WHERE type='table' AND name='interaction_logs'");
|
351
|
+
if (tables.length > 0) {
|
352
|
+
// Table exists, check for missing columns
|
353
|
+
const tableInfo = await this.getAllRows('PRAGMA table_info(interaction_logs)');
|
354
|
+
const hasIsReset = tableInfo.some((col) => col.name === 'is_reset');
|
355
|
+
const hasResetAt = tableInfo.some((col) => col.name === 'reset_at');
|
356
|
+
if (!hasIsReset) {
|
357
|
+
logger.info('Adding is_reset column to interaction_logs table');
|
358
|
+
await this.runQuery('ALTER TABLE interaction_logs ADD COLUMN is_reset BOOLEAN DEFAULT FALSE');
|
359
|
+
}
|
360
|
+
if (!hasResetAt) {
|
361
|
+
logger.info('Adding reset_at column to interaction_logs table');
|
362
|
+
await this.runQuery('ALTER TABLE interaction_logs ADD COLUMN reset_at TEXT');
|
363
|
+
}
|
364
|
+
}
|
365
|
+
// Check if conversation_states table exists and has workflow_name column
|
366
|
+
const conversationTables = await this.getAllRows("SELECT name FROM sqlite_master WHERE type='table' AND name='conversation_states'");
|
367
|
+
if (conversationTables.length > 0) {
|
368
|
+
const conversationTableInfo = (await this.getAllRows('PRAGMA table_info(conversation_states)'));
|
369
|
+
const hasWorkflowName = conversationTableInfo.some((col) => col.name === 'workflow_name');
|
370
|
+
const hasGitCommitConfig = conversationTableInfo.some((col) => col.name === 'git_commit_config');
|
371
|
+
const hasRequireReviews = conversationTableInfo.some((col) => col.name === 'require_reviews_before_phase_transition');
|
372
|
+
if (!hasWorkflowName) {
|
373
|
+
logger.info('Adding workflow_name column to conversation_states table');
|
374
|
+
await this.runQuery("ALTER TABLE conversation_states ADD COLUMN workflow_name TEXT DEFAULT 'waterfall'");
|
375
|
+
}
|
376
|
+
if (!hasGitCommitConfig) {
|
377
|
+
logger.info('Adding git_commit_config column to conversation_states table');
|
378
|
+
await this.runQuery('ALTER TABLE conversation_states ADD COLUMN git_commit_config TEXT');
|
379
|
+
}
|
380
|
+
if (!hasRequireReviews) {
|
381
|
+
logger.info('Adding require_reviews_before_phase_transition column to conversation_states table');
|
382
|
+
await this.runQuery('ALTER TABLE conversation_states ADD COLUMN require_reviews_before_phase_transition BOOLEAN DEFAULT FALSE');
|
383
|
+
}
|
384
|
+
}
|
385
|
+
logger.debug('Database migrations completed successfully');
|
386
|
+
}
|
387
|
+
catch (error) {
|
388
|
+
logger.error('Failed to run database migrations', error);
|
389
|
+
throw error;
|
390
|
+
}
|
391
|
+
}
|
392
|
+
/**
|
393
|
+
* Soft delete interaction logs for a conversation
|
394
|
+
*/
|
395
|
+
async softDeleteInteractionLogs(conversationId, reason) {
|
396
|
+
logger.debug('Soft deleting interaction logs', { conversationId, reason });
|
397
|
+
try {
|
398
|
+
const resetAt = new Date().toISOString();
|
399
|
+
await this.runQuery('UPDATE interaction_logs SET is_reset = TRUE, reset_at = ? WHERE conversation_id = ? AND is_reset = FALSE', [resetAt, conversationId]);
|
400
|
+
logger.info('Interaction logs soft deleted successfully', {
|
401
|
+
conversationId,
|
402
|
+
reason,
|
403
|
+
resetAt,
|
404
|
+
});
|
405
|
+
}
|
406
|
+
catch (error) {
|
407
|
+
logger.error('Failed to soft delete interaction logs', error, {
|
408
|
+
conversationId,
|
409
|
+
});
|
410
|
+
throw error;
|
411
|
+
}
|
412
|
+
}
|
413
|
+
/**
|
414
|
+
* Get active (non-reset) interaction logs for a conversation
|
415
|
+
*/
|
416
|
+
async getActiveInteractionLogs(conversationId) {
|
417
|
+
logger.debug('Getting active interaction logs', { conversationId });
|
418
|
+
try {
|
419
|
+
const rows = await this.getAllRows('SELECT * FROM interaction_logs WHERE conversation_id = ? AND (is_reset = FALSE OR is_reset IS NULL) ORDER BY timestamp ASC', [conversationId]);
|
420
|
+
const logs = rows.map(row => mapRowToInteractionLog({
|
421
|
+
id: row.id,
|
422
|
+
conversationId: row.conversation_id,
|
423
|
+
toolName: row.tool_name,
|
424
|
+
inputParams: row.input_params,
|
425
|
+
responseData: row.response_data,
|
426
|
+
currentPhase: row.current_phase,
|
427
|
+
timestamp: row.timestamp,
|
428
|
+
}));
|
429
|
+
logger.debug('Retrieved active interaction logs', {
|
430
|
+
conversationId,
|
431
|
+
count: logs.length,
|
432
|
+
});
|
433
|
+
return logs;
|
434
|
+
}
|
435
|
+
catch (error) {
|
436
|
+
logger.error('Failed to get active interaction logs', error, {
|
437
|
+
conversationId,
|
438
|
+
});
|
439
|
+
throw error;
|
440
|
+
}
|
441
|
+
}
|
442
|
+
/**
|
443
|
+
* Get all interaction logs including reset ones for a conversation
|
444
|
+
*/
|
445
|
+
async getAllInteractionLogsIncludingReset(conversationId) {
|
446
|
+
logger.debug('Getting all interaction logs including reset', {
|
447
|
+
conversationId,
|
448
|
+
});
|
449
|
+
try {
|
450
|
+
const rows = await this.getAllRows('SELECT * FROM interaction_logs WHERE conversation_id = ? ORDER BY timestamp ASC', [conversationId]);
|
451
|
+
const logs = rows.map(row => mapRowToInteractionLog({
|
452
|
+
id: row.id,
|
453
|
+
conversationId: row.conversation_id,
|
454
|
+
toolName: row.tool_name,
|
455
|
+
inputParams: row.input_params,
|
456
|
+
responseData: row.response_data,
|
457
|
+
currentPhase: row.current_phase,
|
458
|
+
timestamp: row.timestamp,
|
459
|
+
isReset: row.is_reset,
|
460
|
+
resetAt: row.reset_at,
|
461
|
+
}));
|
462
|
+
logger.debug('Retrieved all interaction logs including reset', {
|
463
|
+
conversationId,
|
464
|
+
count: logs.length,
|
465
|
+
resetCount: logs.filter(log => log.isReset).length,
|
466
|
+
});
|
467
|
+
return logs;
|
468
|
+
}
|
469
|
+
catch (error) {
|
470
|
+
logger.error('Failed to get all interaction logs including reset', error, { conversationId });
|
471
|
+
throw error;
|
472
|
+
}
|
473
|
+
}
|
474
|
+
/**
|
475
|
+
* Close database connection
|
476
|
+
*/
|
477
|
+
async close() {
|
478
|
+
logger.debug('Closing database connection');
|
479
|
+
return new Promise((resolve, reject) => {
|
480
|
+
if (this.db) {
|
481
|
+
this.db.close(err => {
|
482
|
+
if (err) {
|
483
|
+
logger.error('Failed to close database connection', err);
|
484
|
+
reject(err);
|
485
|
+
}
|
486
|
+
else {
|
487
|
+
this.db = null;
|
488
|
+
logger.info('Database connection closed successfully');
|
489
|
+
resolve();
|
490
|
+
}
|
491
|
+
});
|
492
|
+
}
|
493
|
+
else {
|
494
|
+
logger.debug('Database connection already closed');
|
495
|
+
resolve();
|
496
|
+
}
|
497
|
+
});
|
498
|
+
}
|
499
|
+
}
|
500
|
+
//# sourceMappingURL=database.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
/**
|
2
|
+
* File Detection Manager
|
3
|
+
*
|
4
|
+
* Handles pattern-based file discovery and suggestions for existing documentation files.
|
5
|
+
* Supports auto-detection of common documentation patterns in projects.
|
6
|
+
*/
|
7
|
+
export interface DetectedFile {
|
8
|
+
path: string;
|
9
|
+
relativePath: string;
|
10
|
+
type: 'architecture' | 'requirements' | 'design';
|
11
|
+
confidence: 'high' | 'medium' | 'low';
|
12
|
+
}
|
13
|
+
export interface FileDetectionResult {
|
14
|
+
architecture: DetectedFile[];
|
15
|
+
requirements: DetectedFile[];
|
16
|
+
design: DetectedFile[];
|
17
|
+
}
|
18
|
+
export declare class FileDetectionManager {
|
19
|
+
private projectPath;
|
20
|
+
constructor(projectPath: string);
|
21
|
+
/**
|
22
|
+
* Detect existing documentation files in the project
|
23
|
+
*/
|
24
|
+
detectDocumentationFiles(): Promise<FileDetectionResult>;
|
25
|
+
/**
|
26
|
+
* Get search locations for documentation files
|
27
|
+
*/
|
28
|
+
private getSearchLocations;
|
29
|
+
/**
|
30
|
+
* Scan a location for files
|
31
|
+
*/
|
32
|
+
private scanLocation;
|
33
|
+
/**
|
34
|
+
* Match a file against documentation patterns
|
35
|
+
*/
|
36
|
+
private matchFileToPatterns;
|
37
|
+
/**
|
38
|
+
* Check if file matches any of the patterns
|
39
|
+
*/
|
40
|
+
private matchesPatterns;
|
41
|
+
/**
|
42
|
+
* Determine confidence level for a match
|
43
|
+
*/
|
44
|
+
private getConfidence;
|
45
|
+
/**
|
46
|
+
* Sort by confidence and remove duplicates
|
47
|
+
*/
|
48
|
+
private sortAndDeduplicate;
|
49
|
+
/**
|
50
|
+
* Format file suggestions for LLM responses
|
51
|
+
*/
|
52
|
+
formatSuggestions(detectionResult: FileDetectionResult): string;
|
53
|
+
}
|