noormme 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -65
- package/dist/cjs/agentic/ActionJournal.js +13 -9
- package/dist/cjs/agentic/CapabilityManager.js +35 -21
- package/dist/cjs/agentic/CognitiveRepository.js +19 -9
- package/dist/cjs/agentic/ContextBuffer.js +24 -12
- package/dist/cjs/agentic/Cortex.js +11 -4
- package/dist/cjs/agentic/EpisodicMemory.js +7 -5
- package/dist/cjs/agentic/PersonaManager.js +16 -8
- package/dist/cjs/agentic/PolicyEnforcer.js +31 -12
- package/dist/cjs/agentic/ResourceMonitor.js +4 -4
- package/dist/cjs/agentic/SessionCompressor.js +22 -14
- package/dist/cjs/agentic/SessionManager.js +36 -18
- package/dist/cjs/agentic/VectorIndexer.js +22 -18
- package/dist/cjs/agentic/improvement/AblationEngine.js +22 -15
- package/dist/cjs/agentic/improvement/ActionRefiner.js +12 -10
- package/dist/cjs/agentic/improvement/ConflictResolver.js +5 -5
- package/dist/cjs/agentic/improvement/CortexJanitor.js +30 -9
- package/dist/cjs/agentic/improvement/CuriosityEngine.js +27 -23
- package/dist/cjs/agentic/improvement/EvolutionRitual.js +4 -4
- package/dist/cjs/agentic/improvement/EvolutionaryPilot.js +16 -6
- package/dist/cjs/agentic/improvement/GoalArchitect.d.ts +2 -2
- package/dist/cjs/agentic/improvement/GoalArchitect.js +20 -18
- package/dist/cjs/agentic/improvement/GovernanceManager.js +19 -11
- package/dist/cjs/agentic/improvement/HiveLink.js +22 -15
- package/dist/cjs/agentic/improvement/KnowledgeDistiller.js +48 -32
- package/dist/cjs/agentic/improvement/RecursiveReasoner.js +40 -17
- package/dist/cjs/agentic/improvement/ReflectionEngine.js +10 -8
- package/dist/cjs/agentic/improvement/RitualOrchestrator.js +28 -22
- package/dist/cjs/agentic/improvement/RuleEngine.js +22 -17
- package/dist/cjs/agentic/improvement/SelfEvolution.js +24 -18
- package/dist/cjs/agentic/improvement/SelfTestRegistry.js +18 -15
- package/dist/cjs/agentic/improvement/SkillSynthesizer.js +42 -27
- package/dist/cjs/agentic/improvement/SovereignMetrics.js +19 -17
- package/dist/cjs/agentic/improvement/StrategicPlanner.js +120 -55
- package/dist/cjs/agentic/telemetry/CognitiveSynthesizer.js +26 -12
- package/dist/cjs/agentic/telemetry/EventHarvester.js +3 -2
- package/dist/cjs/agentic/telemetry/ResearchAlchemist.js +5 -2
- package/dist/cjs/cache/cache-manager.js +7 -4
- package/dist/cjs/cli/commands/analyze.js +5 -4
- package/dist/cjs/cli/commands/generate.js +81 -44
- package/dist/cjs/cli/commands/init.js +7 -3
- package/dist/cjs/cli/commands/inspect.js +139 -36
- package/dist/cjs/cli/commands/migrate.js +5 -4
- package/dist/cjs/cli/commands/optimize.js +4 -4
- package/dist/cjs/cli/commands/status.js +9 -7
- package/dist/cjs/cli/commands/watch.js +7 -6
- package/dist/cjs/cli/index.js +2 -2
- package/dist/cjs/cli/ui/spinner.d.ts +15 -0
- package/dist/cjs/cli/ui/spinner.js +76 -0
- package/dist/cjs/dialect/database-introspector.js +3 -1
- package/dist/cjs/dialect/postgresql/postgresql-driver.js +3 -1
- package/dist/cjs/dialect/postgresql/postgresql-features.js +18 -8
- package/dist/cjs/dialect/postgresql/postgresql-introspector.js +2 -2
- package/dist/cjs/dialect/sqlite/sqlite-auto-indexer.js +47 -33
- package/dist/cjs/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +2 -2
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +15 -12
- package/dist/cjs/edge-runtime/edge-config.js +21 -19
- package/dist/cjs/errors/NoormError.js +22 -20
- package/dist/cjs/helpers/agent-schema.js +2 -0
- package/dist/cjs/helpers/postgresql.js +7 -4
- package/dist/cjs/helpers/schema-evolution.js +31 -6
- package/dist/cjs/index.d.ts +3 -3
- package/dist/cjs/logging/logger.js +8 -4
- package/dist/cjs/migration/data_migrator.js +12 -11
- package/dist/cjs/migration/database_migration_manager.js +17 -13
- package/dist/cjs/migration/schema_differ.js +22 -14
- package/dist/cjs/migration/schema_introspector.js +8 -8
- package/dist/cjs/migration/type_mapper.js +68 -67
- package/dist/cjs/noormme.js +52 -37
- package/dist/cjs/performance/index.js +5 -5
- package/dist/cjs/performance/query-optimizer.js +26 -21
- package/dist/cjs/performance/services/cache-service.js +26 -16
- package/dist/cjs/performance/services/connection-factory.js +28 -23
- package/dist/cjs/performance/services/metrics-collector.js +41 -36
- package/dist/cjs/performance/utils/query-parser.js +15 -16
- package/dist/cjs/relationships/relationship-engine.js +10 -8
- package/dist/cjs/repository/repository-factory.js +97 -38
- package/dist/cjs/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
- package/dist/cjs/schema/core/discovery/relationship-discovery.js +16 -16
- package/dist/cjs/schema/core/discovery/table-metadata-discovery.js +9 -9
- package/dist/cjs/schema/core/discovery/view-discovery.js +5 -4
- package/dist/cjs/schema/core/factories/discovery-factory.js +4 -4
- package/dist/cjs/schema/core/utils/name-generator.js +14 -5
- package/dist/cjs/schema/core/utils/type-mapper.js +24 -24
- package/dist/cjs/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
- package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
- package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
- package/dist/cjs/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
- package/dist/cjs/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
- package/dist/cjs/schema/test/basic-schema-test.js +11 -9
- package/dist/cjs/schema/test/dialect-capabilities.test.js +6 -6
- package/dist/cjs/schema/test/discovery-factory.test.js +2 -2
- package/dist/cjs/schema/test/error-handling.test.js +8 -6
- package/dist/cjs/schema/test/integration.test.js +24 -18
- package/dist/cjs/schema/test/schema-discovery-coordinator.test.js +9 -9
- package/dist/cjs/schema/test/simple-schema-test.js +9 -9
- package/dist/cjs/schema/test/sqlite-discovery-coordinator.test.js +64 -48
- package/dist/cjs/schema/test/test-runner.js +3 -3
- package/dist/cjs/sqlite-migration/index.d.ts +2 -2
- package/dist/cjs/sqlite-migration/sqlite-migration-manager.js +21 -17
- package/dist/cjs/sqlite-migration/sqlite-migration-provider.js +38 -34
- package/dist/cjs/testing/test-utils.js +36 -34
- package/dist/cjs/types/index.d.ts +5 -2
- package/dist/cjs/types/index.js +6 -3
- package/dist/cjs/types/type-generator.js +46 -42
- package/dist/cjs/util/safe-sql-helpers.js +1 -1
- package/dist/cjs/util/security-validator.js +20 -9
- package/dist/cjs/utils/errorHelpers.js +20 -10
- package/dist/cjs/watch/schema-watcher.js +22 -23
- package/dist/esm/agentic/ActionJournal.js +13 -9
- package/dist/esm/agentic/CapabilityManager.js +35 -21
- package/dist/esm/agentic/CognitiveRepository.js +19 -9
- package/dist/esm/agentic/ContextBuffer.js +24 -12
- package/dist/esm/agentic/Cortex.js +11 -4
- package/dist/esm/agentic/EpisodicMemory.js +7 -5
- package/dist/esm/agentic/PersonaManager.js +16 -8
- package/dist/esm/agentic/PolicyEnforcer.js +31 -12
- package/dist/esm/agentic/ResourceMonitor.js +4 -4
- package/dist/esm/agentic/SessionCompressor.js +22 -14
- package/dist/esm/agentic/SessionManager.js +36 -18
- package/dist/esm/agentic/VectorIndexer.js +22 -18
- package/dist/esm/agentic/improvement/AblationEngine.js +22 -15
- package/dist/esm/agentic/improvement/ActionRefiner.js +12 -10
- package/dist/esm/agentic/improvement/ConflictResolver.js +5 -5
- package/dist/esm/agentic/improvement/CortexJanitor.js +30 -9
- package/dist/esm/agentic/improvement/CuriosityEngine.js +27 -23
- package/dist/esm/agentic/improvement/EvolutionRitual.js +4 -4
- package/dist/esm/agentic/improvement/EvolutionaryPilot.js +16 -6
- package/dist/esm/agentic/improvement/GoalArchitect.d.ts +2 -2
- package/dist/esm/agentic/improvement/GoalArchitect.js +20 -18
- package/dist/esm/agentic/improvement/GovernanceManager.js +19 -11
- package/dist/esm/agentic/improvement/HiveLink.js +22 -15
- package/dist/esm/agentic/improvement/KnowledgeDistiller.js +48 -32
- package/dist/esm/agentic/improvement/RecursiveReasoner.js +40 -17
- package/dist/esm/agentic/improvement/ReflectionEngine.js +10 -8
- package/dist/esm/agentic/improvement/RitualOrchestrator.js +28 -22
- package/dist/esm/agentic/improvement/RuleEngine.js +22 -17
- package/dist/esm/agentic/improvement/SelfEvolution.js +24 -18
- package/dist/esm/agentic/improvement/SelfTestRegistry.js +18 -15
- package/dist/esm/agentic/improvement/SkillSynthesizer.js +42 -27
- package/dist/esm/agentic/improvement/SovereignMetrics.js +19 -17
- package/dist/esm/agentic/improvement/StrategicPlanner.js +120 -55
- package/dist/esm/agentic/telemetry/CognitiveSynthesizer.js +26 -12
- package/dist/esm/agentic/telemetry/EventHarvester.js +3 -2
- package/dist/esm/agentic/telemetry/ResearchAlchemist.js +5 -2
- package/dist/esm/cache/cache-manager.js +7 -4
- package/dist/esm/cli/commands/analyze.js +5 -4
- package/dist/esm/cli/commands/generate.js +82 -45
- package/dist/esm/cli/commands/init.js +8 -4
- package/dist/esm/cli/commands/inspect.js +140 -37
- package/dist/esm/cli/commands/migrate.js +5 -4
- package/dist/esm/cli/commands/optimize.js +4 -4
- package/dist/esm/cli/commands/status.js +9 -7
- package/dist/esm/cli/commands/watch.js +7 -6
- package/dist/esm/cli/index.js +2 -2
- package/dist/esm/cli/ui/spinner.d.ts +15 -0
- package/dist/esm/cli/ui/spinner.js +70 -0
- package/dist/esm/dialect/database-introspector.js +3 -1
- package/dist/esm/dialect/postgresql/postgresql-driver.js +3 -1
- package/dist/esm/dialect/postgresql/postgresql-features.js +18 -8
- package/dist/esm/dialect/postgresql/postgresql-introspector.js +2 -2
- package/dist/esm/dialect/sqlite/sqlite-auto-indexer.js +47 -33
- package/dist/esm/dialect/sqlite/sqlite-auto-optimizer.js +8 -7
- package/dist/esm/dialect/sqlite/sqlite-driver.js +2 -2
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +15 -12
- package/dist/esm/dynamic/dynamic.js +1 -1
- package/dist/esm/edge-runtime/edge-config.js +21 -19
- package/dist/esm/errors/NoormError.js +22 -20
- package/dist/esm/helpers/agent-schema.js +2 -0
- package/dist/esm/helpers/postgresql.js +7 -4
- package/dist/esm/helpers/schema-evolution.js +31 -6
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +2 -2
- package/dist/esm/logging/logger.js +8 -4
- package/dist/esm/migration/data_migrator.js +12 -11
- package/dist/esm/migration/database_migration_manager.js +18 -14
- package/dist/esm/migration/schema_differ.js +22 -14
- package/dist/esm/migration/schema_introspector.js +8 -8
- package/dist/esm/migration/type_mapper.js +68 -67
- package/dist/esm/noormme.js +52 -37
- package/dist/esm/performance/index.js +5 -5
- package/dist/esm/performance/query-optimizer.js +26 -21
- package/dist/esm/performance/services/cache-service.js +26 -16
- package/dist/esm/performance/services/connection-factory.js +28 -23
- package/dist/esm/performance/services/metrics-collector.js +41 -36
- package/dist/esm/performance/utils/query-parser.js +15 -16
- package/dist/esm/raw-builder/sql.js +1 -1
- package/dist/esm/relationships/relationship-engine.js +10 -8
- package/dist/esm/repository/repository-factory.js +98 -39
- package/dist/esm/schema/builders/alter-table-add-index-builder.js +1 -1
- package/dist/esm/schema/builders/create-index-builder.js +2 -2
- package/dist/esm/schema/core/coordinators/schema-discovery.coordinator.js +1 -3
- package/dist/esm/schema/core/discovery/relationship-discovery.js +16 -16
- package/dist/esm/schema/core/discovery/table-metadata-discovery.js +9 -9
- package/dist/esm/schema/core/discovery/view-discovery.js +5 -4
- package/dist/esm/schema/core/factories/discovery-factory.js +4 -4
- package/dist/esm/schema/core/utils/name-generator.js +14 -5
- package/dist/esm/schema/core/utils/type-mapper.js +24 -24
- package/dist/esm/schema/dialects/postgresql/postgresql-discovery.coordinator.js +8 -7
- package/dist/esm/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +17 -15
- package/dist/esm/schema/dialects/sqlite/discovery/sqlite-index-discovery.js +8 -8
- package/dist/esm/schema/dialects/sqlite/introspection/sqlite-schema-introspector.js +6 -11
- package/dist/esm/schema/dialects/sqlite/sqlite-discovery.coordinator.js +14 -13
- package/dist/esm/schema/test/basic-schema-test.js +11 -9
- package/dist/esm/schema/test/dialect-capabilities.test.js +6 -6
- package/dist/esm/schema/test/discovery-factory.test.js +2 -2
- package/dist/esm/schema/test/error-handling.test.js +8 -6
- package/dist/esm/schema/test/integration.test.js +24 -18
- package/dist/esm/schema/test/schema-discovery-coordinator.test.js +9 -9
- package/dist/esm/schema/test/simple-schema-test.js +9 -9
- package/dist/esm/schema/test/sqlite-discovery-coordinator.test.js +64 -48
- package/dist/esm/schema/test/test-runner.js +3 -3
- package/dist/esm/sqlite-migration/index.d.ts +2 -2
- package/dist/esm/sqlite-migration/sqlite-migration-manager.js +21 -17
- package/dist/esm/sqlite-migration/sqlite-migration-provider.js +38 -34
- package/dist/esm/testing/test-utils.js +36 -34
- package/dist/esm/types/index.d.ts +5 -2
- package/dist/esm/types/index.js +6 -3
- package/dist/esm/types/type-generator.js +46 -42
- package/dist/esm/util/safe-sql-helpers.js +1 -1
- package/dist/esm/util/security-validator.js +20 -9
- package/dist/esm/utils/errorHelpers.js +21 -11
- package/dist/esm/watch/schema-watcher.js +22 -23
- package/package.json +40 -44
|
@@ -28,10 +28,12 @@ class PersonaManager {
|
|
|
28
28
|
const values = {
|
|
29
29
|
name,
|
|
30
30
|
role: options.role || null,
|
|
31
|
-
capabilities: options.capabilities
|
|
31
|
+
capabilities: options.capabilities
|
|
32
|
+
? JSON.stringify(options.capabilities)
|
|
33
|
+
: null,
|
|
32
34
|
policies: options.policies ? JSON.stringify(options.policies) : null,
|
|
33
35
|
metadata: options.metadata ? JSON.stringify(options.metadata) : null,
|
|
34
|
-
updated_at: new Date()
|
|
36
|
+
updated_at: new Date(),
|
|
35
37
|
};
|
|
36
38
|
if (existing) {
|
|
37
39
|
const updated = await this.typedDb
|
|
@@ -46,7 +48,7 @@ class PersonaManager {
|
|
|
46
48
|
.insertInto(this.personasTable)
|
|
47
49
|
.values({
|
|
48
50
|
...values,
|
|
49
|
-
created_at: new Date()
|
|
51
|
+
created_at: new Date(),
|
|
50
52
|
})
|
|
51
53
|
.returningAll()
|
|
52
54
|
.executeTakeFirstOrThrow();
|
|
@@ -82,18 +84,24 @@ class PersonaManager {
|
|
|
82
84
|
.selectAll()
|
|
83
85
|
.orderBy('name', 'asc')
|
|
84
86
|
.execute();
|
|
85
|
-
return list.map(p => this.parsePersona(p));
|
|
87
|
+
return list.map((p) => this.parsePersona(p));
|
|
86
88
|
}
|
|
87
89
|
parsePersona(p) {
|
|
88
90
|
return {
|
|
89
91
|
id: p.id,
|
|
90
92
|
name: p.name,
|
|
91
93
|
role: p.role || undefined,
|
|
92
|
-
capabilities: typeof p.capabilities === 'string'
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
capabilities: typeof p.capabilities === 'string'
|
|
95
|
+
? JSON.parse(p.capabilities)
|
|
96
|
+
: p.capabilities || [],
|
|
97
|
+
policies: typeof p.policies === 'string'
|
|
98
|
+
? JSON.parse(p.policies)
|
|
99
|
+
: p.policies || [],
|
|
100
|
+
metadata: typeof p.metadata === 'string'
|
|
101
|
+
? JSON.parse(p.metadata)
|
|
102
|
+
: p.metadata || {},
|
|
95
103
|
createdAt: new Date(p.created_at),
|
|
96
|
-
updatedAt: new Date(p.updated_at)
|
|
104
|
+
updatedAt: new Date(p.updated_at),
|
|
97
105
|
};
|
|
98
106
|
}
|
|
99
107
|
}
|
|
@@ -36,7 +36,7 @@ class PolicyEnforcer {
|
|
|
36
36
|
type,
|
|
37
37
|
definition: JSON.stringify(definition),
|
|
38
38
|
is_enabled: isEnabled,
|
|
39
|
-
updated_at: new Date()
|
|
39
|
+
updated_at: new Date(),
|
|
40
40
|
})
|
|
41
41
|
.where('id', '=', existing.id)
|
|
42
42
|
.returningAll()
|
|
@@ -51,7 +51,7 @@ class PolicyEnforcer {
|
|
|
51
51
|
definition: JSON.stringify(definition),
|
|
52
52
|
is_enabled: isEnabled,
|
|
53
53
|
created_at: new Date(),
|
|
54
|
-
updated_at: new Date()
|
|
54
|
+
updated_at: new Date(),
|
|
55
55
|
})
|
|
56
56
|
.returningAll()
|
|
57
57
|
.executeTakeFirstOrThrow();
|
|
@@ -75,20 +75,32 @@ class PolicyEnforcer {
|
|
|
75
75
|
// 1. Threshold Check (Numeric)
|
|
76
76
|
if (typeof value === 'number') {
|
|
77
77
|
if (def.max !== undefined && value > def.max) {
|
|
78
|
-
return {
|
|
78
|
+
return {
|
|
79
|
+
allowed: false,
|
|
80
|
+
reason: `Value ${value} exceeds max ${def.max} for policy '${name}'`,
|
|
81
|
+
};
|
|
79
82
|
}
|
|
80
83
|
if (def.min !== undefined && value < def.min) {
|
|
81
|
-
return {
|
|
84
|
+
return {
|
|
85
|
+
allowed: false,
|
|
86
|
+
reason: `Value ${value} below min ${def.min} for policy '${name}'`,
|
|
87
|
+
};
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
90
|
// 2. Pattern Check (String/Regex)
|
|
85
91
|
if (typeof value === 'string' && def.pattern) {
|
|
86
92
|
const regex = new RegExp(def.pattern, 'i');
|
|
87
93
|
if (def.mustMatch && !regex.test(value)) {
|
|
88
|
-
return {
|
|
94
|
+
return {
|
|
95
|
+
allowed: false,
|
|
96
|
+
reason: `Value does not match required pattern for policy '${name}'`,
|
|
97
|
+
};
|
|
89
98
|
}
|
|
90
99
|
if (!def.mustMatch && regex.test(value)) {
|
|
91
|
-
return {
|
|
100
|
+
return {
|
|
101
|
+
allowed: false,
|
|
102
|
+
reason: `Value contains forbidden pattern for policy '${name}'`,
|
|
103
|
+
};
|
|
92
104
|
}
|
|
93
105
|
}
|
|
94
106
|
// 3. Budget Check (Cumulative)
|
|
@@ -97,7 +109,10 @@ class PolicyEnforcer {
|
|
|
97
109
|
const limit = def.limit || 0;
|
|
98
110
|
const total = await this.getCumulativeMetric(def.metricName, period);
|
|
99
111
|
if (total + (typeof value === 'number' ? value : 0) > limit) {
|
|
100
|
-
return {
|
|
112
|
+
return {
|
|
113
|
+
allowed: false,
|
|
114
|
+
reason: `Cumulative budget for '${def.metricName}' exceeded (${total.toFixed(4)} / ${limit})`,
|
|
115
|
+
};
|
|
101
116
|
}
|
|
102
117
|
}
|
|
103
118
|
return { allowed: true };
|
|
@@ -124,7 +139,7 @@ class PolicyEnforcer {
|
|
|
124
139
|
}
|
|
125
140
|
return {
|
|
126
141
|
allowed: violations.length === 0,
|
|
127
|
-
violations
|
|
142
|
+
violations,
|
|
128
143
|
};
|
|
129
144
|
}
|
|
130
145
|
/**
|
|
@@ -136,7 +151,7 @@ class PolicyEnforcer {
|
|
|
136
151
|
.selectAll()
|
|
137
152
|
.where('is_enabled', '=', true)
|
|
138
153
|
.execute();
|
|
139
|
-
return list.map(p => this.parsePolicy(p));
|
|
154
|
+
return list.map((p) => this.parsePolicy(p));
|
|
140
155
|
}
|
|
141
156
|
async getCumulativeMetric(metricName, period) {
|
|
142
157
|
let cutoff = new Date(0); // beginning of time
|
|
@@ -160,11 +175,15 @@ class PolicyEnforcer {
|
|
|
160
175
|
id: p.id,
|
|
161
176
|
name: p.name,
|
|
162
177
|
type: p.type,
|
|
163
|
-
definition: typeof p.definition === 'string'
|
|
178
|
+
definition: typeof p.definition === 'string'
|
|
179
|
+
? JSON.parse(p.definition)
|
|
180
|
+
: p.definition,
|
|
164
181
|
isEnabled: !!p.is_enabled,
|
|
165
|
-
metadata: typeof p.metadata === 'string'
|
|
182
|
+
metadata: typeof p.metadata === 'string'
|
|
183
|
+
? JSON.parse(p.metadata)
|
|
184
|
+
: p.metadata || {},
|
|
166
185
|
createdAt: new Date(p.created_at),
|
|
167
|
-
updatedAt: new Date(p.updated_at)
|
|
186
|
+
updatedAt: new Date(p.updated_at),
|
|
168
187
|
};
|
|
169
188
|
}
|
|
170
189
|
}
|
|
@@ -32,7 +32,7 @@ class ResourceMonitor {
|
|
|
32
32
|
cost: cost || 0,
|
|
33
33
|
currency: 'USD',
|
|
34
34
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
35
|
-
created_at: new Date()
|
|
35
|
+
created_at: new Date(),
|
|
36
36
|
})
|
|
37
37
|
.returningAll()
|
|
38
38
|
.executeTakeFirstOrThrow();
|
|
@@ -68,14 +68,14 @@ class ResourceMonitor {
|
|
|
68
68
|
.select([
|
|
69
69
|
'model_name',
|
|
70
70
|
(eb) => eb.fn.sum((0, sql_js_1.sql) `input_tokens + output_tokens`).as('totalTokens'),
|
|
71
|
-
(eb) => eb.fn.sum('cost').as('totalCost')
|
|
71
|
+
(eb) => eb.fn.sum('cost').as('totalCost'),
|
|
72
72
|
])
|
|
73
73
|
.groupBy('model_name')
|
|
74
74
|
.execute();
|
|
75
75
|
return results.map((r) => ({
|
|
76
76
|
modelName: r.model_name,
|
|
77
77
|
totalTokens: Number(r.totalTokens),
|
|
78
|
-
totalCost: Number(r.totalCost)
|
|
78
|
+
totalCost: Number(r.totalCost),
|
|
79
79
|
}));
|
|
80
80
|
}
|
|
81
81
|
parseUsage(usage) {
|
|
@@ -88,7 +88,7 @@ class ResourceMonitor {
|
|
|
88
88
|
outputTokens: usage.output_tokens,
|
|
89
89
|
cost: usage.cost,
|
|
90
90
|
currency: usage.currency,
|
|
91
|
-
createdAt: new Date(usage.created_at)
|
|
91
|
+
createdAt: new Date(usage.created_at),
|
|
92
92
|
};
|
|
93
93
|
}
|
|
94
94
|
}
|
|
@@ -19,7 +19,7 @@ class SessionCompressor {
|
|
|
19
19
|
*/
|
|
20
20
|
async compress(sessionId, summary, startMessageId, endMessageId, anchors = [], metadata) {
|
|
21
21
|
console.log(`[SessionCompressor] Compressing session ${sessionId} with ${anchors.length} semantic anchors.`);
|
|
22
|
-
const epoch = await this.db
|
|
22
|
+
const epoch = (await this.db
|
|
23
23
|
.insertInto(this.epochsTable)
|
|
24
24
|
.values({
|
|
25
25
|
session_id: sessionId,
|
|
@@ -29,10 +29,10 @@ class SessionCompressor {
|
|
|
29
29
|
metadata: metadata || anchors.length > 0
|
|
30
30
|
? JSON.stringify({ ...metadata, anchors })
|
|
31
31
|
: null,
|
|
32
|
-
created_at: new Date()
|
|
32
|
+
created_at: new Date(),
|
|
33
33
|
})
|
|
34
34
|
.returningAll()
|
|
35
|
-
.executeTakeFirstOrThrow();
|
|
35
|
+
.executeTakeFirstOrThrow());
|
|
36
36
|
return this.parseEpoch(epoch);
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
@@ -51,8 +51,8 @@ class SessionCompressor {
|
|
|
51
51
|
eb('metadata', 'is', null),
|
|
52
52
|
eb.and([
|
|
53
53
|
eb('metadata', 'not like', '%"anchor":true%'),
|
|
54
|
-
eb('metadata', 'not like', '%"anchor": true%')
|
|
55
|
-
])
|
|
54
|
+
eb('metadata', 'not like', '%"anchor": true%'),
|
|
55
|
+
]),
|
|
56
56
|
]));
|
|
57
57
|
}
|
|
58
58
|
const result = await query.execute();
|
|
@@ -70,11 +70,15 @@ class SessionCompressor {
|
|
|
70
70
|
if (epochs.length > 10) {
|
|
71
71
|
console.log(`[SessionCompressor] Consolidating ${epochs.length} epochs into a new Era for session ${sessionId}`);
|
|
72
72
|
const summary = `Consolidated era summary of ${epochs.length} epochs: ` +
|
|
73
|
-
epochs
|
|
73
|
+
epochs
|
|
74
|
+
.slice(0, 5)
|
|
75
|
+
.map((e) => e.summary)
|
|
76
|
+
.join('; ') +
|
|
77
|
+
'...';
|
|
74
78
|
const eraMetadata = {
|
|
75
79
|
type: 'era',
|
|
76
80
|
original_epochs: epochs.length,
|
|
77
|
-
consolidated_at: new Date().toISOString()
|
|
81
|
+
consolidated_at: new Date().toISOString(),
|
|
78
82
|
};
|
|
79
83
|
// In this version, we mark the new epoch as an "Era" in metadata
|
|
80
84
|
const consolidatedEpoch = await this.compress(sessionId, summary, epochs[0].startMessageId, epochs[epochs.length - 1].endMessageId, [], eraMetadata);
|
|
@@ -87,12 +91,16 @@ class SessionCompressor {
|
|
|
87
91
|
session_id: sessionId,
|
|
88
92
|
role: 'system',
|
|
89
93
|
content: `[ERA SUMMARY] This era covers the initial phases of the session. Key takeaways: ${summary}`,
|
|
90
|
-
metadata: JSON.stringify({
|
|
91
|
-
|
|
94
|
+
metadata: JSON.stringify({
|
|
95
|
+
anchor: true,
|
|
96
|
+
type: 'era_reification',
|
|
97
|
+
epoch_id: consolidatedEpoch.id,
|
|
98
|
+
}),
|
|
99
|
+
created_at: new Date(),
|
|
92
100
|
})
|
|
93
101
|
.execute();
|
|
94
102
|
// Prune old epochs that were consolidated
|
|
95
|
-
const epochIds = epochs.map(e => e.id);
|
|
103
|
+
const epochIds = epochs.map((e) => e.id);
|
|
96
104
|
await this.db
|
|
97
105
|
.deleteFrom(this.epochsTable)
|
|
98
106
|
.where('id', 'in', epochIds)
|
|
@@ -103,13 +111,13 @@ class SessionCompressor {
|
|
|
103
111
|
* Get epochs for a session
|
|
104
112
|
*/
|
|
105
113
|
async getEpochs(sessionId) {
|
|
106
|
-
const list = await this.db
|
|
114
|
+
const list = (await this.db
|
|
107
115
|
.selectFrom(this.epochsTable)
|
|
108
116
|
.selectAll()
|
|
109
117
|
.where('session_id', '=', sessionId)
|
|
110
118
|
.orderBy('created_at', 'asc')
|
|
111
|
-
.execute();
|
|
112
|
-
return list.map(e => this.parseEpoch(e));
|
|
119
|
+
.execute());
|
|
120
|
+
return list.map((e) => this.parseEpoch(e));
|
|
113
121
|
}
|
|
114
122
|
parseEpoch(e) {
|
|
115
123
|
return {
|
|
@@ -118,7 +126,7 @@ class SessionCompressor {
|
|
|
118
126
|
startMessageId: e.start_message_id,
|
|
119
127
|
endMessageId: e.end_message_id,
|
|
120
128
|
metadata: typeof e.metadata === 'string' ? JSON.parse(e.metadata) : e.metadata,
|
|
121
|
-
createdAt: new Date(e.created_at)
|
|
129
|
+
createdAt: new Date(e.created_at),
|
|
122
130
|
};
|
|
123
131
|
}
|
|
124
132
|
}
|
|
@@ -36,7 +36,7 @@ class SessionManager {
|
|
|
36
36
|
status: 'active',
|
|
37
37
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
38
38
|
created_at: new Date(),
|
|
39
|
-
updated_at: new Date()
|
|
39
|
+
updated_at: new Date(),
|
|
40
40
|
})
|
|
41
41
|
.returningAll()
|
|
42
42
|
.executeTakeFirstOrThrow();
|
|
@@ -71,11 +71,23 @@ class SessionManager {
|
|
|
71
71
|
async deleteSession(id) {
|
|
72
72
|
await this.db.transaction().execute(async (trx) => {
|
|
73
73
|
// Delete associated data first
|
|
74
|
-
await trx
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
await trx
|
|
75
|
+
.deleteFrom(this.messagesTable)
|
|
76
|
+
.where('session_id', '=', id)
|
|
77
|
+
.execute();
|
|
78
|
+
await trx
|
|
79
|
+
.deleteFrom(this.goalsTable)
|
|
80
|
+
.where('session_id', '=', id)
|
|
81
|
+
.execute();
|
|
82
|
+
await trx
|
|
83
|
+
.deleteFrom(this.memoriesTable)
|
|
84
|
+
.where('session_id', '=', id)
|
|
85
|
+
.execute();
|
|
77
86
|
// Delete the session itself
|
|
78
|
-
await trx
|
|
87
|
+
await trx
|
|
88
|
+
.deleteFrom(this.sessionsTable)
|
|
89
|
+
.where('id', '=', id)
|
|
90
|
+
.execute();
|
|
79
91
|
});
|
|
80
92
|
}
|
|
81
93
|
/**
|
|
@@ -90,7 +102,7 @@ class SessionManager {
|
|
|
90
102
|
role,
|
|
91
103
|
content,
|
|
92
104
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
93
|
-
created_at: new Date()
|
|
105
|
+
created_at: new Date(),
|
|
94
106
|
})
|
|
95
107
|
.returningAll()
|
|
96
108
|
.executeTakeFirstOrThrow();
|
|
@@ -114,7 +126,7 @@ class SessionManager {
|
|
|
114
126
|
.orderBy('created_at', 'asc')
|
|
115
127
|
.limit(limit)
|
|
116
128
|
.execute();
|
|
117
|
-
return messages.map(m => this.parseMessage(m));
|
|
129
|
+
return messages.map((m) => this.parseMessage(m));
|
|
118
130
|
}
|
|
119
131
|
/**
|
|
120
132
|
* Set or update a goal for a session
|
|
@@ -135,7 +147,7 @@ class SessionManager {
|
|
|
135
147
|
status,
|
|
136
148
|
priority,
|
|
137
149
|
metadata: metadata ? JSON.stringify(metadata) : existing.metadata,
|
|
138
|
-
updated_at: new Date()
|
|
150
|
+
updated_at: new Date(),
|
|
139
151
|
})
|
|
140
152
|
.where('id', '=', existing.id)
|
|
141
153
|
.returningAll()
|
|
@@ -152,7 +164,7 @@ class SessionManager {
|
|
|
152
164
|
priority,
|
|
153
165
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
154
166
|
created_at: new Date(),
|
|
155
|
-
updated_at: new Date()
|
|
167
|
+
updated_at: new Date(),
|
|
156
168
|
})
|
|
157
169
|
.returningAll()
|
|
158
170
|
.executeTakeFirstOrThrow();
|
|
@@ -177,7 +189,7 @@ class SessionManager {
|
|
|
177
189
|
query = query.where('status', '=', status);
|
|
178
190
|
}
|
|
179
191
|
const goals = await query.execute();
|
|
180
|
-
return goals.map(g => this.parseGoal(g));
|
|
192
|
+
return goals.map((g) => this.parseGoal(g));
|
|
181
193
|
}
|
|
182
194
|
/**
|
|
183
195
|
* Clear message history for a session.
|
|
@@ -200,12 +212,12 @@ class SessionManager {
|
|
|
200
212
|
.executeTakeFirstOrThrow();
|
|
201
213
|
const metadata = typeof message.metadata === 'string'
|
|
202
214
|
? JSON.parse(message.metadata)
|
|
203
|
-
:
|
|
215
|
+
: message.metadata || {};
|
|
204
216
|
const updatedMetadata = { ...metadata, anchor: true };
|
|
205
217
|
const updated = await this.typedDb
|
|
206
218
|
.updateTable(this.messagesTable)
|
|
207
219
|
.set({
|
|
208
|
-
metadata: JSON.stringify(updatedMetadata)
|
|
220
|
+
metadata: JSON.stringify(updatedMetadata),
|
|
209
221
|
})
|
|
210
222
|
.where('id', '=', messageId)
|
|
211
223
|
.returningAll()
|
|
@@ -217,9 +229,11 @@ class SessionManager {
|
|
|
217
229
|
id: session.id,
|
|
218
230
|
name: session.name,
|
|
219
231
|
status: session.status,
|
|
220
|
-
metadata: typeof session.metadata === 'string'
|
|
232
|
+
metadata: typeof session.metadata === 'string'
|
|
233
|
+
? JSON.parse(session.metadata)
|
|
234
|
+
: session.metadata || {},
|
|
221
235
|
createdAt: new Date(session.created_at),
|
|
222
|
-
updatedAt: new Date(session.updated_at)
|
|
236
|
+
updatedAt: new Date(session.updated_at),
|
|
223
237
|
};
|
|
224
238
|
}
|
|
225
239
|
parseMessage(message) {
|
|
@@ -228,8 +242,10 @@ class SessionManager {
|
|
|
228
242
|
sessionId: message.session_id,
|
|
229
243
|
role: message.role,
|
|
230
244
|
content: message.content,
|
|
231
|
-
metadata: typeof message.metadata === 'string'
|
|
232
|
-
|
|
245
|
+
metadata: typeof message.metadata === 'string'
|
|
246
|
+
? JSON.parse(message.metadata)
|
|
247
|
+
: message.metadata || {},
|
|
248
|
+
createdAt: new Date(message.created_at),
|
|
233
249
|
};
|
|
234
250
|
}
|
|
235
251
|
parseGoal(goal) {
|
|
@@ -240,9 +256,11 @@ class SessionManager {
|
|
|
240
256
|
description: goal.description,
|
|
241
257
|
status: goal.status,
|
|
242
258
|
priority: goal.priority,
|
|
243
|
-
metadata: typeof goal.metadata === 'string'
|
|
259
|
+
metadata: typeof goal.metadata === 'string'
|
|
260
|
+
? JSON.parse(goal.metadata)
|
|
261
|
+
: goal.metadata || {},
|
|
244
262
|
createdAt: new Date(goal.created_at),
|
|
245
|
-
updatedAt: new Date(goal.updated_at)
|
|
263
|
+
updatedAt: new Date(goal.updated_at),
|
|
246
264
|
};
|
|
247
265
|
}
|
|
248
266
|
}
|
|
@@ -28,7 +28,7 @@ class VectorIndexer {
|
|
|
28
28
|
embedding: JSON.stringify(embedding),
|
|
29
29
|
session_id: sessionId || null,
|
|
30
30
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
31
|
-
created_at: new Date()
|
|
31
|
+
created_at: new Date(),
|
|
32
32
|
})
|
|
33
33
|
.returningAll()
|
|
34
34
|
.executeTakeFirstOrThrow();
|
|
@@ -38,19 +38,19 @@ class VectorIndexer {
|
|
|
38
38
|
* Batch add memories
|
|
39
39
|
*/
|
|
40
40
|
async addMemories(items) {
|
|
41
|
-
const values = items.map(item => ({
|
|
41
|
+
const values = items.map((item) => ({
|
|
42
42
|
content: item.content,
|
|
43
43
|
embedding: JSON.stringify(item.embedding),
|
|
44
44
|
session_id: item.sessionId || null,
|
|
45
45
|
metadata: item.metadata ? JSON.stringify(item.metadata) : null,
|
|
46
|
-
created_at: new Date()
|
|
46
|
+
created_at: new Date(),
|
|
47
47
|
}));
|
|
48
48
|
const memories = await this.typedDb
|
|
49
49
|
.insertInto(this.memoriesTable)
|
|
50
50
|
.values(values)
|
|
51
51
|
.returningAll()
|
|
52
52
|
.execute();
|
|
53
|
-
return memories.map(m => this.parseMemory(m));
|
|
53
|
+
return memories.map((m) => this.parseMemory(m));
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* Search for similar memories using Hybrid Search (Vector + Keyword)
|
|
@@ -69,7 +69,7 @@ class VectorIndexer {
|
|
|
69
69
|
query = query.where('session_id', '=', sessionId);
|
|
70
70
|
}
|
|
71
71
|
const results = await query.execute();
|
|
72
|
-
vectorResults = results.map(m => this.parseMemory(m));
|
|
72
|
+
vectorResults = results.map((m) => this.parseMemory(m));
|
|
73
73
|
}
|
|
74
74
|
else if (this.config.provider === 'sqlite-vss') {
|
|
75
75
|
try {
|
|
@@ -94,15 +94,17 @@ class VectorIndexer {
|
|
|
94
94
|
query = query.orderBy('created_at', 'desc').limit(1000);
|
|
95
95
|
}
|
|
96
96
|
const allMemories = await query.execute();
|
|
97
|
-
const scored = allMemories.map(mem => {
|
|
98
|
-
const vec = typeof mem.embedding === 'string'
|
|
97
|
+
const scored = allMemories.map((mem) => {
|
|
98
|
+
const vec = typeof mem.embedding === 'string'
|
|
99
|
+
? JSON.parse(mem.embedding)
|
|
100
|
+
: mem.embedding || [];
|
|
99
101
|
const score = this.cosineSimilarity(embedding, vec);
|
|
100
102
|
return { memory: mem, score };
|
|
101
103
|
});
|
|
102
104
|
vectorResults = scored
|
|
103
105
|
.sort((a, b) => b.score - a.score)
|
|
104
106
|
.slice(0, limit)
|
|
105
|
-
.map(item => this.parseMemory(item.memory));
|
|
107
|
+
.map((item) => this.parseMemory(item.memory));
|
|
106
108
|
}
|
|
107
109
|
// Keyword Search (Hybrid component)
|
|
108
110
|
let keywordResults = [];
|
|
@@ -112,19 +114,17 @@ class VectorIndexer {
|
|
|
112
114
|
// Merge and fuse using Reciprocal Rank Fusion (RRF)
|
|
113
115
|
const fused = this.mergeWithRRF(vectorResults, keywordResults, limit);
|
|
114
116
|
// Final filtering and confidence assessment
|
|
115
|
-
const finalResults = fused.filter(m => {
|
|
117
|
+
const finalResults = fused.filter((m) => {
|
|
116
118
|
const vec = m.embedding || [];
|
|
117
119
|
const score = this.cosineSimilarity(embedding, vec);
|
|
118
120
|
// Even with RRF, we keep a safety floor for semantic relevance
|
|
119
|
-
return score >=
|
|
121
|
+
return score >= minScore * 0.8;
|
|
120
122
|
});
|
|
121
123
|
return finalResults.slice(0, limit);
|
|
122
124
|
}
|
|
123
125
|
async keywordSearch(keyword, options) {
|
|
124
126
|
const { limit, sessionId } = options;
|
|
125
|
-
let query = this.typedDb
|
|
126
|
-
.selectFrom(this.memoriesTable)
|
|
127
|
-
.selectAll();
|
|
127
|
+
let query = this.typedDb.selectFrom(this.memoriesTable).selectAll();
|
|
128
128
|
// Production Hardening: Use native FTS where available
|
|
129
129
|
if (this.config.provider === 'sqlite-vss') {
|
|
130
130
|
// Check for virtual FTS table (convention: table_name_fts)
|
|
@@ -147,7 +147,7 @@ class VectorIndexer {
|
|
|
147
147
|
query = query.where('session_id', '=', sessionId);
|
|
148
148
|
}
|
|
149
149
|
const results = await query.limit(limit).execute();
|
|
150
|
-
return results.map(r => this.parseMemory(r));
|
|
150
|
+
return results.map((r) => this.parseMemory(r));
|
|
151
151
|
}
|
|
152
152
|
/**
|
|
153
153
|
* Reciprocal Rank Fusion (RRF)
|
|
@@ -172,7 +172,7 @@ class VectorIndexer {
|
|
|
172
172
|
// Sort by fused score
|
|
173
173
|
return Object.values(scores)
|
|
174
174
|
.sort((a, b) => b.score - a.score)
|
|
175
|
-
.map(s => s.memory);
|
|
175
|
+
.map((s) => s.memory);
|
|
176
176
|
}
|
|
177
177
|
mergeResults(vector, keyword) {
|
|
178
178
|
const seen = new Set();
|
|
@@ -203,9 +203,13 @@ class VectorIndexer {
|
|
|
203
203
|
id: m.id,
|
|
204
204
|
sessionId: m.session_id,
|
|
205
205
|
content: m.content,
|
|
206
|
-
embedding: typeof m.embedding === 'string'
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
embedding: typeof m.embedding === 'string'
|
|
207
|
+
? JSON.parse(m.embedding)
|
|
208
|
+
: m.embedding || [],
|
|
209
|
+
metadata: typeof m.metadata === 'string'
|
|
210
|
+
? JSON.parse(m.metadata)
|
|
211
|
+
: m.metadata || {},
|
|
212
|
+
createdAt: new Date(m.created_at),
|
|
209
213
|
};
|
|
210
214
|
}
|
|
211
215
|
}
|
|
@@ -34,11 +34,11 @@ class AblationEngine {
|
|
|
34
34
|
// 1. Prune Knowledge (with dependency check)
|
|
35
35
|
const knowledgeToPrune = await trx
|
|
36
36
|
.selectFrom(this.knowledgeTable)
|
|
37
|
-
.
|
|
37
|
+
.selectAll()
|
|
38
38
|
.where((eb) => eb.or([
|
|
39
39
|
eb('metadata', 'not like', '%"priority": "high"%'),
|
|
40
40
|
eb('metadata', 'not like', '%"priority":"high"%'),
|
|
41
|
-
eb('metadata', 'is', null)
|
|
41
|
+
eb('metadata', 'is', null),
|
|
42
42
|
]))
|
|
43
43
|
.where('updated_at', '<', cutoff)
|
|
44
44
|
// Exclude items that are linked
|
|
@@ -46,7 +46,7 @@ class AblationEngine {
|
|
|
46
46
|
.where('id', 'not in', (eb) => eb.selectFrom(this.linksTable).select('target_id'))
|
|
47
47
|
.execute();
|
|
48
48
|
if (knowledgeToPrune.length > 0) {
|
|
49
|
-
const candidates = knowledgeToPrune.map(k => this.cortex.knowledge['parseKnowledge'](k));
|
|
49
|
+
const candidates = knowledgeToPrune.map((k) => this.cortex.knowledge['parseKnowledge'](k));
|
|
50
50
|
const idsToDelete = [];
|
|
51
51
|
for (const item of candidates) {
|
|
52
52
|
const fitness = this.cortex.knowledge.calculateFitness(item);
|
|
@@ -69,7 +69,7 @@ class AblationEngine {
|
|
|
69
69
|
.where('created_at', '<', cutoff)
|
|
70
70
|
.where((eb) => eb.or([
|
|
71
71
|
eb('metadata', 'not like', '%"anchor":true%'),
|
|
72
|
-
eb('metadata', 'is', null)
|
|
72
|
+
eb('metadata', 'is', null),
|
|
73
73
|
]))
|
|
74
74
|
.executeTakeFirst();
|
|
75
75
|
totalPruned += Number(memoriesResult.numDeletedRows || 0);
|
|
@@ -88,7 +88,7 @@ class AblationEngine {
|
|
|
88
88
|
const baseline = await this.cortex.metrics.getAverageMetric('success_rate');
|
|
89
89
|
const stats = await this.cortex.metrics.getMetricStats('success_rate');
|
|
90
90
|
// If current average is significantly lower than overall average
|
|
91
|
-
if (stats.count > 10 && stats.avg <
|
|
91
|
+
if (stats.count > 10 && stats.avg < baseline * 0.8) {
|
|
92
92
|
console.warn(`[AblationEngine] PERFORMANCE DEGRADATION DETECTED (Avg: ${stats.avg}, Baseline: ${baseline}). Triggering mass recovery.`);
|
|
93
93
|
const ablatedItems = await this.typedDb
|
|
94
94
|
.selectFrom(this.knowledgeTable)
|
|
@@ -112,16 +112,21 @@ class AblationEngine {
|
|
|
112
112
|
async testAblation(id) {
|
|
113
113
|
console.log(`[AblationEngine] Conducting ablation test on item ${id}`);
|
|
114
114
|
return await this.db.transaction().execute(async (trx) => {
|
|
115
|
-
const item = await trx
|
|
115
|
+
const item = (await trx
|
|
116
116
|
.selectFrom(this.knowledgeTable)
|
|
117
117
|
.selectAll()
|
|
118
118
|
.where('id', '=', id)
|
|
119
|
-
.executeTakeFirst();
|
|
119
|
+
.executeTakeFirst());
|
|
120
120
|
if (!item)
|
|
121
121
|
return false;
|
|
122
|
-
const metadata = typeof item.metadata === 'string'
|
|
122
|
+
const metadata = typeof item.metadata === 'string'
|
|
123
|
+
? JSON.parse(item.metadata)
|
|
124
|
+
: item.metadata || {};
|
|
123
125
|
// 1. Record the experiment in reflections
|
|
124
|
-
await this.cortex.reflections.reflect(item.source_session_id || 'system', 'success', `Ablation experiment initiated for item ${id}`, [
|
|
126
|
+
await this.cortex.reflections.reflect(item.source_session_id || 'system', 'success', `Ablation experiment initiated for item ${id}`, [
|
|
127
|
+
`Temporary confidence reduction to evaluate reasoning impact.`,
|
|
128
|
+
`Original confidence: ${item.confidence}`,
|
|
129
|
+
]);
|
|
125
130
|
// 2. Perform the ablation
|
|
126
131
|
await trx
|
|
127
132
|
.updateTable(this.knowledgeTable)
|
|
@@ -130,9 +135,9 @@ class AblationEngine {
|
|
|
130
135
|
...metadata,
|
|
131
136
|
ablation_test: true,
|
|
132
137
|
original_confidence: item.confidence,
|
|
133
|
-
ablated_at: new Date()
|
|
138
|
+
ablated_at: new Date(),
|
|
134
139
|
}),
|
|
135
|
-
confidence: 0
|
|
140
|
+
confidence: 0,
|
|
136
141
|
})
|
|
137
142
|
.where('id', '=', id)
|
|
138
143
|
.execute();
|
|
@@ -144,14 +149,16 @@ class AblationEngine {
|
|
|
144
149
|
*/
|
|
145
150
|
async recoverAblatedItem(id) {
|
|
146
151
|
return await this.db.transaction().execute(async (trx) => {
|
|
147
|
-
const item = await trx
|
|
152
|
+
const item = (await trx
|
|
148
153
|
.selectFrom(this.knowledgeTable)
|
|
149
154
|
.selectAll()
|
|
150
155
|
.where('id', '=', id)
|
|
151
|
-
.executeTakeFirst();
|
|
156
|
+
.executeTakeFirst());
|
|
152
157
|
if (!item)
|
|
153
158
|
return false;
|
|
154
|
-
const metadata = typeof item.metadata === 'string'
|
|
159
|
+
const metadata = typeof item.metadata === 'string'
|
|
160
|
+
? JSON.parse(item.metadata)
|
|
161
|
+
: item.metadata || {};
|
|
155
162
|
if (!metadata.ablation_test)
|
|
156
163
|
return false;
|
|
157
164
|
const originalConfidence = metadata.original_confidence ?? 0.5;
|
|
@@ -163,7 +170,7 @@ class AblationEngine {
|
|
|
163
170
|
.set({
|
|
164
171
|
confidence: originalConfidence,
|
|
165
172
|
metadata: JSON.stringify(metadata),
|
|
166
|
-
updated_at: new Date()
|
|
173
|
+
updated_at: new Date(),
|
|
167
174
|
})
|
|
168
175
|
.where('id', '=', id)
|
|
169
176
|
.execute();
|