memento-mcp-server 1.15.0-c → 1.16.0-a
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/domains/relation/tools/visualize-relations-tool.d.ts +2 -2
- package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.d.ts +60 -0
- package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.d.ts.map +1 -0
- package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.js +276 -0
- package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.js.map +1 -0
- package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.sql +128 -0
- package/dist/infrastructure/scheduler/batch-scheduler.d.ts +17 -0
- package/dist/infrastructure/scheduler/batch-scheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/batch-scheduler.js +124 -0
- package/dist/infrastructure/scheduler/batch-scheduler.js.map +1 -1
- package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.d.ts +108 -0
- package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.js +184 -0
- package/dist/infrastructure/scheduler/jobs/quality-measurement-batch-job.js.map +1 -0
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +3 -0
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/routes/quality.routes.d.ts +14 -0
- package/dist/server/routes/quality.routes.d.ts.map +1 -0
- package/dist/server/routes/quality.routes.js +460 -0
- package/dist/server/routes/quality.routes.js.map +1 -0
- package/dist/services/quality-assurance/quality-assurance-service.d.ts +207 -0
- package/dist/services/quality-assurance/quality-assurance-service.d.ts.map +1 -0
- package/dist/services/quality-assurance/quality-assurance-service.js +247 -0
- package/dist/services/quality-assurance/quality-assurance-service.js.map +1 -0
- package/dist/services/quality-assurance/quality-evaluator.d.ts +163 -0
- package/dist/services/quality-assurance/quality-evaluator.d.ts.map +1 -0
- package/dist/services/quality-assurance/quality-evaluator.js +256 -0
- package/dist/services/quality-assurance/quality-evaluator.js.map +1 -0
- package/dist/services/quality-assurance/quality-metrics-collector.d.ts +219 -0
- package/dist/services/quality-assurance/quality-metrics-collector.d.ts.map +1 -0
- package/dist/services/quality-assurance/quality-metrics-collector.js +725 -0
- package/dist/services/quality-assurance/quality-metrics-collector.js.map +1 -0
- package/dist/services/quality-assurance/quality-recorder.d.ts +108 -0
- package/dist/services/quality-assurance/quality-recorder.d.ts.map +1 -0
- package/dist/services/quality-assurance/quality-recorder.js +281 -0
- package/dist/services/quality-assurance/quality-recorder.js.map +1 -0
- package/dist/services/quality-assurance/quality-reporter.d.ts +189 -0
- package/dist/services/quality-assurance/quality-reporter.d.ts.map +1 -0
- package/dist/services/quality-assurance/quality-reporter.js +558 -0
- package/dist/services/quality-assurance/quality-reporter.js.map +1 -0
- package/dist/services/quality-assurance/quality-threshold-manager.d.ts +102 -0
- package/dist/services/quality-assurance/quality-threshold-manager.d.ts.map +1 -0
- package/dist/services/quality-assurance/quality-threshold-manager.js +252 -0
- package/dist/services/quality-assurance/quality-threshold-manager.js.map +1 -0
- package/dist/test/helpers/search-quality-metrics.d.ts +96 -0
- package/dist/test/helpers/search-quality-metrics.d.ts.map +1 -0
- package/dist/test/helpers/search-quality-metrics.js +185 -0
- package/dist/test/helpers/search-quality-metrics.js.map +1 -0
- package/dist/test/helpers/vector-search-quality-metrics.d.ts +1287 -0
- package/dist/test/helpers/vector-search-quality-metrics.d.ts.map +1 -0
- package/dist/test/helpers/vector-search-quality-metrics.js +2214 -0
- package/dist/test/helpers/vector-search-quality-metrics.js.map +1 -0
- package/package.json +4 -1
- package/scripts/quality-report.ts +166 -0
- package/scripts/quality-thresholds.ts +279 -0
|
@@ -16,8 +16,8 @@ declare const VisualizeRelationsSchema: z.ZodObject<{
|
|
|
16
16
|
show_relation_types: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
17
17
|
}, "strip", z.ZodTypeAny, {
|
|
18
18
|
memory_id: string;
|
|
19
|
-
max_depth: number;
|
|
20
19
|
format: "text" | "json" | "subgraph" | "simple";
|
|
20
|
+
max_depth: number;
|
|
21
21
|
show_memory_ids: boolean;
|
|
22
22
|
show_confidence: boolean;
|
|
23
23
|
show_relation_types: boolean;
|
|
@@ -25,8 +25,8 @@ declare const VisualizeRelationsSchema: z.ZodObject<{
|
|
|
25
25
|
relation_types?: ("CAUSES" | "DEPENDS_ON" | "FOLLOWS" | "CONTRASTS_WITH" | "REFERENCES" | "BELONGS_TO")[] | undefined;
|
|
26
26
|
}, {
|
|
27
27
|
memory_id: string;
|
|
28
|
-
max_depth?: number | undefined;
|
|
29
28
|
format?: "text" | "json" | "subgraph" | "simple" | undefined;
|
|
29
|
+
max_depth?: number | undefined;
|
|
30
30
|
min_confidence?: number | undefined;
|
|
31
31
|
relation_types?: ("CAUSES" | "DEPENDS_ON" | "FOLLOWS" | "CONTRASTS_WITH" | "REFERENCES" | "BELONGS_TO")[] | undefined;
|
|
32
32
|
show_memory_ids?: boolean | undefined;
|
package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: 009 - Quality Assurance Schema
|
|
3
|
+
* Description: Create quality measurement tables for quality assurance system
|
|
4
|
+
* Version: 9.0
|
|
5
|
+
* Date: 2025-01-XX
|
|
6
|
+
*/
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
import type { Migration } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Quality Assurance Schema Migration
|
|
11
|
+
*
|
|
12
|
+
* This migration:
|
|
13
|
+
* 1. Creates quality_measurement_history table for tracking quality measurement history
|
|
14
|
+
* 2. Creates quality_metrics table for storing latest quality metric values
|
|
15
|
+
* 3. Creates quality_thresholds table for managing quality thresholds
|
|
16
|
+
* 4. Creates indexes for efficient queries
|
|
17
|
+
*/
|
|
18
|
+
export declare class QualityAssuranceSchemaMigration implements Migration {
|
|
19
|
+
version: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
/**
|
|
23
|
+
* Load SQL file content
|
|
24
|
+
*/
|
|
25
|
+
private loadSQLFile;
|
|
26
|
+
/**
|
|
27
|
+
* Execute SQL script
|
|
28
|
+
* Removes transaction commands (BEGIN TRANSACTION, COMMIT) as MigrationRunner manages transactions
|
|
29
|
+
*/
|
|
30
|
+
private executeSQL;
|
|
31
|
+
/**
|
|
32
|
+
* Check if table exists
|
|
33
|
+
*/
|
|
34
|
+
private tableExists;
|
|
35
|
+
/**
|
|
36
|
+
* Check if index exists
|
|
37
|
+
*/
|
|
38
|
+
private indexExists;
|
|
39
|
+
/**
|
|
40
|
+
* Check if column exists in table
|
|
41
|
+
*/
|
|
42
|
+
private columnExists;
|
|
43
|
+
/**
|
|
44
|
+
* Validate before migration
|
|
45
|
+
*/
|
|
46
|
+
validateBefore(db: Database.Database): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Execute migration (Up)
|
|
49
|
+
*/
|
|
50
|
+
up(db: Database.Database): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Rollback migration (Down)
|
|
53
|
+
*/
|
|
54
|
+
down(db: Database.Database): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Validate after migration
|
|
57
|
+
*/
|
|
58
|
+
validateAfter(db: Database.Database): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=009-quality-assurance-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"009-quality-assurance-schema.d.ts","sourceRoot":"","sources":["../../../../../../src/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C;;;;;;;;GAQG;AACH,qBAAa,+BAAgC,YAAW,SAAS;IAC/D,OAAO,SAAS;IAChB,IAAI,SAA8B;IAClC,WAAW,SAAoE;IAE/E;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAsBlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B1D;;OAEG;IACG,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhD;;OAEG;IACG,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA6J1D"}
|
package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration: 009 - Quality Assurance Schema
|
|
3
|
+
* Description: Create quality measurement tables for quality assurance system
|
|
4
|
+
* Version: 9.0
|
|
5
|
+
* Date: 2025-01-XX
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync } from 'fs';
|
|
8
|
+
import { join, dirname } from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import { DependencyValidator } from '../dependency-validator.js';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
/**
|
|
14
|
+
* Quality Assurance Schema Migration
|
|
15
|
+
*
|
|
16
|
+
* This migration:
|
|
17
|
+
* 1. Creates quality_measurement_history table for tracking quality measurement history
|
|
18
|
+
* 2. Creates quality_metrics table for storing latest quality metric values
|
|
19
|
+
* 3. Creates quality_thresholds table for managing quality thresholds
|
|
20
|
+
* 4. Creates indexes for efficient queries
|
|
21
|
+
*/
|
|
22
|
+
export class QualityAssuranceSchemaMigration {
|
|
23
|
+
version = '9.0';
|
|
24
|
+
name = 'quality-assurance-schema';
|
|
25
|
+
description = 'Create quality measurement tables for quality assurance system';
|
|
26
|
+
/**
|
|
27
|
+
* Load SQL file content
|
|
28
|
+
*/
|
|
29
|
+
loadSQLFile(filename) {
|
|
30
|
+
const filePath = join(__dirname, filename);
|
|
31
|
+
return readFileSync(filePath, 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Execute SQL script
|
|
35
|
+
* Removes transaction commands (BEGIN TRANSACTION, COMMIT) as MigrationRunner manages transactions
|
|
36
|
+
*/
|
|
37
|
+
executeSQL(db, sql) {
|
|
38
|
+
// MigrationRunner가 트랜잭션을 관리하므로 SQL에서 트랜잭션 명령 제거
|
|
39
|
+
let cleanedSQL = sql
|
|
40
|
+
// BEGIN TRANSACTION 제거
|
|
41
|
+
.replace(/BEGIN\s+TRANSACTION\s*;/gi, '')
|
|
42
|
+
// COMMIT 제거
|
|
43
|
+
.replace(/COMMIT\s*;/gi, '')
|
|
44
|
+
// PRAGMA foreign_keys 명령은 유지 (트랜잭션 외부에서도 작동)
|
|
45
|
+
.trim();
|
|
46
|
+
// 빈 줄 제거 및 정리
|
|
47
|
+
cleanedSQL = cleanedSQL
|
|
48
|
+
.split('\n')
|
|
49
|
+
.map(line => line.trim())
|
|
50
|
+
.filter(line => line.length > 0)
|
|
51
|
+
.join('\n');
|
|
52
|
+
if (cleanedSQL.length > 0) {
|
|
53
|
+
db.exec(cleanedSQL);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if table exists
|
|
58
|
+
*/
|
|
59
|
+
tableExists(db, tableName) {
|
|
60
|
+
const result = db.prepare(`
|
|
61
|
+
SELECT name FROM sqlite_master
|
|
62
|
+
WHERE type='table' AND name=?
|
|
63
|
+
`).get(tableName);
|
|
64
|
+
return !!result;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if index exists
|
|
68
|
+
*/
|
|
69
|
+
indexExists(db, indexName) {
|
|
70
|
+
const result = db.prepare(`
|
|
71
|
+
SELECT name FROM sqlite_master
|
|
72
|
+
WHERE type='index' AND name=?
|
|
73
|
+
`).get(indexName);
|
|
74
|
+
return !!result;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if column exists in table
|
|
78
|
+
*/
|
|
79
|
+
columnExists(db, tableName, columnName) {
|
|
80
|
+
const columns = db.prepare(`PRAGMA table_info(${tableName})`).all();
|
|
81
|
+
return columns.some(col => col.name === columnName);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate before migration
|
|
85
|
+
*/
|
|
86
|
+
async validateBefore(db) {
|
|
87
|
+
// Check if migration has already been applied
|
|
88
|
+
if (this.tableExists(db, 'memento_schema_version')) {
|
|
89
|
+
const version = db.prepare(`
|
|
90
|
+
SELECT version FROM memento_schema_version WHERE version = ?
|
|
91
|
+
`).get('9.0');
|
|
92
|
+
if (version) {
|
|
93
|
+
throw new Error('Migration 009 has already been applied. Current schema version: 9.0');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Check if quality_measurement_history table already exists (should not exist)
|
|
97
|
+
if (this.tableExists(db, 'quality_measurement_history')) {
|
|
98
|
+
throw new Error('quality_measurement_history table already exists. Migration may have been partially applied.');
|
|
99
|
+
}
|
|
100
|
+
// Check if quality_metrics table already exists (should not exist)
|
|
101
|
+
if (this.tableExists(db, 'quality_metrics')) {
|
|
102
|
+
throw new Error('quality_metrics table already exists. Migration may have been partially applied.');
|
|
103
|
+
}
|
|
104
|
+
// Check if quality_thresholds table already exists (should not exist)
|
|
105
|
+
if (this.tableExists(db, 'quality_thresholds')) {
|
|
106
|
+
throw new Error('quality_thresholds table already exists. Migration may have been partially applied.');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Execute migration (Up)
|
|
111
|
+
*/
|
|
112
|
+
async up(db) {
|
|
113
|
+
// Load and execute SQL script
|
|
114
|
+
const sqlScript = this.loadSQLFile('009-quality-assurance-schema.sql');
|
|
115
|
+
this.executeSQL(db, sqlScript);
|
|
116
|
+
// Note: Schema version is recorded by MigrationRunner, not here
|
|
117
|
+
// MigrationRunner.recordVersion() will be called after successful migration
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Rollback migration (Down)
|
|
121
|
+
*/
|
|
122
|
+
async down(db) {
|
|
123
|
+
// Drop indexes first
|
|
124
|
+
const indexes = [
|
|
125
|
+
'idx_quality_measurement_history_measured_at',
|
|
126
|
+
'idx_quality_measurement_history_type',
|
|
127
|
+
'idx_quality_measurement_history_status',
|
|
128
|
+
'idx_quality_metrics_namespace_key',
|
|
129
|
+
'idx_quality_metrics_context',
|
|
130
|
+
'idx_quality_metrics_status',
|
|
131
|
+
'idx_quality_metrics_measured_at',
|
|
132
|
+
'idx_quality_thresholds_namespace_key',
|
|
133
|
+
'idx_quality_thresholds_context'
|
|
134
|
+
];
|
|
135
|
+
for (const indexName of indexes) {
|
|
136
|
+
db.exec(`DROP INDEX IF EXISTS ${indexName}`);
|
|
137
|
+
}
|
|
138
|
+
// Drop tables
|
|
139
|
+
db.exec('DROP TABLE IF EXISTS quality_measurement_history');
|
|
140
|
+
db.exec('DROP TABLE IF EXISTS quality_metrics');
|
|
141
|
+
db.exec('DROP TABLE IF EXISTS quality_thresholds');
|
|
142
|
+
// Remove schema version record
|
|
143
|
+
db.prepare('DELETE FROM memento_schema_version WHERE version = ?').run('9.0');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Validate after migration
|
|
147
|
+
*/
|
|
148
|
+
async validateAfter(db) {
|
|
149
|
+
// Verify quality_measurement_history table exists
|
|
150
|
+
if (!this.tableExists(db, 'quality_measurement_history')) {
|
|
151
|
+
throw new Error('quality_measurement_history table was not created');
|
|
152
|
+
}
|
|
153
|
+
// Verify quality_metrics table exists
|
|
154
|
+
if (!this.tableExists(db, 'quality_metrics')) {
|
|
155
|
+
throw new Error('quality_metrics table was not created');
|
|
156
|
+
}
|
|
157
|
+
// Verify quality_thresholds table exists
|
|
158
|
+
if (!this.tableExists(db, 'quality_thresholds')) {
|
|
159
|
+
throw new Error('quality_thresholds table was not created');
|
|
160
|
+
}
|
|
161
|
+
// Verify quality_measurement_history table structure (check columns)
|
|
162
|
+
const historyColumns = db.prepare(`PRAGMA table_info(quality_measurement_history)`).all();
|
|
163
|
+
const historyColumnNames = historyColumns.map(col => col.name);
|
|
164
|
+
const requiredHistoryColumns = [
|
|
165
|
+
'id',
|
|
166
|
+
'measurement_type',
|
|
167
|
+
'measured_at',
|
|
168
|
+
'metrics',
|
|
169
|
+
'status',
|
|
170
|
+
'warnings',
|
|
171
|
+
'created_at'
|
|
172
|
+
];
|
|
173
|
+
for (const column of requiredHistoryColumns) {
|
|
174
|
+
if (!historyColumnNames.includes(column)) {
|
|
175
|
+
throw new Error(`Column ${column} was not created in quality_measurement_history table`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Verify quality_metrics table structure (check columns)
|
|
179
|
+
const metricsColumns = db.prepare(`PRAGMA table_info(quality_metrics)`).all();
|
|
180
|
+
const metricsColumnNames = metricsColumns.map(col => col.name);
|
|
181
|
+
const requiredMetricsColumns = [
|
|
182
|
+
'metric_namespace',
|
|
183
|
+
'metric_key',
|
|
184
|
+
'context',
|
|
185
|
+
'metric_value',
|
|
186
|
+
'measured_at',
|
|
187
|
+
'status',
|
|
188
|
+
'threshold_value',
|
|
189
|
+
'updated_at'
|
|
190
|
+
];
|
|
191
|
+
for (const column of requiredMetricsColumns) {
|
|
192
|
+
if (!metricsColumnNames.includes(column)) {
|
|
193
|
+
throw new Error(`Column ${column} was not created in quality_metrics table`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Verify quality_thresholds table structure (check columns)
|
|
197
|
+
const thresholdsColumns = db.prepare(`PRAGMA table_info(quality_thresholds)`).all();
|
|
198
|
+
const thresholdsColumnNames = thresholdsColumns.map(col => col.name);
|
|
199
|
+
const requiredThresholdsColumns = [
|
|
200
|
+
'metric_namespace',
|
|
201
|
+
'metric_key',
|
|
202
|
+
'context',
|
|
203
|
+
'threshold_value',
|
|
204
|
+
'threshold_type',
|
|
205
|
+
'description',
|
|
206
|
+
'updated_at'
|
|
207
|
+
];
|
|
208
|
+
for (const column of requiredThresholdsColumns) {
|
|
209
|
+
if (!thresholdsColumnNames.includes(column)) {
|
|
210
|
+
throw new Error(`Column ${column} was not created in quality_thresholds table`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Verify indexes were created
|
|
214
|
+
const requiredIndexes = [
|
|
215
|
+
'idx_quality_measurement_history_measured_at',
|
|
216
|
+
'idx_quality_measurement_history_type',
|
|
217
|
+
'idx_quality_measurement_history_status',
|
|
218
|
+
'idx_quality_metrics_namespace_key',
|
|
219
|
+
'idx_quality_metrics_context',
|
|
220
|
+
'idx_quality_metrics_status',
|
|
221
|
+
'idx_quality_metrics_measured_at',
|
|
222
|
+
'idx_quality_thresholds_namespace_key',
|
|
223
|
+
'idx_quality_thresholds_context'
|
|
224
|
+
];
|
|
225
|
+
for (const index of requiredIndexes) {
|
|
226
|
+
if (!this.indexExists(db, index)) {
|
|
227
|
+
throw new Error(`Index ${index} was not created`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Verify PRIMARY KEY constraints
|
|
231
|
+
const historyTableInfo = db.prepare(`
|
|
232
|
+
SELECT sql FROM sqlite_master
|
|
233
|
+
WHERE type='table' AND name='quality_measurement_history'
|
|
234
|
+
`).get();
|
|
235
|
+
if (!historyTableInfo || !historyTableInfo.sql.includes('PRIMARY KEY')) {
|
|
236
|
+
throw new Error('PRIMARY KEY constraint was not created on quality_measurement_history table');
|
|
237
|
+
}
|
|
238
|
+
const metricsTableInfo = db.prepare(`
|
|
239
|
+
SELECT sql FROM sqlite_master
|
|
240
|
+
WHERE type='table' AND name='quality_metrics'
|
|
241
|
+
`).get();
|
|
242
|
+
if (!metricsTableInfo || !metricsTableInfo.sql.includes('PRIMARY KEY')) {
|
|
243
|
+
throw new Error('PRIMARY KEY constraint was not created on quality_metrics table');
|
|
244
|
+
}
|
|
245
|
+
const thresholdsTableInfo = db.prepare(`
|
|
246
|
+
SELECT sql FROM sqlite_master
|
|
247
|
+
WHERE type='table' AND name='quality_thresholds'
|
|
248
|
+
`).get();
|
|
249
|
+
if (!thresholdsTableInfo || !thresholdsTableInfo.sql.includes('PRIMARY KEY')) {
|
|
250
|
+
throw new Error('PRIMARY KEY constraint was not created on quality_thresholds table');
|
|
251
|
+
}
|
|
252
|
+
// Verify CHECK constraints
|
|
253
|
+
if (!historyTableInfo.sql.includes('CHECK (measurement_type IN')) {
|
|
254
|
+
throw new Error('CHECK constraint on measurement_type was not created in quality_measurement_history table');
|
|
255
|
+
}
|
|
256
|
+
if (!historyTableInfo.sql.includes('CHECK (status IN')) {
|
|
257
|
+
throw new Error('CHECK constraint on status was not created in quality_measurement_history table');
|
|
258
|
+
}
|
|
259
|
+
if (!metricsTableInfo.sql.includes('CHECK (status IN')) {
|
|
260
|
+
throw new Error('CHECK constraint on status was not created in quality_metrics table');
|
|
261
|
+
}
|
|
262
|
+
if (!thresholdsTableInfo.sql.includes('CHECK (threshold_type IN')) {
|
|
263
|
+
throw new Error('CHECK constraint on threshold_type was not created in quality_thresholds table');
|
|
264
|
+
}
|
|
265
|
+
// Verify existing dependencies are intact using DependencyValidator
|
|
266
|
+
const dependencyReport = await DependencyValidator.validateAll(db);
|
|
267
|
+
if (!dependencyReport.success) {
|
|
268
|
+
const errors = dependencyReport.results
|
|
269
|
+
.filter(r => !r.success)
|
|
270
|
+
.map(r => `${r.name}: ${r.error}`)
|
|
271
|
+
.join('; ');
|
|
272
|
+
throw new Error(`Dependency validation failed: ${errors}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=009-quality-assurance-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"009-quality-assurance-schema.js","sourceRoot":"","sources":["../../../../../../src/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.ts"],"names":[],"mappings":"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"}
|
package/dist/infrastructure/database/database/migration/migrations/009-quality-assurance-schema.sql
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
-- Migration: 009 - Quality Assurance Schema
|
|
2
|
+
-- Description: Create quality measurement tables for quality assurance system
|
|
3
|
+
-- Version: 9.0
|
|
4
|
+
-- Date: 2025-01-XX
|
|
5
|
+
--
|
|
6
|
+
-- This migration:
|
|
7
|
+
-- 1. Creates quality_measurement_history table for tracking quality measurement history
|
|
8
|
+
-- 2. Creates quality_metrics table for storing latest quality metric values
|
|
9
|
+
-- 3. Creates quality_thresholds table for managing quality thresholds
|
|
10
|
+
-- 4. Creates indexes for efficient queries
|
|
11
|
+
|
|
12
|
+
PRAGMA foreign_keys = OFF;
|
|
13
|
+
BEGIN TRANSACTION;
|
|
14
|
+
|
|
15
|
+
-- ============================================================================
|
|
16
|
+
-- 1. Create quality_measurement_history table
|
|
17
|
+
-- ============================================================================
|
|
18
|
+
-- 품질 측정 이력 테이블: 각 품질 측정 실행의 전체 이력을 저장
|
|
19
|
+
-- measurement_type: 'batch', 'test', 'manual'
|
|
20
|
+
-- status: 'success', 'warning', 'error'
|
|
21
|
+
-- metrics: JSON 형식으로 측정된 모든 지표 데이터 저장
|
|
22
|
+
-- warnings: 임계값 미달 시 경고 정보 저장
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS quality_measurement_history (
|
|
25
|
+
id TEXT PRIMARY KEY,
|
|
26
|
+
measurement_type TEXT NOT NULL CHECK (measurement_type IN ('batch', 'test', 'manual')),
|
|
27
|
+
measured_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
28
|
+
metrics TEXT NOT NULL, -- JSON 형식: 품질 지표 데이터
|
|
29
|
+
-- metrics JSON 구조 예시:
|
|
30
|
+
-- {
|
|
31
|
+
-- "metric_namespace": "search",
|
|
32
|
+
-- "metric_key": "precision_at_5",
|
|
33
|
+
-- "context": "default",
|
|
34
|
+
-- "value": 0.85,
|
|
35
|
+
-- "threshold_value": 0.8,
|
|
36
|
+
-- "evaluator_version": "1.0.0"
|
|
37
|
+
-- }
|
|
38
|
+
status TEXT NOT NULL CHECK (status IN ('success', 'warning', 'error')) DEFAULT 'success',
|
|
39
|
+
warnings TEXT, -- JSON 형식: 경고 정보 (임계값 미달 시)
|
|
40
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
-- ============================================================================
|
|
44
|
+
-- 2. Create quality_metrics table
|
|
45
|
+
-- ============================================================================
|
|
46
|
+
-- 품질 지표 테이블: 최신 측정값을 저장 (namespace, key, context 조합별로 최신 값 유지)
|
|
47
|
+
-- metric_namespace: 'search', 'relation', 'consolidation', 'storage' 등
|
|
48
|
+
-- metric_key: 'precision_at_5', 'f1_score', 'duplication_rate' 등
|
|
49
|
+
-- context: 'default', 'ci', 'nightly' 등 (측정 컨텍스트)
|
|
50
|
+
-- status: 'pass', 'warning', 'fail' (임계값 비교 결과)
|
|
51
|
+
|
|
52
|
+
CREATE TABLE IF NOT EXISTS quality_metrics (
|
|
53
|
+
metric_namespace TEXT NOT NULL, -- 'search', 'relation', 'consolidation', 'storage'
|
|
54
|
+
metric_key TEXT NOT NULL, -- 'precision_at_5', 'f1_score', 'duplication_rate' 등
|
|
55
|
+
context TEXT NOT NULL DEFAULT 'default', -- 'default', 'ci', 'nightly'
|
|
56
|
+
metric_value REAL NOT NULL,
|
|
57
|
+
measured_at TIMESTAMP NOT NULL,
|
|
58
|
+
status TEXT NOT NULL CHECK (status IN ('pass', 'warning', 'fail')) DEFAULT 'pass',
|
|
59
|
+
threshold_value REAL, -- 임계값 (측정 시점의 임계값)
|
|
60
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
61
|
+
PRIMARY KEY (metric_namespace, metric_key, context)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
-- ============================================================================
|
|
65
|
+
-- 3. Create quality_thresholds table
|
|
66
|
+
-- ============================================================================
|
|
67
|
+
-- 품질 임계값 테이블: 각 품질 지표별 임계값 관리
|
|
68
|
+
-- threshold_type: 'min' (최소값, 이상이어야 함), 'max' (최대값, 이하여야 함)
|
|
69
|
+
-- 예: precision_at_5의 threshold_type='min', threshold_value=0.7
|
|
70
|
+
-- duplication_rate의 threshold_type='max', threshold_value=0.05
|
|
71
|
+
|
|
72
|
+
CREATE TABLE IF NOT EXISTS quality_thresholds (
|
|
73
|
+
metric_namespace TEXT NOT NULL,
|
|
74
|
+
metric_key TEXT NOT NULL,
|
|
75
|
+
context TEXT NOT NULL DEFAULT 'default',
|
|
76
|
+
threshold_value REAL NOT NULL,
|
|
77
|
+
threshold_type TEXT NOT NULL CHECK (threshold_type IN ('min', 'max')),
|
|
78
|
+
description TEXT, -- 임계값 설명
|
|
79
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
80
|
+
PRIMARY KEY (metric_namespace, metric_key, context)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
-- ============================================================================
|
|
84
|
+
-- 4. Create indexes for efficient queries
|
|
85
|
+
-- ============================================================================
|
|
86
|
+
|
|
87
|
+
-- quality_measurement_history indexes
|
|
88
|
+
-- 측정 시간 기준 조회 (이력 조회)
|
|
89
|
+
CREATE INDEX IF NOT EXISTS idx_quality_measurement_history_measured_at
|
|
90
|
+
ON quality_measurement_history(measured_at);
|
|
91
|
+
|
|
92
|
+
-- 측정 타입 기준 조회 (배치/테스트/수동 구분)
|
|
93
|
+
CREATE INDEX IF NOT EXISTS idx_quality_measurement_history_type
|
|
94
|
+
ON quality_measurement_history(measurement_type);
|
|
95
|
+
|
|
96
|
+
-- 상태 기준 조회 (경고/에러 필터링)
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_quality_measurement_history_status
|
|
98
|
+
ON quality_measurement_history(status);
|
|
99
|
+
|
|
100
|
+
-- quality_metrics indexes
|
|
101
|
+
-- namespace와 key 조합 기준 조회 (특정 지표 조회)
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_quality_metrics_namespace_key
|
|
103
|
+
ON quality_metrics(metric_namespace, metric_key);
|
|
104
|
+
|
|
105
|
+
-- context 기준 조회 (컨텍스트별 조회)
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_quality_metrics_context
|
|
107
|
+
ON quality_metrics(context);
|
|
108
|
+
|
|
109
|
+
-- 상태 기준 조회 (경고/실패 필터링)
|
|
110
|
+
CREATE INDEX IF NOT EXISTS idx_quality_metrics_status
|
|
111
|
+
ON quality_metrics(status);
|
|
112
|
+
|
|
113
|
+
-- 측정 시간 기준 조회 (최신 측정값 조회)
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_quality_metrics_measured_at
|
|
115
|
+
ON quality_metrics(measured_at);
|
|
116
|
+
|
|
117
|
+
-- quality_thresholds indexes
|
|
118
|
+
-- namespace와 key 조합 기준 조회 (특정 임계값 조회)
|
|
119
|
+
CREATE INDEX IF NOT EXISTS idx_quality_thresholds_namespace_key
|
|
120
|
+
ON quality_thresholds(metric_namespace, metric_key);
|
|
121
|
+
|
|
122
|
+
-- context 기준 조회 (컨텍스트별 임계값 조회)
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_quality_thresholds_context
|
|
124
|
+
ON quality_thresholds(context);
|
|
125
|
+
|
|
126
|
+
COMMIT;
|
|
127
|
+
PRAGMA foreign_keys = ON;
|
|
128
|
+
|
|
@@ -25,6 +25,8 @@ export interface BatchJobConfig {
|
|
|
25
25
|
tripleExtractionHour?: number;
|
|
26
26
|
tripleExtractionBatchSize: number;
|
|
27
27
|
tripleExtractionTimeout: number;
|
|
28
|
+
qualityMeasurementInterval: number;
|
|
29
|
+
qualityMeasurementHour?: number;
|
|
28
30
|
maxBatchSize: number;
|
|
29
31
|
enableLogging: boolean;
|
|
30
32
|
enableNotifications: boolean;
|
|
@@ -83,6 +85,7 @@ export declare class BatchScheduler {
|
|
|
83
85
|
private fileLogger;
|
|
84
86
|
private relationValidatorExecutor;
|
|
85
87
|
private tripleExtractionBatchJob;
|
|
88
|
+
private qualityMeasurementBatchJob;
|
|
86
89
|
constructor(config?: Partial<BatchJobConfig>, dependencies?: {
|
|
87
90
|
jobQueue?: JobQueue;
|
|
88
91
|
retryManager?: RetryManager;
|
|
@@ -262,6 +265,20 @@ export declare class BatchScheduler {
|
|
|
262
265
|
* - JobQueue를 통해 실행하여 maxConcurrentJobs 제한 및 중복 방지 적용
|
|
263
266
|
*/
|
|
264
267
|
private scheduleTripleExtractionBatch;
|
|
268
|
+
/**
|
|
269
|
+
* 품질 측정 배치 작업 스케줄링
|
|
270
|
+
*
|
|
271
|
+
* PRD FR-5.6: 일일 품질 측정 배치 작업
|
|
272
|
+
* - 기본: 24시간마다 실행
|
|
273
|
+
* - 특정 시간 지정 시: 해당 시간에만 실행
|
|
274
|
+
*/
|
|
275
|
+
private scheduleQualityMeasurement;
|
|
276
|
+
/**
|
|
277
|
+
* 품질 측정 배치 작업 실행
|
|
278
|
+
*
|
|
279
|
+
* PRD FR-5.6: 일일 품질 측정 배치 작업
|
|
280
|
+
*/
|
|
281
|
+
private runQualityMeasurementBatch;
|
|
265
282
|
/**
|
|
266
283
|
* 로그 로테이션 실행
|
|
267
284
|
* 30일 이상 된 Triple 추출 로그 파일을 삭제합니다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-scheduler.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/scheduler/batch-scheduler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"batch-scheduler.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/scheduler/batch-scheduler.ts"],"names":[],"mappings":"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"}
|