noormme 1.2.0 → 1.2.1
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 +60 -6
- package/dist/cjs/agentic/ActionJournal.d.ts +5 -2
- package/dist/cjs/agentic/ActionJournal.js +13 -5
- package/dist/cjs/agentic/CapabilityManager.d.ts +7 -0
- package/dist/cjs/agentic/CapabilityManager.js +84 -7
- package/dist/cjs/agentic/CognitiveRepository.js +3 -6
- package/dist/cjs/agentic/Cortex.d.ts +4 -0
- package/dist/cjs/agentic/Cortex.js +38 -17
- package/dist/cjs/agentic/EpisodicMemory.d.ts +5 -1
- package/dist/cjs/agentic/EpisodicMemory.js +11 -4
- package/dist/cjs/agentic/PersonaManager.js +37 -31
- package/dist/cjs/agentic/PolicyEnforcer.d.ts +6 -1
- package/dist/cjs/agentic/PolicyEnforcer.js +74 -17
- package/dist/cjs/agentic/ResourceMonitor.d.ts +9 -0
- package/dist/cjs/agentic/ResourceMonitor.js +36 -2
- package/dist/cjs/agentic/SessionManager.js +24 -17
- package/dist/cjs/agentic/VectorIndexer.d.ts +1 -0
- package/dist/cjs/agentic/VectorIndexer.js +26 -17
- package/dist/cjs/agentic/improvement/AblationEngine.d.ts +4 -6
- package/dist/cjs/agentic/improvement/AblationEngine.js +57 -37
- package/dist/cjs/agentic/improvement/ActionRefiner.js +30 -14
- package/dist/cjs/agentic/improvement/ConflictResolver.d.ts +3 -1
- package/dist/cjs/agentic/improvement/ConflictResolver.js +59 -47
- package/dist/cjs/agentic/improvement/CortexJanitor.js +11 -0
- package/dist/cjs/agentic/improvement/CuriosityEngine.d.ts +1 -1
- package/dist/cjs/agentic/improvement/CuriosityEngine.js +48 -21
- package/dist/cjs/agentic/improvement/EvolutionRitual.js +26 -14
- package/dist/cjs/agentic/improvement/EvolutionaryPilot.js +16 -4
- package/dist/cjs/agentic/improvement/GoalArchitect.d.ts +6 -2
- package/dist/cjs/agentic/improvement/GoalArchitect.js +72 -34
- package/dist/cjs/agentic/improvement/GovernanceManager.d.ts +9 -3
- package/dist/cjs/agentic/improvement/GovernanceManager.js +232 -92
- package/dist/cjs/agentic/improvement/HiveLink.d.ts +7 -3
- package/dist/cjs/agentic/improvement/HiveLink.js +135 -113
- package/dist/cjs/agentic/improvement/KnowledgeDistiller.js +43 -35
- package/dist/cjs/agentic/improvement/QuotaManager.d.ts +41 -0
- package/dist/cjs/agentic/improvement/QuotaManager.js +185 -0
- package/dist/cjs/agentic/improvement/RecursiveReasoner.js +50 -25
- package/dist/cjs/agentic/improvement/ReflectionEngine.d.ts +4 -1
- package/dist/cjs/agentic/improvement/ReflectionEngine.js +3 -1
- package/dist/cjs/agentic/improvement/RitualOrchestrator.js +27 -16
- package/dist/cjs/agentic/improvement/RuleEngine.d.ts +1 -1
- package/dist/cjs/agentic/improvement/RuleEngine.js +10 -4
- package/dist/cjs/agentic/improvement/SelfEvolution.js +21 -17
- package/dist/cjs/agentic/improvement/SelfTestRegistry.d.ts +5 -0
- package/dist/cjs/agentic/improvement/SelfTestRegistry.js +129 -109
- package/dist/cjs/agentic/improvement/SkillSynthesizer.d.ts +1 -0
- package/dist/cjs/agentic/improvement/SkillSynthesizer.js +22 -13
- package/dist/cjs/agentic/improvement/StrategicPlanner.d.ts +1 -0
- package/dist/cjs/agentic/improvement/StrategicPlanner.js +26 -19
- package/dist/cjs/agentic/telemetry/CognitiveSynthesizer.d.ts +5 -0
- package/dist/cjs/agentic/telemetry/CognitiveSynthesizer.js +54 -12
- package/dist/cjs/agentic/telemetry/EventHarvester.d.ts +1 -1
- package/dist/cjs/agentic/telemetry/EventHarvester.js +10 -3
- package/dist/cjs/agentic/telemetry/ResearchAlchemist.d.ts +7 -2
- package/dist/cjs/agentic/telemetry/ResearchAlchemist.js +49 -8
- package/dist/cjs/agentic/telemetry/TelemetryOrchestrator.d.ts +4 -1
- package/dist/cjs/agentic/telemetry/TelemetryOrchestrator.js +38 -11
- package/dist/cjs/cli/commands/inspect.js +40 -1
- package/dist/cjs/cli/commands/watch.js +31 -25
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +15 -5
- package/dist/cjs/helpers/agent-schema.js +1 -0
- package/dist/cjs/migration/data_migrator.js +4 -4
- package/dist/cjs/migration/schema_differ.js +37 -15
- package/dist/cjs/types/index.d.ts +12 -0
- package/dist/cjs/util/safe-sql-helpers.js +7 -10
- package/dist/esm/agentic/ActionJournal.d.ts +5 -2
- package/dist/esm/agentic/ActionJournal.js +13 -5
- package/dist/esm/agentic/CapabilityManager.d.ts +7 -0
- package/dist/esm/agentic/CapabilityManager.js +84 -7
- package/dist/esm/agentic/CognitiveRepository.js +3 -6
- package/dist/esm/agentic/Cortex.d.ts +4 -0
- package/dist/esm/agentic/Cortex.js +38 -17
- package/dist/esm/agentic/EpisodicMemory.d.ts +5 -1
- package/dist/esm/agentic/EpisodicMemory.js +11 -4
- package/dist/esm/agentic/PersonaManager.js +37 -31
- package/dist/esm/agentic/PolicyEnforcer.d.ts +6 -1
- package/dist/esm/agentic/PolicyEnforcer.js +74 -17
- package/dist/esm/agentic/ResourceMonitor.d.ts +9 -0
- package/dist/esm/agentic/ResourceMonitor.js +36 -2
- package/dist/esm/agentic/SessionManager.js +24 -17
- package/dist/esm/agentic/VectorIndexer.d.ts +1 -0
- package/dist/esm/agentic/VectorIndexer.js +26 -17
- package/dist/esm/agentic/improvement/AblationEngine.d.ts +4 -6
- package/dist/esm/agentic/improvement/AblationEngine.js +57 -37
- package/dist/esm/agentic/improvement/ActionRefiner.js +30 -14
- package/dist/esm/agentic/improvement/ConflictResolver.d.ts +3 -1
- package/dist/esm/agentic/improvement/ConflictResolver.js +59 -47
- package/dist/esm/agentic/improvement/CortexJanitor.js +11 -0
- package/dist/esm/agentic/improvement/CuriosityEngine.d.ts +1 -1
- package/dist/esm/agentic/improvement/CuriosityEngine.js +48 -21
- package/dist/esm/agentic/improvement/EvolutionRitual.js +26 -14
- package/dist/esm/agentic/improvement/EvolutionaryPilot.js +16 -4
- package/dist/esm/agentic/improvement/GoalArchitect.d.ts +6 -2
- package/dist/esm/agentic/improvement/GoalArchitect.js +72 -34
- package/dist/esm/agentic/improvement/GovernanceManager.d.ts +9 -3
- package/dist/esm/agentic/improvement/GovernanceManager.js +232 -92
- package/dist/esm/agentic/improvement/HiveLink.d.ts +7 -3
- package/dist/esm/agentic/improvement/HiveLink.js +135 -113
- package/dist/esm/agentic/improvement/KnowledgeDistiller.js +43 -35
- package/dist/esm/agentic/improvement/QuotaManager.d.ts +41 -0
- package/dist/esm/agentic/improvement/QuotaManager.js +182 -0
- package/dist/esm/agentic/improvement/RecursiveReasoner.js +50 -25
- package/dist/esm/agentic/improvement/ReflectionEngine.d.ts +4 -1
- package/dist/esm/agentic/improvement/ReflectionEngine.js +3 -1
- package/dist/esm/agentic/improvement/RitualOrchestrator.js +27 -16
- package/dist/esm/agentic/improvement/RuleEngine.d.ts +1 -1
- package/dist/esm/agentic/improvement/RuleEngine.js +10 -4
- package/dist/esm/agentic/improvement/SelfEvolution.js +21 -17
- package/dist/esm/agentic/improvement/SelfTestRegistry.d.ts +5 -0
- package/dist/esm/agentic/improvement/SelfTestRegistry.js +129 -109
- package/dist/esm/agentic/improvement/SkillSynthesizer.d.ts +1 -0
- package/dist/esm/agentic/improvement/SkillSynthesizer.js +22 -13
- package/dist/esm/agentic/improvement/StrategicPlanner.d.ts +1 -0
- package/dist/esm/agentic/improvement/StrategicPlanner.js +26 -19
- package/dist/esm/agentic/telemetry/CognitiveSynthesizer.d.ts +5 -0
- package/dist/esm/agentic/telemetry/CognitiveSynthesizer.js +54 -12
- package/dist/esm/agentic/telemetry/EventHarvester.d.ts +1 -1
- package/dist/esm/agentic/telemetry/EventHarvester.js +10 -3
- package/dist/esm/agentic/telemetry/ResearchAlchemist.d.ts +7 -2
- package/dist/esm/agentic/telemetry/ResearchAlchemist.js +49 -8
- package/dist/esm/agentic/telemetry/TelemetryOrchestrator.d.ts +4 -1
- package/dist/esm/agentic/telemetry/TelemetryOrchestrator.js +38 -11
- package/dist/esm/cli/commands/inspect.js +40 -1
- package/dist/esm/cli/commands/watch.js +31 -25
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +15 -5
- package/dist/esm/helpers/agent-schema.js +1 -0
- package/dist/esm/migration/data_migrator.js +4 -4
- package/dist/esm/migration/schema_differ.js +37 -15
- package/dist/esm/types/index.d.ts +12 -0
- package/dist/esm/util/safe-sql-helpers.js +7 -10
- package/package.json +1 -1
|
@@ -25,91 +25,122 @@ class GovernanceManager {
|
|
|
25
25
|
*/
|
|
26
26
|
async performAudit() {
|
|
27
27
|
const issues = [];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
.
|
|
31
|
-
.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
28
|
+
return await this.db.transaction().execute(async (trx) => {
|
|
29
|
+
// 0. Emergent Behavior Validation (Phase 2 Safety)
|
|
30
|
+
const emergentIssues = await this.validateEmergentBehavior(trx);
|
|
31
|
+
issues.push(...emergentIssues);
|
|
32
|
+
// Fetch active policies within transaction
|
|
33
|
+
const policies = (await trx
|
|
34
|
+
.selectFrom(this.policiesTable)
|
|
35
|
+
.selectAll()
|
|
36
|
+
.where('is_enabled', '=', true)
|
|
37
|
+
.execute());
|
|
38
|
+
const getPolicyValue = (name, type, strict = true) => {
|
|
39
|
+
const p = policies.find((p) => p.name === name || p.type === type);
|
|
40
|
+
if (!p) {
|
|
41
|
+
if (strict)
|
|
42
|
+
throw new Error(`Governance Violation: Required policy '${name}' or type '${type}' not found.`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const def = typeof p.definition === 'string'
|
|
46
|
+
? JSON.parse(p.definition)
|
|
47
|
+
: p.definition;
|
|
48
|
+
return def.threshold ?? def.limit ?? 0;
|
|
49
|
+
};
|
|
50
|
+
try {
|
|
51
|
+
// 1. Budgetary Governance: Check for cost spikes in various windows
|
|
52
|
+
const hourlyLimit = getPolicyValue('hourly_budget', 'budget');
|
|
53
|
+
const dailyLimit = getPolicyValue('daily_budget', 'budget');
|
|
54
|
+
const getCostInWindow = async (ms) => {
|
|
55
|
+
const result = await trx
|
|
56
|
+
.selectFrom(this.metricsTable)
|
|
57
|
+
.select((eb) => eb.fn.sum('metric_value').as('total'))
|
|
58
|
+
.where('metric_name', '=', 'total_cost')
|
|
59
|
+
.where('created_at', '>', new Date(Date.now() - ms))
|
|
60
|
+
.executeTakeFirst();
|
|
61
|
+
return Number(result?.total || 0);
|
|
62
|
+
};
|
|
63
|
+
const hCost = await getCostInWindow(3600000);
|
|
64
|
+
if (hCost > hourlyLimit && hourlyLimit > 0) {
|
|
65
|
+
issues.push(`Budget Violations: Hourly cost ($${hCost.toFixed(2)}) exceeded policy ($${hourlyLimit.toFixed(2)})`);
|
|
66
|
+
}
|
|
67
|
+
const dCost = await getCostInWindow(86400000);
|
|
68
|
+
if (dCost > dailyLimit && dailyLimit > 0) {
|
|
69
|
+
issues.push(`Budget Violations: Daily cumulative cost ($${dCost.toFixed(2)}) exceeded safety ceiling ($${dailyLimit.toFixed(2)})`);
|
|
70
|
+
}
|
|
71
|
+
// 2. Performance Governance: Success Rates & Success Stability
|
|
72
|
+
const minSuccess = getPolicyValue('min_success_rate', 'safety');
|
|
73
|
+
// Statistical Success Rate (last 100 events)
|
|
74
|
+
const recentSuccess = await trx
|
|
75
|
+
.selectFrom(this.metricsTable)
|
|
76
|
+
.select((eb) => eb.fn.avg('metric_value').as('avg'))
|
|
77
|
+
.where('metric_name', '=', 'success_rate')
|
|
78
|
+
.orderBy('created_at', 'desc')
|
|
79
|
+
.limit(100)
|
|
80
|
+
.executeTakeFirst();
|
|
81
|
+
const success = Number(recentSuccess?.avg || 1);
|
|
82
|
+
if (success < minSuccess) {
|
|
83
|
+
issues.push(`Performance Degradation: Rolling success rate (${Math.round(success * 100)}%) is below policy requirement (${minSuccess * 100}%)`);
|
|
84
|
+
}
|
|
85
|
+
// 2b. Swarm Quota Governance: Real-time quota validation
|
|
86
|
+
const activePersona = await this.getActivePersona(trx);
|
|
87
|
+
if (activePersona) {
|
|
88
|
+
const quotaCheck = await this.cortex.quotas.checkQuota('persona', activePersona.id);
|
|
89
|
+
if (!quotaCheck.allowed) {
|
|
90
|
+
issues.push(`Quota Breach: ${quotaCheck.reason}`);
|
|
91
|
+
}
|
|
92
|
+
// Check for swarm-level quotas if part of a swarm
|
|
93
|
+
const swarmId = activePersona.metadata?.swarm_id;
|
|
94
|
+
if (swarmId) {
|
|
95
|
+
const swarmCheck = await this.cortex.quotas.checkQuota('swarm', swarmId);
|
|
96
|
+
if (!swarmCheck.allowed) {
|
|
97
|
+
issues.push(`Swarm Quota Breach [${swarmId}]: ${swarmCheck.reason}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 3. Infrastructure Integrity: Reliability of Verified Skills
|
|
102
|
+
const reliabiltyLimit = getPolicyValue('reliability_floor', 'integrity');
|
|
103
|
+
const failingVerified = await trx
|
|
104
|
+
.selectFrom(this.config.capabilitiesTable || 'agent_capabilities')
|
|
105
|
+
.select(['name', 'reliability'])
|
|
106
|
+
.where('status', '=', 'verified')
|
|
107
|
+
.where('reliability', '<', reliabiltyLimit)
|
|
108
|
+
.execute();
|
|
109
|
+
for (const cap of failingVerified) {
|
|
110
|
+
issues.push(`Integrity Failure: Verified skill '${cap.name}' reliability (${cap.reliability.toFixed(2)}) dropped below floor (${reliabiltyLimit})`);
|
|
111
|
+
}
|
|
112
|
+
if (issues.length > 0) {
|
|
113
|
+
console.warn(`[GovernanceManager] AUDIT FAILED [${new Date().toISOString()}]: ${issues.length} compliance issues detected.`);
|
|
114
|
+
// Phase 1: Emergency Rollbacks
|
|
115
|
+
if (activePersona && (success < 0.4 || hCost > hourlyLimit * 1.5)) {
|
|
116
|
+
console.error(`[GovernanceManager] CRITICAL THRESHOLD BREACH. Initiating emergency containment for persona ${activePersona.id}`);
|
|
117
|
+
await this.cortex.strategy.rollbackPersona(activePersona.id);
|
|
118
|
+
issues.push(`Containment: Emergency rollback triggered for persona ${activePersona.id}`);
|
|
119
|
+
}
|
|
120
|
+
// Phase 2: Systemic Reflections
|
|
121
|
+
await this.cortex.reflections.reflect(null, 'failure', 'Governance Compliance Audit', issues);
|
|
122
|
+
// Phase 3: Remediation Rituals (Transactional)
|
|
123
|
+
await this.triggerRemediation(issues, trx);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
healthy: issues.length === 0,
|
|
127
|
+
issues,
|
|
128
|
+
};
|
|
97
129
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
130
|
+
catch (e) {
|
|
131
|
+
console.error(`[GovernanceManager] STRICT AUDIT FAILURE: ${String(e)}`);
|
|
132
|
+
issues.push(`Strict Mode Failure: ${String(e)}`);
|
|
133
|
+
return { healthy: false, issues };
|
|
134
|
+
}
|
|
135
|
+
});
|
|
103
136
|
return {
|
|
104
137
|
healthy: issues.length === 0,
|
|
105
138
|
issues,
|
|
106
139
|
};
|
|
107
140
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
async getActivePersona() {
|
|
112
|
-
const active = await this.db
|
|
141
|
+
async getActivePersona(trx) {
|
|
142
|
+
const db = trx || this.db;
|
|
143
|
+
const active = await db
|
|
113
144
|
.selectFrom(this.personasTable)
|
|
114
145
|
.selectAll()
|
|
115
146
|
.where('status', '=', 'active')
|
|
@@ -124,9 +155,93 @@ class GovernanceManager {
|
|
|
124
155
|
};
|
|
125
156
|
}
|
|
126
157
|
/**
|
|
127
|
-
*
|
|
158
|
+
* Quarantine a persona that is behaving outside safety parameters.
|
|
159
|
+
*/
|
|
160
|
+
async quarantinePersona(id, reason) {
|
|
161
|
+
console.warn(`[GovernanceManager] QUARANTINING Persona ${id}: ${reason}`);
|
|
162
|
+
await this.db.transaction().execute(async (trx) => {
|
|
163
|
+
let query = trx
|
|
164
|
+
.selectFrom(this.personasTable)
|
|
165
|
+
.selectAll()
|
|
166
|
+
.where('id', '=', id);
|
|
167
|
+
// Audit Phase 13: Atomic identity lock (Skip for SQLite)
|
|
168
|
+
if (this.db.getExecutor().adapter?.constructor.name !== 'SqliteAdapter') {
|
|
169
|
+
query = query.forUpdate();
|
|
170
|
+
}
|
|
171
|
+
const persona = await query.executeTakeFirst();
|
|
172
|
+
if (persona) {
|
|
173
|
+
const metadata = typeof persona.metadata === 'string'
|
|
174
|
+
? JSON.parse(persona.metadata)
|
|
175
|
+
: persona.metadata || {};
|
|
176
|
+
await trx
|
|
177
|
+
.updateTable(this.personasTable)
|
|
178
|
+
.set({
|
|
179
|
+
status: 'quarantined',
|
|
180
|
+
metadata: JSON.stringify({
|
|
181
|
+
...metadata,
|
|
182
|
+
quarantine_reason: reason,
|
|
183
|
+
quarantined_at: new Date(),
|
|
184
|
+
}),
|
|
185
|
+
updated_at: new Date(),
|
|
186
|
+
})
|
|
187
|
+
.where('id', '=', id)
|
|
188
|
+
.execute();
|
|
189
|
+
// Phase 3: Rollback most recent changes
|
|
190
|
+
await this.cortex.strategy.rollbackPersona(id);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Blacklist a skill that is causing systemic issues.
|
|
196
|
+
*/
|
|
197
|
+
async quarantineSkill(name, reason) {
|
|
198
|
+
const capTable = this.config.capabilitiesTable || 'agent_capabilities';
|
|
199
|
+
console.warn(`[GovernanceManager] BLACKLISTING Skill ${name}: ${reason}`);
|
|
200
|
+
await this.db
|
|
201
|
+
.updateTable(capTable)
|
|
202
|
+
.set({
|
|
203
|
+
status: 'blacklisted',
|
|
204
|
+
metadata: JSON.stringify({ blacklist_reason: reason, blacklisted_at: new Date() }),
|
|
205
|
+
updated_at: new Date()
|
|
206
|
+
})
|
|
207
|
+
.where('name', '=', name)
|
|
208
|
+
.execute();
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Monitor cross-node behaviors and flag sudden spikes or malicious patterns.
|
|
128
212
|
*/
|
|
129
|
-
async
|
|
213
|
+
async validateEmergentBehavior(trx) {
|
|
214
|
+
const issues = [];
|
|
215
|
+
const db = trx || this.db;
|
|
216
|
+
// 1. Check for rapid propagation of new skills (Potential poisoning)
|
|
217
|
+
const capTable = this.config.capabilitiesTable || 'agent_capabilities';
|
|
218
|
+
const recentSkills = await db
|
|
219
|
+
.selectFrom(capTable)
|
|
220
|
+
.select(['name', 'created_at'])
|
|
221
|
+
.where('created_at', '>', new Date(Date.now() - 3600000)) // Last hour
|
|
222
|
+
.execute();
|
|
223
|
+
if (recentSkills.length > 10) {
|
|
224
|
+
issues.push(`Emergent Warning: Rapid skill propagation detected (${recentSkills.length} new skills in 1hr). Potential rogue behavior.`);
|
|
225
|
+
}
|
|
226
|
+
// 2. Check for high variance in task success across swarm
|
|
227
|
+
const recentTaskMetrics = await db
|
|
228
|
+
.selectFrom(this.metricsTable)
|
|
229
|
+
.select(['metric_value', 'metadata'])
|
|
230
|
+
.where('metric_name', '=', 'task_success_rate')
|
|
231
|
+
.where('created_at', '>', new Date(Date.now() - 1800000)) // Last 30m
|
|
232
|
+
.execute();
|
|
233
|
+
if (recentTaskMetrics.length >= 5) {
|
|
234
|
+
const values = recentTaskMetrics.map((m) => Number(m.metric_value));
|
|
235
|
+
const mean = values.reduce((a, b) => a + b, 0) / values.length;
|
|
236
|
+
const variance = values.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / values.length;
|
|
237
|
+
if (variance > 0.2) {
|
|
238
|
+
issues.push(`Emergent Warning: High variance in swarm success rate (${(variance * 100).toFixed(1)}%). Potential node instability.`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return issues;
|
|
242
|
+
}
|
|
243
|
+
async triggerRemediation(issues, trx) {
|
|
244
|
+
const db = trx || this.db;
|
|
130
245
|
for (const issue of issues) {
|
|
131
246
|
if (issue.includes('Budget Violations')) {
|
|
132
247
|
await this.cortex.rituals.scheduleRitual('Budget Remediation', 'compression', 'hourly', `Automated response to: ${issue}`, { priority: 'critical', enforce_limits: true });
|
|
@@ -135,17 +250,36 @@ class GovernanceManager {
|
|
|
135
250
|
await this.cortex.rituals.scheduleRitual('Reliability Sweep', 'pruning', 'daily', `Sanitizing high-noise memories due to: ${issue}`, { priority: 'medium', target: 'longtail' });
|
|
136
251
|
}
|
|
137
252
|
if (issue.includes('Integrity Failure')) {
|
|
138
|
-
//
|
|
253
|
+
// Audit Phase 10: Atomic demotion lock
|
|
139
254
|
const skillName = issue.match(/'([^']+)'/)?.[1];
|
|
140
255
|
if (skillName) {
|
|
141
256
|
console.log(`[GovernanceManager] Demoting tainted skill out of verified pool: ${skillName}`);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
257
|
+
const remediationStep = async (t) => {
|
|
258
|
+
const skill = await t
|
|
259
|
+
.selectFrom(this.config.capabilitiesTable || 'agent_capabilities')
|
|
260
|
+
.select('id')
|
|
261
|
+
.where('name', '=', skillName)
|
|
262
|
+
.forUpdate() // Lock the skill row
|
|
263
|
+
.executeTakeFirst();
|
|
264
|
+
if (skill) {
|
|
265
|
+
await t
|
|
266
|
+
.updateTable(this.config.capabilitiesTable || 'agent_capabilities')
|
|
267
|
+
.set({ status: 'experimental', updated_at: new Date() })
|
|
268
|
+
.where('id', '=', skill.id)
|
|
269
|
+
.execute();
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
if (trx) {
|
|
273
|
+
await remediationStep(trx);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
await this.db.transaction().execute(remediationStep);
|
|
277
|
+
}
|
|
147
278
|
}
|
|
148
279
|
}
|
|
280
|
+
if (issue.includes('Quota Breach') || issue.includes('Swarm Quota Breach')) {
|
|
281
|
+
await this.cortex.rituals.scheduleRitual('Resource Throttling', 'pruning', 'hourly', `Critical resource containment: ${issue}`, { priority: 'critical', active_containment: true });
|
|
282
|
+
}
|
|
149
283
|
}
|
|
150
284
|
}
|
|
151
285
|
/**
|
|
@@ -155,7 +289,13 @@ class GovernanceManager {
|
|
|
155
289
|
const repairs = [];
|
|
156
290
|
// 1. Check for chronic high latency
|
|
157
291
|
const latencyStats = await this.cortex.metrics.getMetricStats('query_latency');
|
|
158
|
-
|
|
292
|
+
const latencyThreshold = (await this.cortex.policies.checkPolicy('query_latency_threshold', 0)).reason ? 500 : 500; // Logic to pull from policy if possible, else 500
|
|
293
|
+
// PRODUCTION HARDENING: Pull thresholds from explicit governance policies
|
|
294
|
+
const policies = await this.cortex.policies.getActivePolicies();
|
|
295
|
+
const latencyPolicy = policies.find(p => p.name === 'latency_repair_threshold')?.definition?.threshold || 500;
|
|
296
|
+
const costPolicy = policies.find(p => p.name === 'high_cost_threshold')?.definition?.threshold || 0.5;
|
|
297
|
+
const storagePolicy = policies.find(p => p.name === 'cold_storage_threshold')?.definition?.days || 30;
|
|
298
|
+
if (latencyStats.avg > latencyPolicy && latencyStats.count > 10) {
|
|
159
299
|
repairs.push(`Average latency is high (${latencyStats.avg.toFixed(2)}ms). Suggesting index audit across hit tables.`);
|
|
160
300
|
}
|
|
161
301
|
// 2. Detect specific slow tables from recent metrics
|
|
@@ -163,7 +303,7 @@ class GovernanceManager {
|
|
|
163
303
|
.selectFrom(this.metricsTable)
|
|
164
304
|
.select('metadata')
|
|
165
305
|
.where('metric_name', '=', 'query_latency')
|
|
166
|
-
.where('metric_value', '>',
|
|
306
|
+
.where('metric_value', '>', latencyPolicy * 2)
|
|
167
307
|
.limit(20)
|
|
168
308
|
.execute();
|
|
169
309
|
const slowTables = new Set();
|
|
@@ -184,19 +324,19 @@ class GovernanceManager {
|
|
|
184
324
|
}
|
|
185
325
|
// 3. Check for high cost accumulation
|
|
186
326
|
const totalCost = await this.cortex.metrics.getAverageMetric('total_cost');
|
|
187
|
-
if (totalCost >
|
|
327
|
+
if (totalCost > costPolicy) {
|
|
188
328
|
repairs.push('Average query cost is high. Suggesting prompt compression or model switching (e.g., to a smaller model).');
|
|
189
329
|
}
|
|
190
330
|
// 3. Check for cold storage candidates
|
|
191
331
|
const sessionsTable = this.config.sessionsTable || 'agent_sessions';
|
|
192
|
-
const oldThreshold = new Date(Date.now() -
|
|
332
|
+
const oldThreshold = new Date(Date.now() - storagePolicy * 24 * 60 * 60 * 1000);
|
|
193
333
|
const oldSessions = (await this.db
|
|
194
334
|
.selectFrom(sessionsTable)
|
|
195
335
|
.select((eb) => eb.fn.count('id').as('count'))
|
|
196
336
|
.where('created_at', '<', oldThreshold)
|
|
197
337
|
.executeTakeFirst());
|
|
198
338
|
if (Number(oldSessions?.count || 0) > 100) {
|
|
199
|
-
repairs.push(`[STORAGE OPTIMIZATION] Found ${oldSessions.count} sessions older than
|
|
339
|
+
repairs.push(`[STORAGE OPTIMIZATION] Found ${oldSessions.count} sessions older than ${storagePolicy} days. Consider moving to cold storage to reduce primary database size and improve backup speed.`);
|
|
200
340
|
}
|
|
201
341
|
return repairs;
|
|
202
342
|
}
|
|
@@ -16,15 +16,19 @@ export declare class HiveLink {
|
|
|
16
16
|
* Promote high-confidence local knowledge to global "Hive" knowledge.
|
|
17
17
|
* This creates a new, session-agnostic entry or updates an existing global one.
|
|
18
18
|
*/
|
|
19
|
-
broadcastKnowledge(
|
|
19
|
+
broadcastKnowledge(options?: {
|
|
20
|
+
minConfidence?: number;
|
|
21
|
+
limit?: number;
|
|
22
|
+
offset?: number;
|
|
23
|
+
}): Promise<number>;
|
|
20
24
|
/**
|
|
21
25
|
* Strengthen knowledge related to a specific domain (tag).
|
|
22
26
|
* Increases confidence of all items with this tag, representing "domain mastery".
|
|
23
27
|
*/
|
|
24
28
|
syncDomain(domainTag: string, boostFactor?: number): Promise<number>;
|
|
25
29
|
/**
|
|
26
|
-
* Propagate high-performing capabilities globally
|
|
27
|
-
*
|
|
30
|
+
* Propagate high-performing capabilities globally using the "Sovereign Draft" protocol.
|
|
31
|
+
* Uses Bayesian Convergence and Shadow Promotion to avoid deadlocks.
|
|
28
32
|
*/
|
|
29
33
|
broadcastSkills(): Promise<number>;
|
|
30
34
|
/**
|