memento-mcp-server 1.13.1 → 1.14.0-b

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.
Files changed (118) hide show
  1. package/dist/database/schema.sql +9 -2
  2. package/dist/domains/memory/tools/recall-tool.d.ts +13 -0
  3. package/dist/domains/memory/tools/recall-tool.d.ts.map +1 -1
  4. package/dist/domains/memory/tools/recall-tool.js +160 -12
  5. package/dist/domains/memory/tools/recall-tool.js.map +1 -1
  6. package/dist/domains/memory/tools/remember-tool.d.ts +10 -0
  7. package/dist/domains/memory/tools/remember-tool.d.ts.map +1 -1
  8. package/dist/domains/memory/tools/remember-tool.js +264 -35
  9. package/dist/domains/memory/tools/remember-tool.js.map +1 -1
  10. package/dist/domains/relation/services/relation-quality-validator.d.ts.map +1 -1
  11. package/dist/domains/relation/services/relation-quality-validator.js +15 -10
  12. package/dist/domains/relation/services/relation-quality-validator.js.map +1 -1
  13. package/dist/domains/relation/services/rule-based-relation-extractor.d.ts.map +1 -1
  14. package/dist/domains/relation/services/rule-based-relation-extractor.js +18 -0
  15. package/dist/domains/relation/services/rule-based-relation-extractor.js.map +1 -1
  16. package/dist/domains/relation/tools/add-relation-tool.d.ts +3 -3
  17. package/dist/domains/relation/tools/add-relation-tool.js +2 -2
  18. package/dist/domains/relation/tools/add-relation-tool.js.map +1 -1
  19. package/dist/domains/relation/tools/get-relations-tool.d.ts +3 -3
  20. package/dist/domains/relation/tools/get-relations-tool.js +2 -2
  21. package/dist/domains/relation/tools/get-relations-tool.js.map +1 -1
  22. package/dist/domains/search/algorithms/hybrid-search-engine.d.ts +20 -0
  23. package/dist/domains/search/algorithms/hybrid-search-engine.d.ts.map +1 -1
  24. package/dist/domains/search/algorithms/hybrid-search-engine.js +168 -5
  25. package/dist/domains/search/algorithms/hybrid-search-engine.js.map +1 -1
  26. package/dist/domains/search/algorithms/search-engine.d.ts.map +1 -1
  27. package/dist/domains/search/algorithms/search-engine.js +37 -17
  28. package/dist/domains/search/algorithms/search-engine.js.map +1 -1
  29. package/dist/domains/search/algorithms/search-ranking.d.ts +15 -2
  30. package/dist/domains/search/algorithms/search-ranking.d.ts.map +1 -1
  31. package/dist/domains/search/algorithms/search-ranking.js +46 -15
  32. package/dist/domains/search/algorithms/search-ranking.js.map +1 -1
  33. package/dist/domains/search/repositories/vector-search.repository.d.ts.map +1 -1
  34. package/dist/domains/search/repositories/vector-search.repository.js +180 -89
  35. package/dist/domains/search/repositories/vector-search.repository.js.map +1 -1
  36. package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.d.ts +63 -0
  37. package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.d.ts.map +1 -0
  38. package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.js +257 -0
  39. package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.js.map +1 -0
  40. package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.sql +66 -0
  41. package/dist/infrastructure/reflexion-worker.d.ts +18 -0
  42. package/dist/infrastructure/reflexion-worker.d.ts.map +1 -1
  43. package/dist/infrastructure/reflexion-worker.js +216 -0
  44. package/dist/infrastructure/reflexion-worker.js.map +1 -1
  45. package/dist/infrastructure/scheduler/batch-scheduler.d.ts +51 -8
  46. package/dist/infrastructure/scheduler/batch-scheduler.d.ts.map +1 -1
  47. package/dist/infrastructure/scheduler/batch-scheduler.js +299 -205
  48. package/dist/infrastructure/scheduler/batch-scheduler.js.map +1 -1
  49. package/dist/infrastructure/scheduler/file-logger.d.ts +82 -0
  50. package/dist/infrastructure/scheduler/file-logger.d.ts.map +1 -0
  51. package/dist/infrastructure/scheduler/file-logger.js +133 -0
  52. package/dist/infrastructure/scheduler/file-logger.js.map +1 -0
  53. package/dist/infrastructure/scheduler/health-checker.d.ts +54 -0
  54. package/dist/infrastructure/scheduler/health-checker.d.ts.map +1 -0
  55. package/dist/infrastructure/scheduler/health-checker.js +96 -0
  56. package/dist/infrastructure/scheduler/health-checker.js.map +1 -0
  57. package/dist/infrastructure/scheduler/job-queue.d.ts +85 -0
  58. package/dist/infrastructure/scheduler/job-queue.d.ts.map +1 -0
  59. package/dist/infrastructure/scheduler/job-queue.js +125 -0
  60. package/dist/infrastructure/scheduler/job-queue.js.map +1 -0
  61. package/dist/infrastructure/scheduler/relation-validator-executor.d.ts +37 -0
  62. package/dist/infrastructure/scheduler/relation-validator-executor.d.ts.map +1 -0
  63. package/dist/infrastructure/scheduler/relation-validator-executor.js +120 -0
  64. package/dist/infrastructure/scheduler/relation-validator-executor.js.map +1 -0
  65. package/dist/infrastructure/scheduler/retry-manager.d.ts +62 -0
  66. package/dist/infrastructure/scheduler/retry-manager.d.ts.map +1 -0
  67. package/dist/infrastructure/scheduler/retry-manager.js +91 -0
  68. package/dist/infrastructure/scheduler/retry-manager.js.map +1 -0
  69. package/dist/npm-client/utils.d.ts.map +1 -1
  70. package/dist/npm-client/utils.js +2 -1
  71. package/dist/npm-client/utils.js.map +1 -1
  72. package/dist/scripts/copy-assets.js +4 -4
  73. package/dist/scripts/copy-assets.js.map +1 -1
  74. package/dist/server/http-server.d.ts.map +1 -1
  75. package/dist/server/http-server.js +15 -17
  76. package/dist/server/http-server.js.map +1 -1
  77. package/dist/services/anchor-manager.d.ts.map +1 -1
  78. package/dist/services/anchor-manager.js.map +1 -1
  79. package/dist/shared/types/index.d.ts +36 -0
  80. package/dist/shared/types/index.d.ts.map +1 -1
  81. package/dist/shared/types/index.js.map +1 -1
  82. package/dist/shared/types/relation.d.ts +1 -1
  83. package/dist/shared/types/relation.d.ts.map +1 -1
  84. package/dist/shared/types/relation.js +7 -4
  85. package/dist/shared/types/relation.js.map +1 -1
  86. package/dist/shared/utils/database.d.ts.map +1 -1
  87. package/dist/shared/utils/database.js +9 -2
  88. package/dist/shared/utils/database.js.map +1 -1
  89. package/dist/shared/utils/procedural-memory-extractor.d.ts +108 -0
  90. package/dist/shared/utils/procedural-memory-extractor.d.ts.map +1 -0
  91. package/dist/shared/utils/procedural-memory-extractor.js +581 -0
  92. package/dist/shared/utils/procedural-memory-extractor.js.map +1 -0
  93. package/dist/shared/utils/relation-type-converter.d.ts +52 -0
  94. package/dist/shared/utils/relation-type-converter.d.ts.map +1 -0
  95. package/dist/shared/utils/relation-type-converter.js +106 -0
  96. package/dist/shared/utils/relation-type-converter.js.map +1 -0
  97. package/dist/shared/utils/type-param-validator.d.ts +31 -0
  98. package/dist/shared/utils/type-param-validator.d.ts.map +1 -1
  99. package/dist/shared/utils/type-param-validator.js +90 -2
  100. package/dist/shared/utils/type-param-validator.js.map +1 -1
  101. package/dist/tools/base-tool.d.ts.map +1 -1
  102. package/dist/tools/types.d.ts +4 -0
  103. package/dist/tools/types.d.ts.map +1 -1
  104. package/dist/tools/types.js +5 -0
  105. package/dist/tools/types.js.map +1 -1
  106. package/dist/workers/consolidation-score-worker.d.ts.map +1 -1
  107. package/dist/workers/consolidation-score-worker.js +0 -2
  108. package/dist/workers/consolidation-score-worker.js.map +1 -1
  109. package/package.json +3 -3
  110. package/scripts/auto-setup.js +1 -1
  111. /package/dist/{database → infrastructure/database/database}/migration/migrations/002-mirix-schema-expansion-core-memory.sql +0 -0
  112. /package/dist/{database → infrastructure/database/database}/migration/migrations/002-mirix-schema-expansion-knowledge-vault.sql +0 -0
  113. /package/dist/{database → infrastructure/database/database}/migration/migrations/002-mirix-schema-expansion-memory-item.sql +0 -0
  114. /package/dist/{database → infrastructure/database/database}/migration/migrations/002-mirix-schema-expansion-schema-version.sql +0 -0
  115. /package/dist/{database → infrastructure/database/database}/migration/migrations/003-consolidation-score-fields.sql +0 -0
  116. /package/dist/{database → infrastructure/database/database}/migration/migrations/005-relation-engine-schema.sql +0 -0
  117. /package/dist/{database → infrastructure/database/database}/migration/migrations/006-fts5-reflection-notes-migration-status.sql +0 -0
  118. /package/dist/{database → infrastructure/database/database}/migration/migrations/006-fts5-reflection-notes.sql +0 -0
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Migration: 007 - Procedural Memory Enhancement
3
+ * Description: Add workflow_name, skill_name, trigger_conditions fields to memory_item table and extend memory_link relation_type enum
4
+ * Version: 7.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
+ * Procedural Memory Enhancement Migration
15
+ *
16
+ * This migration:
17
+ * 1. Adds workflow_name, skill_name, trigger_conditions fields to memory_item table
18
+ * 2. Creates indexes for new fields (workflow_name, skill_name)
19
+ * 3. Extends memory_link relation_type enum to include 'version_of' for version management
20
+ */
21
+ export class ProceduralMemoryEnhancementMigration {
22
+ version = '7.0';
23
+ name = 'procedural-memory-enhancement';
24
+ description = 'Add workflow_name, skill_name, trigger_conditions fields to memory_item table and extend memory_link relation_type enum';
25
+ /**
26
+ * Load SQL file content
27
+ */
28
+ loadSQLFile(filename) {
29
+ const filePath = join(__dirname, filename);
30
+ return readFileSync(filePath, 'utf-8');
31
+ }
32
+ /**
33
+ * Execute SQL script
34
+ * Removes transaction commands (BEGIN TRANSACTION, COMMIT) as MigrationRunner manages transactions
35
+ */
36
+ executeSQL(db, sql) {
37
+ // MigrationRunner가 트랜잭션을 관리하므로 SQL에서 트랜잭션 명령 제거
38
+ let cleanedSQL = sql
39
+ // BEGIN TRANSACTION 제거
40
+ .replace(/BEGIN\s+TRANSACTION\s*;/gi, '')
41
+ // COMMIT 제거
42
+ .replace(/COMMIT\s*;/gi, '')
43
+ // PRAGMA foreign_keys 명령은 유지 (트랜잭션 외부에서도 작동)
44
+ .trim();
45
+ // 빈 줄 제거 및 정리
46
+ cleanedSQL = cleanedSQL
47
+ .split('\n')
48
+ .map(line => line.trim())
49
+ .filter(line => line.length > 0)
50
+ .join('\n');
51
+ if (cleanedSQL.length > 0) {
52
+ db.exec(cleanedSQL);
53
+ }
54
+ }
55
+ /**
56
+ * Check if table exists
57
+ */
58
+ tableExists(db, tableName) {
59
+ const result = db.prepare(`
60
+ SELECT name FROM sqlite_master
61
+ WHERE type='table' AND name=?
62
+ `).get(tableName);
63
+ return !!result;
64
+ }
65
+ /**
66
+ * Check if column exists in table
67
+ */
68
+ columnExists(db, tableName, columnName) {
69
+ const columns = db.prepare(`PRAGMA table_info(${tableName})`).all();
70
+ return columns.some(col => col.name === columnName);
71
+ }
72
+ /**
73
+ * Check if index exists
74
+ */
75
+ indexExists(db, indexName) {
76
+ const result = db.prepare(`
77
+ SELECT name FROM sqlite_master
78
+ WHERE type='index' AND name=?
79
+ `).get(indexName);
80
+ return !!result;
81
+ }
82
+ /**
83
+ * Validate before migration
84
+ */
85
+ async validateBefore(db) {
86
+ // Check if memory_item table exists (required for ALTER TABLE)
87
+ if (!this.tableExists(db, 'memory_item')) {
88
+ throw new Error('memory_item table does not exist. Cannot proceed with migration.');
89
+ }
90
+ // Check if memory_link table exists (required for table recreation)
91
+ if (!this.tableExists(db, 'memory_link')) {
92
+ throw new Error('memory_link table does not exist. Cannot proceed with migration.');
93
+ }
94
+ // Check if migration has already been applied
95
+ if (this.tableExists(db, 'memento_schema_version')) {
96
+ const version = db.prepare(`
97
+ SELECT version FROM memento_schema_version WHERE version = ?
98
+ `).get('7.0');
99
+ if (version) {
100
+ throw new Error('Migration 007 has already been applied. Current schema version: 7.0');
101
+ }
102
+ }
103
+ // Check if new fields already exist (should not exist)
104
+ if (this.columnExists(db, 'memory_item', 'workflow_name')) {
105
+ throw new Error('workflow_name column already exists in memory_item table. Migration may have been partially applied.');
106
+ }
107
+ if (this.columnExists(db, 'memory_item', 'skill_name')) {
108
+ throw new Error('skill_name column already exists in memory_item table. Migration may have been partially applied.');
109
+ }
110
+ if (this.columnExists(db, 'memory_item', 'trigger_conditions')) {
111
+ throw new Error('trigger_conditions column already exists in memory_item table. Migration may have been partially applied.');
112
+ }
113
+ // Check if new indexes already exist (should not exist)
114
+ if (this.indexExists(db, 'idx_memory_item_workflow_name')) {
115
+ throw new Error('idx_memory_item_workflow_name index already exists. Migration may have been partially applied.');
116
+ }
117
+ if (this.indexExists(db, 'idx_memory_item_skill_name')) {
118
+ throw new Error('idx_memory_item_skill_name index already exists. Migration may have been partially applied.');
119
+ }
120
+ // Check if memory_link table has 'version_of' in relation_type enum (should not exist)
121
+ const tableInfo = db.prepare(`
122
+ SELECT sql FROM sqlite_master
123
+ WHERE type='table' AND name='memory_link'
124
+ `).get();
125
+ if (tableInfo && tableInfo.sql.includes("'version_of'")) {
126
+ throw new Error("memory_link table already has 'version_of' in relation_type enum. Migration may have been partially applied.");
127
+ }
128
+ }
129
+ /**
130
+ * Execute migration (Up)
131
+ */
132
+ async up(db) {
133
+ // Load and execute SQL script
134
+ const sqlScript = this.loadSQLFile('007-procedural-memory-enhancement.sql');
135
+ this.executeSQL(db, sqlScript);
136
+ // Note: Schema version is recorded by MigrationRunner, not here
137
+ // MigrationRunner.recordVersion() will be called after successful migration
138
+ }
139
+ /**
140
+ * Rollback migration (Down)
141
+ *
142
+ * Note: SQLite does not support ALTER TABLE DROP COLUMN directly (requires SQLite 3.35.0+).
143
+ * For full rollback, table recreation would be required, which is complex.
144
+ * This implementation provides a basic rollback that removes indexes and attempts to remove columns.
145
+ */
146
+ async down(db) {
147
+ // Drop indexes first
148
+ const indexes = [
149
+ 'idx_memory_item_workflow_name',
150
+ 'idx_memory_item_skill_name'
151
+ ];
152
+ for (const indexName of indexes) {
153
+ db.exec(`DROP INDEX IF EXISTS ${indexName}`);
154
+ }
155
+ // Rollback memory_link table to original enum values
156
+ // This requires table recreation, similar to the up migration
157
+ if (this.tableExists(db, 'memory_link')) {
158
+ // Step 1: Create temporary table with original enum values
159
+ db.exec(`
160
+ CREATE TABLE memory_link_rollback (
161
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
162
+ source_id TEXT NOT NULL,
163
+ target_id TEXT NOT NULL,
164
+ relation_type TEXT CHECK (relation_type IN ('cause_of', 'derived_from', 'duplicates', 'contradicts')) NOT NULL,
165
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
166
+ FOREIGN KEY (source_id) REFERENCES memory_item(id) ON DELETE CASCADE,
167
+ FOREIGN KEY (target_id) REFERENCES memory_item(id) ON DELETE CASCADE,
168
+ UNIQUE(source_id, target_id, relation_type)
169
+ )
170
+ `);
171
+ // Step 2: Copy data (excluding 'version_of' relations)
172
+ db.exec(`
173
+ INSERT INTO memory_link_rollback (id, source_id, target_id, relation_type, created_at)
174
+ SELECT id, source_id, target_id, relation_type, created_at
175
+ FROM memory_link
176
+ WHERE relation_type != 'version_of'
177
+ `);
178
+ // Step 3: Drop old table
179
+ db.exec('DROP TABLE memory_link');
180
+ // Step 4: Rename rollback table
181
+ db.exec('ALTER TABLE memory_link_rollback RENAME TO memory_link');
182
+ // Step 5: Recreate indexes
183
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_link_source ON memory_link(source_id)');
184
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_link_target ON memory_link(target_id)');
185
+ }
186
+ // Note: Removing columns from memory_item requires table recreation, which is complex.
187
+ // For production use, consider using a new migration to remove columns if needed.
188
+ // SQLite 3.35.0+ supports ALTER TABLE DROP COLUMN, but for compatibility, we skip it here.
189
+ // Remove schema version record
190
+ db.prepare('DELETE FROM memento_schema_version WHERE version = ?').run('7.0');
191
+ }
192
+ /**
193
+ * Validate after migration
194
+ */
195
+ async validateAfter(db) {
196
+ // Verify memory_item table has new columns
197
+ if (!this.columnExists(db, 'memory_item', 'workflow_name')) {
198
+ throw new Error('workflow_name column was not added to memory_item table');
199
+ }
200
+ if (!this.columnExists(db, 'memory_item', 'skill_name')) {
201
+ throw new Error('skill_name column was not added to memory_item table');
202
+ }
203
+ if (!this.columnExists(db, 'memory_item', 'trigger_conditions')) {
204
+ throw new Error('trigger_conditions column was not added to memory_item table');
205
+ }
206
+ // Verify indexes were created
207
+ if (!this.indexExists(db, 'idx_memory_item_workflow_name')) {
208
+ throw new Error('idx_memory_item_workflow_name index was not created');
209
+ }
210
+ if (!this.indexExists(db, 'idx_memory_item_skill_name')) {
211
+ throw new Error('idx_memory_item_skill_name index was not created');
212
+ }
213
+ // Verify memory_link table has 'version_of' in relation_type enum
214
+ const tableInfo = db.prepare(`
215
+ SELECT sql FROM sqlite_master
216
+ WHERE type='table' AND name='memory_link'
217
+ `).get();
218
+ if (!tableInfo) {
219
+ throw new Error('memory_link table does not exist after migration');
220
+ }
221
+ if (!tableInfo.sql.includes("'version_of'")) {
222
+ throw new Error("memory_link table does not have 'version_of' in relation_type enum");
223
+ }
224
+ // Verify memory_link table structure (check columns)
225
+ const linkColumns = db.prepare(`PRAGMA table_info(memory_link)`).all();
226
+ const linkColumnNames = linkColumns.map(col => col.name);
227
+ const requiredLinkColumns = [
228
+ 'id',
229
+ 'source_id',
230
+ 'target_id',
231
+ 'relation_type',
232
+ 'created_at'
233
+ ];
234
+ for (const column of requiredLinkColumns) {
235
+ if (!linkColumnNames.includes(column)) {
236
+ throw new Error(`Column ${column} is missing in memory_link table`);
237
+ }
238
+ }
239
+ // Verify memory_link indexes were recreated
240
+ if (!this.indexExists(db, 'idx_memory_link_source')) {
241
+ throw new Error('idx_memory_link_source index was not recreated');
242
+ }
243
+ if (!this.indexExists(db, 'idx_memory_link_target')) {
244
+ throw new Error('idx_memory_link_target index was not recreated');
245
+ }
246
+ // Verify existing dependencies are intact using DependencyValidator
247
+ const dependencyReport = await DependencyValidator.validateAll(db);
248
+ if (!dependencyReport.success) {
249
+ const errors = dependencyReport.results
250
+ .filter(r => !r.success)
251
+ .map(r => `${r.name}: ${r.error}`)
252
+ .join('; ');
253
+ throw new Error(`Dependency validation failed: ${errors}`);
254
+ }
255
+ }
256
+ }
257
+ //# sourceMappingURL=007-procedural-memory-enhancement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"007-procedural-memory-enhancement.js","sourceRoot":"","sources":["../../../../../../src/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,OAAO,oCAAoC;IAC/C,OAAO,GAAG,KAAK,CAAC;IAChB,IAAI,GAAG,+BAA+B,CAAC;IACvC,WAAW,GAAG,yHAAyH,CAAC;IAExI;;OAEG;IACK,WAAW,CAAC,QAAgB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC3C,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACK,UAAU,CAAC,EAAqB,EAAE,GAAW;QACnD,gDAAgD;QAChD,IAAI,UAAU,GAAG,GAAG;YAClB,uBAAuB;aACtB,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;YACzC,YAAY;aACX,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5B,6CAA6C;aAC5C,IAAI,EAAE,CAAC;QAEV,cAAc;QACd,UAAU,GAAG,UAAU;aACpB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aAC/B,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,EAAqB,EAAE,SAAiB;QAC1D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGzB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,EAAqB,EAAE,SAAiB,EAAE,UAAkB;QAC/E,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,SAAS,GAAG,CAAC,CAAC,GAAG,EAA6B,CAAC;QAC/F,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,EAAqB,EAAE,SAAiB;QAC1D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGzB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,EAAqB;QACxC,+DAA+D;QAC/D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;QAED,oEAAoE;QACpE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;QAED,8CAA8C;QAC9C,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;OAE1B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAoC,CAAC;YAEjD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;QAC1H,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACvH,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAC;QAC/H,CAAC;QAED,wDAAwD;QACxD,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,+BAA+B,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;QACpH,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,4BAA4B,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;QACjH,CAAC;QAED,uFAAuF;QACvF,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC,GAAG,EAAiC,CAAC;QAExC,IAAI,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,8GAA8G,CAAC,CAAC;QAClI,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,EAAqB;QAC5B,8BAA8B;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAE/B,gEAAgE;QAChE,4EAA4E;IAC9E,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,CAAC,EAAqB;QAC9B,qBAAqB;QACrB,MAAM,OAAO,GAAG;YACd,+BAA+B;YAC/B,4BAA4B;SAC7B,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,EAAE,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,qDAAqD;QACrD,8DAA8D;QAC9D,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC;YACxC,2DAA2D;YAC3D,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;OAWP,CAAC,CAAC;YAEH,uDAAuD;YACvD,EAAE,CAAC,IAAI,CAAC;;;;;OAKP,CAAC,CAAC;YAEH,yBAAyB;YACzB,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAElC,gCAAgC;YAChC,EAAE,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YAElE,2BAA2B;YAC3B,EAAE,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;YACvF,EAAE,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QACzF,CAAC;QAED,uFAAuF;QACvF,kFAAkF;QAClF,2FAA2F;QAE3F,+BAA+B;QAC/B,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,EAAqB;QACvC,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,+BAA+B,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,4BAA4B,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,kEAAkE;QAClE,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC,GAAG,EAAiC,CAAC;QAExC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QAED,qDAAqD;QACrD,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAGlE,CAAC;QACH,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEzD,MAAM,mBAAmB,GAAG;YAC1B,IAAI;YACJ,WAAW;YACX,WAAW;YACX,eAAe;YACf,YAAY;SACb,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;YACzC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,kCAAkC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,oEAAoE;QACpE,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO;iBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;iBACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;iBACjC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,66 @@
1
+ -- Migration: 007 - Procedural Memory Enhancement
2
+ -- Description: Add workflow_name, skill_name, trigger_conditions fields to memory_item table and extend memory_link relation_type enum
3
+ -- Version: 7.0
4
+ -- Date: 2025-01-XX
5
+ --
6
+ -- This migration:
7
+ -- 1. Adds workflow_name, skill_name, trigger_conditions fields to memory_item table
8
+ -- 2. Creates indexes for new fields (workflow_name, skill_name)
9
+ -- 3. Extends memory_link relation_type enum to include 'version_of' for version management
10
+
11
+ -- ============================================================================
12
+ -- 1. Add new fields to memory_item table
13
+ -- ============================================================================
14
+
15
+ -- Add workflow_name field (TEXT, NULL allowed for backward compatibility)
16
+ ALTER TABLE memory_item ADD COLUMN workflow_name TEXT;
17
+
18
+ -- Add skill_name field (TEXT, NULL allowed for backward compatibility)
19
+ ALTER TABLE memory_item ADD COLUMN skill_name TEXT;
20
+
21
+ -- Add trigger_conditions field (TEXT, NULL allowed, JSON object string)
22
+ ALTER TABLE memory_item ADD COLUMN trigger_conditions TEXT;
23
+
24
+ -- ============================================================================
25
+ -- 2. Create indexes for new fields
26
+ -- ============================================================================
27
+
28
+ -- Index for workflow_name (for search performance)
29
+ CREATE INDEX IF NOT EXISTS idx_memory_item_workflow_name ON memory_item(workflow_name);
30
+
31
+ -- Index for skill_name (for search performance)
32
+ CREATE INDEX IF NOT EXISTS idx_memory_item_skill_name ON memory_item(skill_name);
33
+
34
+ -- ============================================================================
35
+ -- 3. Extend memory_link relation_type enum to include 'version_of'
36
+ -- ============================================================================
37
+ -- Note: SQLite does not support direct modification of CHECK constraints.
38
+ -- We need to recreate the table with the extended enum values.
39
+
40
+ -- Step 3.1: Create new memory_link table with extended relation_type enum
41
+ CREATE TABLE memory_link_new (
42
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
43
+ source_id TEXT NOT NULL,
44
+ target_id TEXT NOT NULL,
45
+ relation_type TEXT CHECK (relation_type IN ('cause_of', 'derived_from', 'duplicates', 'contradicts', 'version_of')) NOT NULL,
46
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
47
+ FOREIGN KEY (source_id) REFERENCES memory_item(id) ON DELETE CASCADE,
48
+ FOREIGN KEY (target_id) REFERENCES memory_item(id) ON DELETE CASCADE,
49
+ UNIQUE(source_id, target_id, relation_type)
50
+ );
51
+
52
+ -- Step 3.2: Copy existing data from old table to new table
53
+ INSERT INTO memory_link_new (id, source_id, target_id, relation_type, created_at)
54
+ SELECT id, source_id, target_id, relation_type, created_at
55
+ FROM memory_link;
56
+
57
+ -- Step 3.3: Drop old table
58
+ DROP TABLE memory_link;
59
+
60
+ -- Step 3.4: Rename new table to original name
61
+ ALTER TABLE memory_link_new RENAME TO memory_link;
62
+
63
+ -- Step 3.5: Recreate indexes (they are automatically dropped when table is dropped)
64
+ CREATE INDEX IF NOT EXISTS idx_memory_link_source ON memory_link(source_id);
65
+ CREATE INDEX IF NOT EXISTS idx_memory_link_target ON memory_link(target_id);
66
+
@@ -94,6 +94,24 @@ export declare class ReflexionWorker {
94
94
  * 작업 목표 추출
95
95
  */
96
96
  private extractTaskGoal;
97
+ /**
98
+ * reflection_notes를 procedural memory로 자동 변환
99
+ *
100
+ * 변환 전략:
101
+ * 1. reflection_notes에서 workflow_name, skill_name, steps, trigger_conditions 추출
102
+ * 2. 기존 procedural memory와 유사도 계산
103
+ * 3. 유사도 기반 병합 전략 결정 (replace, incremental, versioned)
104
+ * 4. 결정된 전략에 따라 메모리 업데이트 또는 생성
105
+ */
106
+ private convertToProceduralMemory;
107
+ /**
108
+ * 기존 procedural memory 업데이트
109
+ */
110
+ private updateProceduralMemory;
111
+ /**
112
+ * 새 procedural memory 생성
113
+ */
114
+ private createProceduralMemory;
97
115
  /**
98
116
  * reflection_notes 파싱
99
117
  */
@@ -1 +1 @@
1
- {"version":3,"file":"reflexion-worker.d.ts","sourceRoot":"","sources":["../../src/infrastructure/reflexion-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC;;GAEG;AACH,UAAU,YAAY;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAK;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IAC1C,OAAO,CAAC,MAAM,CAOZ;IACF,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,mBAAmB,CAA+C;IAC1E,OAAO,CAAC,eAAe,CAAsB;gBAG3C,eAAe,EAAE,eAAe,EAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,CAAC,EAAE,cAAc;IAa7B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IA+B/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IA+B9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;YACW,cAAc;IAuC5B;;;OAGG;YACW,WAAW;IA+IzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA4BrC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoD7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuB5B;;;OAGG;IACH,eAAe,IAAI,IAAI;IAQvB;;;;OAIG;IACG,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IA4C9D;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC7D;;OAEG;IACH,SAAS,IAAI,YAAY;IASzB;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAUzB;;OAEG;IACH,mBAAmB,IAAI;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB;IAiBD;;OAEG;IACH,oBAAoB,IAAI;QACtB,SAAS,EAAE;YACT,eAAe,EAAE,MAAM,CAAC;YACxB,cAAc,EAAE,MAAM,CAAC;YACvB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,kBAAkB,EAAE,MAAM,CAAC;YAC3B,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,SAAS,EAAE;YACT,cAAc,EAAE,MAAM,CAAC;YACvB,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,qBAAqB,EAAE,MAAM,CAAC;YAC9B,SAAS,EAAE,MAAM,CAAC;YAClB,aAAa,EAAE,MAAM,CAAC;YACtB,YAAY,EAAE,MAAM,CAAC;SACtB,CAAC;QACF,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,oBAAoB,EAAE,MAAM,CAAC;SAC9B,CAAC;KACH;CAmBF"}
1
+ {"version":3,"file":"reflexion-worker.d.ts","sourceRoot":"","sources":["../../src/infrastructure/reflexion-worker.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@ import { mergeReflectionNotes, serializeReflectionNotes } from '../shared/utils/
9
9
  import { DatabaseUtils } from '../shared/utils/database.js';
10
10
  import Database from 'better-sqlite3';
11
11
  import { createHash } from 'crypto';
12
+ import { extractProceduralMemory, determineMergeStrategy } from '../shared/utils/procedural-memory-extractor.js';
13
+ import { toDbRelationType } from '../shared/utils/relation-type-converter.js';
12
14
  /**
13
15
  * ReflexionWorker 서비스 클래스
14
16
  */
@@ -268,6 +270,8 @@ export class ReflexionWorker {
268
270
  removed_count: mergeResult.removedCount
269
271
  });
270
272
  }
273
+ // Procedural Memory 자동 변환 (reflection_notes 생성 후)
274
+ await this.convertToProceduralMemory(reflectionNote, event);
271
275
  }
272
276
  else {
273
277
  // task_goal이 없는 경우 새 메모리 생성 (task_goal 없이)
@@ -285,6 +289,8 @@ export class ReflexionWorker {
285
289
  logger.info('새 reflection_notes 생성됨 (task_goal 없음)', {
286
290
  memory_id: memoryId
287
291
  });
292
+ // Procedural Memory 자동 변환 (task_goal 없이도 시도)
293
+ await this.convertToProceduralMemory(reflectionNote, event);
288
294
  }
289
295
  this.status.processedCount++;
290
296
  }
@@ -446,6 +452,216 @@ export class ReflexionWorker {
446
452
  }
447
453
  return undefined;
448
454
  }
455
+ /**
456
+ * reflection_notes를 procedural memory로 자동 변환
457
+ *
458
+ * 변환 전략:
459
+ * 1. reflection_notes에서 workflow_name, skill_name, steps, trigger_conditions 추출
460
+ * 2. 기존 procedural memory와 유사도 계산
461
+ * 3. 유사도 기반 병합 전략 결정 (replace, incremental, versioned)
462
+ * 4. 결정된 전략에 따라 메모리 업데이트 또는 생성
463
+ */
464
+ async convertToProceduralMemory(reflectionNote, event) {
465
+ try {
466
+ // 1. reflection_notes에서 procedural memory 필드 추출
467
+ const extracted = extractProceduralMemory(reflectionNote, event);
468
+ // 추출된 필드가 없으면 변환하지 않음
469
+ if (!extracted.workflow_name && !extracted.skill_name) {
470
+ logger.debug('Procedural Memory 변환 스킵: workflow_name과 skill_name이 모두 없음', {
471
+ event_id: event.id
472
+ });
473
+ return;
474
+ }
475
+ // 2. 유사도 기반 병합 전략 결정
476
+ const mergeStrategy = await determineMergeStrategy(this.db, extracted);
477
+ // 3. 결정된 전략에 따라 메모리 업데이트 또는 생성
478
+ if (mergeStrategy.shouldMerge && mergeStrategy.existingMemoryId) {
479
+ // 기존 메모리 업데이트
480
+ await this.updateProceduralMemory(mergeStrategy.existingMemoryId, extracted, mergeStrategy.updateMode, reflectionNote, event);
481
+ }
482
+ else {
483
+ // 새 메모리 생성
484
+ await this.createProceduralMemory(extracted, reflectionNote, event);
485
+ }
486
+ }
487
+ catch (error) {
488
+ logger.error('Procedural Memory 변환 실패', {
489
+ error: error instanceof Error ? error.message : String(error),
490
+ event_id: event.id
491
+ });
492
+ // 변환 실패는 전체 프로세스를 중단하지 않음 (기존 reflection_notes는 이미 저장됨)
493
+ }
494
+ }
495
+ /**
496
+ * 기존 procedural memory 업데이트
497
+ */
498
+ async updateProceduralMemory(memoryId, extracted, updateMode, reflectionNote, event) {
499
+ try {
500
+ if (updateMode === 'replace') {
501
+ // replace 모드: 기존 메모리를 완전히 교체
502
+ // 단, extracted에서 undefined/null인 필드는 기존 값을 보존 (데이터 손실 방지)
503
+ // COALESCE를 사용하여 새 값이 있으면 사용하고, 없으면 기존 값 유지
504
+ DatabaseUtils.run(this.db, `UPDATE memory_item
505
+ SET workflow_name = COALESCE(?, workflow_name),
506
+ skill_name = COALESCE(?, skill_name),
507
+ trigger_conditions = COALESCE(?, trigger_conditions),
508
+ steps = COALESCE(?, steps),
509
+ task_goal = COALESCE(?, task_goal)
510
+ WHERE id = ?`, [
511
+ extracted.workflow_name || null,
512
+ extracted.skill_name || null,
513
+ extracted.trigger_conditions || null,
514
+ extracted.steps || null,
515
+ extracted.task_goal || null,
516
+ memoryId
517
+ ]);
518
+ logger.info('Procedural Memory 업데이트됨 (replace 모드)', {
519
+ memory_id: memoryId,
520
+ workflow_name: extracted.workflow_name,
521
+ skill_name: extracted.skill_name,
522
+ note: 'undefined/null 필드는 기존 값 보존'
523
+ });
524
+ }
525
+ else if (updateMode === 'incremental') {
526
+ // incremental 모드: steps를 병합
527
+ const existingRecord = DatabaseUtils.get(this.db, `SELECT steps FROM memory_item WHERE id = ?`, [memoryId]);
528
+ // extracted.steps가 있을 때만 병합/업데이트, 없으면 기존 값 보존
529
+ let mergedSteps = null;
530
+ let shouldUpdateSteps = false;
531
+ if (extracted.steps) {
532
+ // extracted.steps가 있으면 병합 또는 새 값 사용
533
+ shouldUpdateSteps = true;
534
+ if (existingRecord?.steps) {
535
+ try {
536
+ const existingSteps = JSON.parse(existingRecord.steps);
537
+ const newSteps = JSON.parse(extracted.steps);
538
+ // 중복 제거 후 병합
539
+ const merged = [...existingSteps];
540
+ for (const step of newSteps) {
541
+ if (!merged.some(s => s.toLowerCase() === step.toLowerCase())) {
542
+ merged.push(step);
543
+ }
544
+ }
545
+ mergedSteps = JSON.stringify(merged);
546
+ }
547
+ catch (error) {
548
+ // JSON 파싱 실패 시 새 steps 사용
549
+ logger.warn('steps 병합 실패, 새 steps 사용', {
550
+ error: error instanceof Error ? error.message : String(error)
551
+ });
552
+ mergedSteps = extracted.steps;
553
+ }
554
+ }
555
+ else {
556
+ // 기존 steps가 없으면 새 steps 사용
557
+ mergedSteps = extracted.steps;
558
+ }
559
+ }
560
+ // extracted.steps가 없으면 shouldUpdateSteps = false로 유지하여 steps 업데이트 안 함
561
+ // steps는 extracted.steps가 있을 때만 업데이트 (데이터 손실 방지)
562
+ DatabaseUtils.run(this.db, `UPDATE memory_item
563
+ SET workflow_name = COALESCE(?, workflow_name),
564
+ skill_name = COALESCE(?, skill_name),
565
+ trigger_conditions = COALESCE(?, trigger_conditions),
566
+ ${shouldUpdateSteps ? 'steps = ?,' : ''}
567
+ task_goal = COALESCE(?, task_goal)
568
+ WHERE id = ?`, shouldUpdateSteps
569
+ ? [
570
+ extracted.workflow_name || null,
571
+ extracted.skill_name || null,
572
+ extracted.trigger_conditions || null,
573
+ mergedSteps,
574
+ extracted.task_goal || null,
575
+ memoryId
576
+ ]
577
+ : [
578
+ extracted.workflow_name || null,
579
+ extracted.skill_name || null,
580
+ extracted.trigger_conditions || null,
581
+ extracted.task_goal || null,
582
+ memoryId
583
+ ]);
584
+ logger.info('Procedural Memory 업데이트됨 (incremental 모드)', {
585
+ memory_id: memoryId,
586
+ workflow_name: extracted.workflow_name,
587
+ skill_name: extracted.skill_name
588
+ });
589
+ }
590
+ else {
591
+ // versioned 모드: 새 메모리 생성하고 version_of 관계 생성
592
+ const newMemoryId = await this.createProceduralMemory(extracted, reflectionNote, event);
593
+ if (newMemoryId) {
594
+ // version_of 관계 생성
595
+ const versionOfType = toDbRelationType('VERSION_OF');
596
+ if (versionOfType) {
597
+ DatabaseUtils.run(this.db, `INSERT INTO memory_link (source_id, target_id, relation_type, created_at)
598
+ VALUES (?, ?, ?, ?)`, [
599
+ newMemoryId,
600
+ memoryId,
601
+ versionOfType,
602
+ new Date().toISOString()
603
+ ]);
604
+ logger.info('Procedural Memory 버전 생성됨 (versioned 모드)', {
605
+ new_memory_id: newMemoryId,
606
+ existing_memory_id: memoryId,
607
+ workflow_name: extracted.workflow_name,
608
+ skill_name: extracted.skill_name
609
+ });
610
+ }
611
+ }
612
+ }
613
+ }
614
+ catch (error) {
615
+ logger.error('Procedural Memory 업데이트 실패', {
616
+ error: error instanceof Error ? error.message : String(error),
617
+ memory_id: memoryId,
618
+ update_mode: updateMode
619
+ });
620
+ throw error;
621
+ }
622
+ }
623
+ /**
624
+ * 새 procedural memory 생성
625
+ */
626
+ async createProceduralMemory(extracted, reflectionNote, event) {
627
+ try {
628
+ const memoryId = `mem_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
629
+ const content = extracted.task_goal || `Reflexion: ${event.tool_name} 실패 기록`;
630
+ const reflectionNotesStr = JSON.stringify(reflectionNote);
631
+ DatabaseUtils.run(this.db, `INSERT INTO memory_item (
632
+ id, type, content, workflow_name, skill_name, trigger_conditions,
633
+ steps, task_goal, reflection_notes, importance, privacy_scope, created_at
634
+ )
635
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
636
+ memoryId,
637
+ 'procedural',
638
+ content,
639
+ extracted.workflow_name || null,
640
+ extracted.skill_name || null,
641
+ extracted.trigger_conditions || null,
642
+ extracted.steps || null,
643
+ extracted.task_goal || null,
644
+ reflectionNotesStr,
645
+ 0.7,
646
+ 'private',
647
+ new Date().toISOString()
648
+ ]);
649
+ logger.info('새 Procedural Memory 생성됨', {
650
+ memory_id: memoryId,
651
+ workflow_name: extracted.workflow_name,
652
+ skill_name: extracted.skill_name
653
+ });
654
+ return memoryId;
655
+ }
656
+ catch (error) {
657
+ logger.error('Procedural Memory 생성 실패', {
658
+ error: error instanceof Error ? error.message : String(error),
659
+ workflow_name: extracted.workflow_name,
660
+ skill_name: extracted.skill_name
661
+ });
662
+ return null;
663
+ }
664
+ }
449
665
  /**
450
666
  * reflection_notes 파싱
451
667
  */