noormme 1.2.0 → 1.2.2
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 +20 -6
- package/dist/cjs/agentic/improvement/GovernanceManager.js +134 -155
- 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 +22 -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/improvement/governance/AuditContext.d.ts +17 -0
- package/dist/cjs/agentic/improvement/governance/AuditContext.js +2 -0
- package/dist/cjs/agentic/improvement/governance/BudgetAuditor.d.ts +4 -0
- package/dist/cjs/agentic/improvement/governance/BudgetAuditor.js +50 -0
- package/dist/cjs/agentic/improvement/governance/EmergenceAuditor.d.ts +4 -0
- package/dist/cjs/agentic/improvement/governance/EmergenceAuditor.js +37 -0
- package/dist/cjs/agentic/improvement/governance/MaintenanceOracle.d.ts +4 -0
- package/dist/cjs/agentic/improvement/governance/MaintenanceOracle.js +67 -0
- package/dist/cjs/agentic/improvement/governance/PerformanceAuditor.d.ts +4 -0
- package/dist/cjs/agentic/improvement/governance/PerformanceAuditor.js +43 -0
- package/dist/cjs/agentic/improvement/governance/PersonaAuditor.d.ts +6 -0
- package/dist/cjs/agentic/improvement/governance/PersonaAuditor.js +74 -0
- package/dist/cjs/agentic/improvement/governance/RemediationEngine.d.ts +5 -0
- package/dist/cjs/agentic/improvement/governance/RemediationEngine.js +43 -0
- package/dist/cjs/agentic/improvement/governance/SkillAuditor.d.ts +5 -0
- package/dist/cjs/agentic/improvement/governance/SkillAuditor.js +52 -0
- 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/cli/index.js +0 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +15 -5
- package/dist/cjs/helpers/agent-schema.js +15 -14
- 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 +20 -6
- package/dist/esm/agentic/improvement/GovernanceManager.js +134 -155
- 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 +22 -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/improvement/governance/AuditContext.d.ts +17 -0
- package/dist/esm/agentic/improvement/governance/AuditContext.js +2 -0
- package/dist/esm/agentic/improvement/governance/BudgetAuditor.d.ts +4 -0
- package/dist/esm/agentic/improvement/governance/BudgetAuditor.js +47 -0
- package/dist/esm/agentic/improvement/governance/EmergenceAuditor.d.ts +4 -0
- package/dist/esm/agentic/improvement/governance/EmergenceAuditor.js +34 -0
- package/dist/esm/agentic/improvement/governance/MaintenanceOracle.d.ts +4 -0
- package/dist/esm/agentic/improvement/governance/MaintenanceOracle.js +64 -0
- package/dist/esm/agentic/improvement/governance/PerformanceAuditor.d.ts +4 -0
- package/dist/esm/agentic/improvement/governance/PerformanceAuditor.js +40 -0
- package/dist/esm/agentic/improvement/governance/PersonaAuditor.d.ts +6 -0
- package/dist/esm/agentic/improvement/governance/PersonaAuditor.js +71 -0
- package/dist/esm/agentic/improvement/governance/RemediationEngine.d.ts +5 -0
- package/dist/esm/agentic/improvement/governance/RemediationEngine.js +40 -0
- package/dist/esm/agentic/improvement/governance/SkillAuditor.d.ts +5 -0
- package/dist/esm/agentic/improvement/governance/SkillAuditor.js +49 -0
- 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 +15 -14
- 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 +44 -40
|
@@ -21,8 +21,15 @@ class CognitiveSynthesizer {
|
|
|
21
21
|
* Uses robust transaction logic and behavioral pathing.
|
|
22
22
|
*/
|
|
23
23
|
async synthesize(sessionId, input, pattern) {
|
|
24
|
-
//
|
|
25
|
-
|
|
24
|
+
// PRODUCTION HARDENING: Reasoning-Driven Synthesis
|
|
25
|
+
// Instead of regex heuristics, we leverage the RecursiveReasoner for high-fidelity goal extraction
|
|
26
|
+
const cortex = this.config.cortex;
|
|
27
|
+
let goalInferred = this.inferGoalFromContent(input);
|
|
28
|
+
if (cortex?.reasoner) {
|
|
29
|
+
const reasoning = await cortex.reasoner.analyzeIntent(input);
|
|
30
|
+
if (reasoning.goal)
|
|
31
|
+
goalInferred = reasoning.goal;
|
|
32
|
+
}
|
|
26
33
|
const strategy = pattern || this.detectStrategy(input);
|
|
27
34
|
try {
|
|
28
35
|
await this.db.transaction().execute(async (trx) => {
|
|
@@ -33,14 +40,17 @@ class CognitiveSynthesizer {
|
|
|
33
40
|
.executeTakeFirst();
|
|
34
41
|
if (existing) {
|
|
35
42
|
const currentPath = this.parsePath(existing.evolution_path);
|
|
36
|
-
// Only append to path if goal or
|
|
43
|
+
// Only append to path if goal, strategy, or sentiment shifted significantly
|
|
44
|
+
const sentiment = this.detectSentimentDrift(input);
|
|
37
45
|
if (existing.inferred_goal !== goalInferred ||
|
|
38
|
-
existing.strategy !== strategy
|
|
46
|
+
existing.strategy !== strategy ||
|
|
47
|
+
(existing.metadata && JSON.parse(existing.metadata).lastSentiment !== sentiment)) {
|
|
39
48
|
currentPath.push({
|
|
40
49
|
timestamp: new Date().toISOString(),
|
|
41
50
|
previousGoal: existing.inferred_goal,
|
|
42
51
|
newGoal: goalInferred,
|
|
43
52
|
strategyShift: strategy,
|
|
53
|
+
sentiment,
|
|
44
54
|
});
|
|
45
55
|
}
|
|
46
56
|
await trx
|
|
@@ -50,6 +60,11 @@ class CognitiveSynthesizer {
|
|
|
50
60
|
strategy,
|
|
51
61
|
evolution_path: JSON.stringify(currentPath),
|
|
52
62
|
status: 'active',
|
|
63
|
+
metadata: JSON.stringify({
|
|
64
|
+
...JSON.parse(existing.metadata || '{}'),
|
|
65
|
+
lastSentiment: sentiment,
|
|
66
|
+
pivots: currentPath.length,
|
|
67
|
+
}),
|
|
53
68
|
autonomy_level: this.calculateAutonomy(currentPath.length, existing.autonomy_level || 1),
|
|
54
69
|
updated_at: new Date(),
|
|
55
70
|
})
|
|
@@ -124,9 +139,13 @@ class CognitiveSynthesizer {
|
|
|
124
139
|
inferGoalFromContent(content) {
|
|
125
140
|
// Real-world simulation: extract the first imperative sentence or key noun phrases
|
|
126
141
|
const clean = content.trim().replace(/\n/g, ' ');
|
|
142
|
+
// Hardened heuristic: prioritize imperative verbs and specific NOORMME intents
|
|
143
|
+
const imperativeMatch = clean.match(/(?:please |can you |let's )?(implement|fix|refactor|add|search|analyze|delete|evolve) .+/i);
|
|
144
|
+
if (imperativeMatch) {
|
|
145
|
+
return imperativeMatch[0].substring(0, 100) + (imperativeMatch[0].length > 100 ? '...' : '');
|
|
146
|
+
}
|
|
127
147
|
if (clean.length < 100)
|
|
128
148
|
return clean;
|
|
129
|
-
// Simple heuristic: look for "need", "want", "please", "can you"
|
|
130
149
|
const keywords = [
|
|
131
150
|
'need',
|
|
132
151
|
'want',
|
|
@@ -146,21 +165,44 @@ class CognitiveSynthesizer {
|
|
|
146
165
|
}
|
|
147
166
|
detectStrategy(content) {
|
|
148
167
|
const c = content.toLowerCase();
|
|
149
|
-
|
|
168
|
+
// Hardened strategy detection
|
|
169
|
+
if (c.includes('debug') || c.includes('fix') || c.includes('error') || c.includes('broken'))
|
|
150
170
|
return 'Diagnostic Repair';
|
|
151
|
-
if (c.includes('create') || c.includes('build') || c.includes('implement'))
|
|
171
|
+
if (c.includes('create') || c.includes('build') || c.includes('implement') || c.includes('new file'))
|
|
152
172
|
return 'Generative Construction';
|
|
153
|
-
if (c.includes('research') || c.includes('explain') || c.includes('how'))
|
|
173
|
+
if (c.includes('research') || c.includes('explain') || c.includes('how') || c.includes('investigate'))
|
|
154
174
|
return 'Knowledge Acquisition';
|
|
175
|
+
if (c.includes('evolve') || c.includes('mutate') || c.includes('dna'))
|
|
176
|
+
return 'Self-Evolutionary';
|
|
155
177
|
return 'Adaptive Exploration';
|
|
156
178
|
}
|
|
157
179
|
calculateAutonomy(pivots, currentLevel) {
|
|
158
|
-
//
|
|
159
|
-
//
|
|
160
|
-
if (pivots >
|
|
161
|
-
return Math.
|
|
180
|
+
// Enhanced Autonomy: Lower weight on raw pivots, more on ratio
|
|
181
|
+
// If pivots are moderate but yield successful sub-goals, autonomy holds.
|
|
182
|
+
if (pivots > 10)
|
|
183
|
+
return Math.max(1, currentLevel - 1);
|
|
184
|
+
if (pivots > 5 && currentLevel > 2)
|
|
185
|
+
return currentLevel;
|
|
186
|
+
if (pivots === 0)
|
|
187
|
+
return Math.min(5, currentLevel + 1);
|
|
162
188
|
return currentLevel;
|
|
163
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Detect "Sentiment Drift" or Cognitive Friction in the input stream.
|
|
192
|
+
* Mirrors the agent's internal "frustration" or "flow" state.
|
|
193
|
+
*/
|
|
194
|
+
detectSentimentDrift(content) {
|
|
195
|
+
const c = content.toLowerCase();
|
|
196
|
+
const negativeTerms = ['slow', 'wrong', 'bad', 'error', 'failed', 'cannot', 'stuck'];
|
|
197
|
+
const postiveTerms = ['great', 'correct', 'good', 'success', 'works', 'yes'];
|
|
198
|
+
const negCount = negativeTerms.filter(t => c.includes(t)).length;
|
|
199
|
+
const posCount = postiveTerms.filter(t => c.includes(t)).length;
|
|
200
|
+
if (negCount > posCount + 1)
|
|
201
|
+
return 'frustration';
|
|
202
|
+
if (posCount > negCount)
|
|
203
|
+
return 'flow';
|
|
204
|
+
return 'neutral';
|
|
205
|
+
}
|
|
164
206
|
parsePath(pathData) {
|
|
165
207
|
if (!pathData)
|
|
166
208
|
return [];
|
|
@@ -6,7 +6,7 @@ export declare class EventHarvester {
|
|
|
6
6
|
private telemetryTable;
|
|
7
7
|
constructor(db: Kysely<any>, config?: AgenticConfig);
|
|
8
8
|
/**
|
|
9
|
-
* Persist a raw telemetry event
|
|
9
|
+
* Persist a raw telemetry event with safety valves for scale.
|
|
10
10
|
*/
|
|
11
11
|
harvest(sessionId: string | number, type: TelemetryEvent['type'], content: string, metadata?: Record<string, any>): Promise<void>;
|
|
12
12
|
}
|
|
@@ -12,17 +12,24 @@ class EventHarvester {
|
|
|
12
12
|
config.telemetryEventsTable || 'agent_telemetry_events';
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
* Persist a raw telemetry event
|
|
15
|
+
* Persist a raw telemetry event with safety valves for scale.
|
|
16
16
|
*/
|
|
17
17
|
async harvest(sessionId, type, content, metadata) {
|
|
18
|
+
// 1. Safety Valve: Drop excessively large payloads (> 100KB)
|
|
19
|
+
if (content.length > 102400) {
|
|
20
|
+
console.warn(`[EventHarvester] DROPPING EVENT: Content exceeds 100KB safety limit (${content.length} bytes)`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// 2. Metadata Integrity: Ensure metadata is a valid object
|
|
24
|
+
const finalMetadata = metadata && typeof metadata === 'object' ? metadata : {};
|
|
18
25
|
try {
|
|
19
26
|
await this.db
|
|
20
27
|
.insertInto(this.telemetryTable)
|
|
21
28
|
.values({
|
|
22
29
|
session_id: sessionId,
|
|
23
30
|
type,
|
|
24
|
-
content,
|
|
25
|
-
metadata:
|
|
31
|
+
content: content.substring(0, 50000), // Hard truncated for storage safety
|
|
32
|
+
metadata: JSON.stringify(finalMetadata),
|
|
26
33
|
created_at: new Date(),
|
|
27
34
|
})
|
|
28
35
|
.execute();
|
|
@@ -6,11 +6,16 @@ export declare class ResearchAlchemist {
|
|
|
6
6
|
private metricsTable;
|
|
7
7
|
constructor(db: Kysely<any>, config?: AgenticConfig);
|
|
8
8
|
/**
|
|
9
|
-
* Transmute raw events into research metrics
|
|
9
|
+
* Transmute raw events into research metrics with statistical noise filtering.
|
|
10
10
|
*/
|
|
11
11
|
transmute(sessionId: string | number, metricName: ResearchMetric['metricName'], value: number, metadata?: Record<string, any>): Promise<void>;
|
|
12
12
|
/**
|
|
13
|
-
* Calculate novelty
|
|
13
|
+
* Calculate discovery velocity: rate of novelty acquisition in the last 10 minutes.
|
|
14
|
+
*/
|
|
15
|
+
private calculateDiscoveryVelocity;
|
|
16
|
+
/**
|
|
17
|
+
* Calculate novelty or Discovery Index.
|
|
18
|
+
* Uses cross-session frequency analysis to determine actual novelty.
|
|
14
19
|
*/
|
|
15
20
|
trackDiscovery(sessionId: string | number, taskType: string): Promise<void>;
|
|
16
21
|
/**
|
|
@@ -11,9 +11,15 @@ class ResearchAlchemist {
|
|
|
11
11
|
this.metricsTable = config.researchMetricsTable || 'agent_research_metrics';
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Transmute raw events into research metrics
|
|
14
|
+
* Transmute raw events into research metrics with statistical noise filtering.
|
|
15
15
|
*/
|
|
16
16
|
async transmute(sessionId, metricName, value, metadata) {
|
|
17
|
+
// Hardening: Prevent extreme outliers from skewing discovery data
|
|
18
|
+
const magicCeiling = this.config.research?.magicCeiling || 100;
|
|
19
|
+
if (metricName === 'time_to_magic' && (value < 0 || value > magicCeiling)) {
|
|
20
|
+
console.warn(`[ResearchAlchemist] Filtering outlier magic score: ${value}`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
17
23
|
try {
|
|
18
24
|
await this.db
|
|
19
25
|
.insertInto(this.metricsTable)
|
|
@@ -25,26 +31,61 @@ class ResearchAlchemist {
|
|
|
25
31
|
created_at: new Date(),
|
|
26
32
|
})
|
|
27
33
|
.execute();
|
|
34
|
+
// Secondary Transmutation: Calculate discovery velocity
|
|
35
|
+
if (metricName === 'discovery_index') {
|
|
36
|
+
await this.calculateDiscoveryVelocity(sessionId);
|
|
37
|
+
}
|
|
28
38
|
}
|
|
29
39
|
catch (e) {
|
|
30
40
|
console.warn(`[ResearchAlchemist] Failed to transmute metric ${metricName}: ${e}`);
|
|
31
41
|
}
|
|
32
42
|
}
|
|
33
43
|
/**
|
|
34
|
-
* Calculate novelty
|
|
44
|
+
* Calculate discovery velocity: rate of novelty acquisition in the last 10 minutes.
|
|
45
|
+
*/
|
|
46
|
+
async calculateDiscoveryVelocity(sessionId) {
|
|
47
|
+
const windowMs = this.config.research?.velocityWindowMinutes * 60 * 1000 || 10 * 60 * 1000;
|
|
48
|
+
const recent = await this.db
|
|
49
|
+
.selectFrom(this.metricsTable)
|
|
50
|
+
.select((eb) => eb.fn.count('id').as('count'))
|
|
51
|
+
.where('session_id', '=', sessionId)
|
|
52
|
+
.where('metric_name', '=', 'discovery_index')
|
|
53
|
+
.where('created_at', '>', new Date(Date.now() - windowMs))
|
|
54
|
+
.executeTakeFirst();
|
|
55
|
+
const count = Number(recent?.count || 0);
|
|
56
|
+
const velocity = count / 10; // novelty per minute
|
|
57
|
+
// Persist velocity as its own research metric
|
|
58
|
+
await this.db
|
|
59
|
+
.insertInto(this.metricsTable)
|
|
60
|
+
.values({
|
|
61
|
+
session_id: sessionId,
|
|
62
|
+
metric_name: 'discovery_velocity',
|
|
63
|
+
value: velocity,
|
|
64
|
+
created_at: new Date(),
|
|
65
|
+
})
|
|
66
|
+
.execute();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Calculate novelty or Discovery Index.
|
|
70
|
+
* Uses cross-session frequency analysis to determine actual novelty.
|
|
35
71
|
*/
|
|
36
72
|
async trackDiscovery(sessionId, taskType) {
|
|
37
|
-
//
|
|
38
|
-
const
|
|
73
|
+
// 1. Check frequency across all recent sessions (Last 500 metrics)
|
|
74
|
+
const frequency = await this.db
|
|
39
75
|
.selectFrom(this.metricsTable)
|
|
40
|
-
.select('id')
|
|
76
|
+
.select((eb) => eb.fn.count('id').as('count'))
|
|
41
77
|
.where('metric_name', '=', 'discovery_index')
|
|
42
|
-
.where('metadata', 'like', `%${taskType}%`)
|
|
78
|
+
.where('metadata', 'like', `%${taskType.replace(/[%_]/g, '')}%`)
|
|
43
79
|
.executeTakeFirst();
|
|
44
|
-
const
|
|
80
|
+
const count = Number(frequency?.count || 0);
|
|
81
|
+
// Discovery Value: Inverse frequency (Inverted Logarithmic Scale)
|
|
82
|
+
// 1.0 = Brand new, 0.0 = Commonplace
|
|
83
|
+
const discoveryValue = Math.max(0, 1.0 - Math.log10(count + 1));
|
|
45
84
|
await this.transmute(sessionId, 'discovery_index', discoveryValue, {
|
|
46
85
|
taskType,
|
|
47
|
-
|
|
86
|
+
occurrenceCount: count,
|
|
87
|
+
isInitialDiscovery: count === 0,
|
|
88
|
+
timestamp: Date.now()
|
|
48
89
|
});
|
|
49
90
|
}
|
|
50
91
|
/**
|
|
@@ -9,9 +9,12 @@ export declare class TelemetryOrchestrator {
|
|
|
9
9
|
harvester: EventHarvester;
|
|
10
10
|
synthesizer: CognitiveSynthesizer;
|
|
11
11
|
alchemist: ResearchAlchemist;
|
|
12
|
+
private circuitBreakerActive;
|
|
13
|
+
private failureCount;
|
|
14
|
+
private lastFailureTime;
|
|
12
15
|
constructor(db: Kysely<any>, config?: AgenticConfig);
|
|
13
16
|
/**
|
|
14
|
-
* Track a raw event and trigger synthesis
|
|
17
|
+
* Track a raw event and trigger synthesis with Circuit Breaking safety.
|
|
15
18
|
*/
|
|
16
19
|
track(sessionId: string | number, type: TelemetryEvent['type'], content: string, metadata?: Record<string, any>): Promise<void>;
|
|
17
20
|
/**
|
|
@@ -10,6 +10,9 @@ class TelemetryOrchestrator {
|
|
|
10
10
|
harvester;
|
|
11
11
|
synthesizer;
|
|
12
12
|
alchemist;
|
|
13
|
+
circuitBreakerActive = false;
|
|
14
|
+
failureCount = 0;
|
|
15
|
+
lastFailureTime = 0;
|
|
13
16
|
constructor(db, config = {}) {
|
|
14
17
|
this.db = db;
|
|
15
18
|
this.config = config;
|
|
@@ -18,21 +21,45 @@ class TelemetryOrchestrator {
|
|
|
18
21
|
this.alchemist = new ResearchAlchemist_js_1.ResearchAlchemist(db, config);
|
|
19
22
|
}
|
|
20
23
|
/**
|
|
21
|
-
* Track a raw event and trigger synthesis
|
|
24
|
+
* Track a raw event and trigger synthesis with Circuit Breaking safety.
|
|
22
25
|
*/
|
|
23
26
|
async track(sessionId, type, content, metadata) {
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
// 1. Circuit Breaker Check
|
|
28
|
+
if (this.circuitBreakerActive) {
|
|
29
|
+
if (Date.now() - this.lastFailureTime > 60000) {
|
|
30
|
+
console.log('[TelemetryOrchestrator] Attempting circuit recovery...');
|
|
31
|
+
this.circuitBreakerActive = false;
|
|
32
|
+
this.failureCount = 0;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Drop non-critical events during outage
|
|
36
|
+
if (type !== 'error' && type !== 'magic')
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
29
39
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
await this.
|
|
40
|
+
try {
|
|
41
|
+
// Layer A: Harvest
|
|
42
|
+
await this.harvester.harvest(sessionId, type, content, metadata);
|
|
43
|
+
// Layer B: Synthesize
|
|
44
|
+
if (type === 'prompt' || type === 'action') {
|
|
45
|
+
await this.synthesizer.synthesize(sessionId, content);
|
|
46
|
+
}
|
|
47
|
+
// Layer C: Research triggers
|
|
48
|
+
if (type === 'magic') {
|
|
49
|
+
await this.alchemist.recordMagic(sessionId, metadata?.surpriseScore || 1.0);
|
|
50
|
+
}
|
|
51
|
+
if (type === 'pivot' || type === 'error') {
|
|
52
|
+
await this.synthesizer.trackShift(sessionId, type === 'pivot' ? 'pivot' : 'abandonment');
|
|
53
|
+
}
|
|
33
54
|
}
|
|
34
|
-
|
|
35
|
-
|
|
55
|
+
catch (e) {
|
|
56
|
+
this.failureCount++;
|
|
57
|
+
this.lastFailureTime = Date.now();
|
|
58
|
+
console.error(`[TelemetryOrchestrator] SENSOR FAILURE (${this.failureCount}): ${e}`);
|
|
59
|
+
if (this.failureCount > 5) {
|
|
60
|
+
console.error('[TelemetryOrchestrator] CIRCUIT BREAKER TRIPPED. Entering degraded mode.');
|
|
61
|
+
this.circuitBreakerActive = true;
|
|
62
|
+
}
|
|
36
63
|
}
|
|
37
64
|
}
|
|
38
65
|
/**
|
|
@@ -80,8 +80,12 @@ async function inspect(tableName, options = {}) {
|
|
|
80
80
|
await showPerformanceOverview(db);
|
|
81
81
|
}
|
|
82
82
|
// Show automation recommendations
|
|
83
|
-
console.log('\n' + chalk_1.default.blue.bold('💡 Automation Recommendations:\n'));
|
|
83
|
+
console.log('\n' + chalk_1.default.blue.bold('💡 Automation Recommendations & Semantic Insights:\n'));
|
|
84
84
|
await showAutomationRecommendations(schemaInfo, db);
|
|
85
|
+
// PRODUCTION HARDENING: Soft Relationship Discovery
|
|
86
|
+
if (options.relationships) {
|
|
87
|
+
await showSoftRelationshipInsights(schemaInfo, db);
|
|
88
|
+
}
|
|
85
89
|
}
|
|
86
90
|
await db.close();
|
|
87
91
|
}
|
|
@@ -475,6 +479,41 @@ function showTableDetails(table, relationships, db, rowCount = 0) {
|
|
|
475
479
|
}
|
|
476
480
|
console.log(chalk_1.default.gray('```'));
|
|
477
481
|
}
|
|
482
|
+
async function showSoftRelationshipInsights(schemaInfo, db) {
|
|
483
|
+
const reasoner = db.agent?.cortex?.reasoner;
|
|
484
|
+
if (!reasoner)
|
|
485
|
+
return;
|
|
486
|
+
try {
|
|
487
|
+
const spinner = new spinner_js_1.AgenticSpinner();
|
|
488
|
+
spinner.start('Analyzing semantic link matrix...');
|
|
489
|
+
const insights = [];
|
|
490
|
+
for (const table of schemaInfo.tables) {
|
|
491
|
+
// Only analyze tables with potential soft links (id-like columns without FKs)
|
|
492
|
+
const targets = table.columns.filter((c) => c.name.includes('_id') &&
|
|
493
|
+
!table.foreignKeys.some((fk) => fk.column === c.name));
|
|
494
|
+
if (targets.length > 0) {
|
|
495
|
+
const analysis = await reasoner.analyzeSoftLinks(table.name, targets.map((t) => t.name));
|
|
496
|
+
if (analysis && analysis.links.length > 0) {
|
|
497
|
+
insights.push(...analysis.links);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
spinner.stop();
|
|
502
|
+
if (insights.length > 0) {
|
|
503
|
+
console.log(chalk_1.default.blue.bold('\n🧠 AI-Inferred Soft Relationships:'));
|
|
504
|
+
insights.forEach(link => {
|
|
505
|
+
console.log(chalk_1.default.gray(` • ${link.sourceTable}.${link.sourceColumn} `) +
|
|
506
|
+
chalk_1.default.yellow('≈≈≈') +
|
|
507
|
+
chalk_1.default.gray(` ${link.targetTable}.${link.targetColumn} `) +
|
|
508
|
+
chalk_1.default.cyan(`(Confidence: ${Math.round(link.confidence * 100)}%)`));
|
|
509
|
+
console.log(chalk_1.default.italic.gray(` Reason: ${link.reason}`));
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
catch (error) {
|
|
514
|
+
// Fail silently for discovery
|
|
515
|
+
}
|
|
516
|
+
}
|
|
478
517
|
function showRelationships(relationships) {
|
|
479
518
|
if (relationships.length === 0) {
|
|
480
519
|
console.log(chalk_1.default.gray('No relationships found.'));
|
|
@@ -122,46 +122,52 @@ async function watch(options) {
|
|
|
122
122
|
pollInterval: intervalMs,
|
|
123
123
|
enabled: true,
|
|
124
124
|
});
|
|
125
|
-
//
|
|
125
|
+
// PRODUCTION HARDENING: Resilient Polling Loop
|
|
126
|
+
let retryCount = 0;
|
|
127
|
+
const maxRetries = 10;
|
|
128
|
+
let currentInterval = intervalMs;
|
|
126
129
|
const periodicTaskInterval = setInterval(async () => {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
try {
|
|
131
|
+
// Reset interval on success
|
|
132
|
+
if (retryCount > 0) {
|
|
133
|
+
console.log(chalk_1.default.green('✅ Connection restored.'));
|
|
134
|
+
retryCount = 0;
|
|
135
|
+
currentInterval = intervalMs;
|
|
136
|
+
}
|
|
137
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
138
|
+
const schemaInfo = await db.getSchemaInfo();
|
|
139
|
+
// Show periodic status
|
|
140
|
+
if (Date.now() % (intervalMs * 10) < intervalMs) {
|
|
141
|
+
console.log(chalk_1.default.gray(`[${timestamp}] Monitoring active - ${schemaInfo.tables.length} tables`));
|
|
142
|
+
}
|
|
143
|
+
// Periodic optimization if auto-optimize is enabled
|
|
144
|
+
if (autoOptimize &&
|
|
145
|
+
Date.now() - lastOptimizationTime > optimizationInterval) {
|
|
146
|
+
console.log(chalk_1.default.blue(`\n🔄 Periodic optimization check at ${timestamp}`));
|
|
132
147
|
const metrics = await db.getSQLitePerformanceMetrics();
|
|
133
148
|
const indexRecs = await db.getSQLiteIndexRecommendations();
|
|
134
149
|
if (indexRecs.recommendations.length > 0) {
|
|
135
150
|
console.log(chalk_1.default.yellow(`💡 Found ${indexRecs.recommendations.length} new index recommendations`));
|
|
136
|
-
if (autoIndex) {
|
|
137
|
-
console.log(chalk_1.default.gray('Run optimize command to apply index recommendations'));
|
|
138
|
-
}
|
|
139
151
|
}
|
|
140
|
-
// Check if optimization is needed
|
|
141
152
|
if (metrics.cacheHitRate < 0.8 || metrics.averageQueryTime > 100) {
|
|
142
153
|
console.log(chalk_1.default.yellow('⚠️ Performance degradation detected, running optimization...'));
|
|
143
154
|
const result = await db.getSQLiteOptimizations();
|
|
144
155
|
console.log(chalk_1.default.green(`✅ Generated ${result.appliedOptimizations.length} performance optimization recommendations`));
|
|
145
156
|
}
|
|
146
|
-
else {
|
|
147
|
-
console.log(chalk_1.default.green('✅ Performance metrics look good'));
|
|
148
|
-
}
|
|
149
157
|
lastOptimizationTime = Date.now();
|
|
150
158
|
}
|
|
151
|
-
catch (error) {
|
|
152
|
-
console.error(chalk_1.default.red('❌ Periodic optimization failed:'), error instanceof Error ? error.message : error);
|
|
153
|
-
}
|
|
154
159
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
console.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
console.log(chalk_1.default.gray(`[${timestamp}] Monitoring active`));
|
|
160
|
+
catch (error) {
|
|
161
|
+
retryCount++;
|
|
162
|
+
const backoff = Math.min(30000, intervalMs * Math.pow(2, retryCount));
|
|
163
|
+
console.error(chalk_1.default.red(`\n❌ Watcher interrupted (${retryCount}/${maxRetries}):`), error instanceof Error ? error.message : String(error));
|
|
164
|
+
if (retryCount >= maxRetries) {
|
|
165
|
+
console.error(chalk_1.default.red.bold('CRITICAL: Max retries exceeded. Schema watcher terminating.'));
|
|
166
|
+
shutdown();
|
|
167
|
+
return;
|
|
164
168
|
}
|
|
169
|
+
console.log(chalk_1.default.yellow(`⏳ Retrying in ${backoff}ms...`));
|
|
170
|
+
// Note: interval remains same but we skip logic via retryCount logic or we could re-init
|
|
165
171
|
}
|
|
166
172
|
}, intervalMs);
|
|
167
173
|
// Handle graceful shutdown
|
package/dist/cjs/cli/index.js
CHANGED
|
File without changes
|
|
@@ -40,16 +40,26 @@ class SqliteIntrospector extends database_introspector_js_1.DatabaseIntrospector
|
|
|
40
40
|
}
|
|
41
41
|
async #getTableMetadata(options) {
|
|
42
42
|
const tablesResult = await this.#tablesQuery(this.#db, options).execute();
|
|
43
|
-
//
|
|
43
|
+
// Unified Discovery: Get columns, indexes, and foreign keys for each table
|
|
44
44
|
const columnsByTable = {};
|
|
45
|
+
const indexesByTable = {};
|
|
46
|
+
const fksByTable = {};
|
|
45
47
|
for (const table of tablesResult) {
|
|
46
48
|
try {
|
|
47
|
-
const columns = await
|
|
49
|
+
const [columns, indexes, fks] = await Promise.all([
|
|
50
|
+
(0, sql_js_1.sql) `PRAGMA table_info(${sql_js_1.sql.lit(table.name)})`.execute(this.#db),
|
|
51
|
+
this.getIndexes(table.name),
|
|
52
|
+
this.getForeignKeys(table.name),
|
|
53
|
+
]);
|
|
48
54
|
columnsByTable[table.name] = columns.rows;
|
|
55
|
+
indexesByTable[table.name] = indexes;
|
|
56
|
+
fksByTable[table.name] = fks;
|
|
49
57
|
}
|
|
50
58
|
catch (error) {
|
|
51
|
-
console.warn(`Failed to
|
|
59
|
+
console.warn(`Failed to introspect table ${table.name}:`, error);
|
|
52
60
|
columnsByTable[table.name] = [];
|
|
61
|
+
indexesByTable[table.name] = [];
|
|
62
|
+
fksByTable[table.name] = [];
|
|
53
63
|
}
|
|
54
64
|
}
|
|
55
65
|
return tablesResult.map(({ name, sql, type }) => {
|
|
@@ -68,8 +78,8 @@ class SqliteIntrospector extends database_introspector_js_1.DatabaseIntrospector
|
|
|
68
78
|
defaultValue: col.dflt_value,
|
|
69
79
|
isPrimaryKey: col.pk > 0,
|
|
70
80
|
})),
|
|
71
|
-
indexes: [],
|
|
72
|
-
foreignKeys: [],
|
|
81
|
+
indexes: indexesByTable[name] || [],
|
|
82
|
+
foreignKeys: fksByTable[name] || [],
|
|
73
83
|
};
|
|
74
84
|
});
|
|
75
85
|
}
|
|
@@ -51,7 +51,7 @@ class AgentSchemaHelper {
|
|
|
51
51
|
.createTable(messagesTable)
|
|
52
52
|
.ifNotExists()
|
|
53
53
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
54
|
-
.addColumn('session_id', '
|
|
54
|
+
.addColumn('session_id', 'text')
|
|
55
55
|
.addColumn('role', 'text', (col) => col.notNull())
|
|
56
56
|
.addColumn('content', 'text', (col) => col.notNull())
|
|
57
57
|
.addColumn('metadata', 'text')
|
|
@@ -62,7 +62,7 @@ class AgentSchemaHelper {
|
|
|
62
62
|
.createTable(goalsTable)
|
|
63
63
|
.ifNotExists()
|
|
64
64
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
65
|
-
.addColumn('session_id', '
|
|
65
|
+
.addColumn('session_id', 'text')
|
|
66
66
|
.addColumn('parent_id', 'integer', (col) => col.references(`${goalsTable}.id`).onDelete('cascade'))
|
|
67
67
|
.addColumn('description', 'text', (col) => col.notNull())
|
|
68
68
|
.addColumn('status', 'text', (col) => col.notNull().defaultTo('pending'))
|
|
@@ -76,7 +76,7 @@ class AgentSchemaHelper {
|
|
|
76
76
|
.createTable(memoriesTable)
|
|
77
77
|
.ifNotExists()
|
|
78
78
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
79
|
-
.addColumn('session_id', '
|
|
79
|
+
.addColumn('session_id', 'text')
|
|
80
80
|
.addColumn('content', 'text', (col) => col.notNull())
|
|
81
81
|
.addColumn('embedding', 'text') // In Postgres with pgvector, this would be 'vector(D)'
|
|
82
82
|
.addColumn('metadata', 'text')
|
|
@@ -87,7 +87,7 @@ class AgentSchemaHelper {
|
|
|
87
87
|
.createTable(reflectionsTable)
|
|
88
88
|
.ifNotExists()
|
|
89
89
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
90
|
-
.addColumn('session_id', '
|
|
90
|
+
.addColumn('session_id', 'text')
|
|
91
91
|
.addColumn('outcome', 'text', (col) => col.notNull())
|
|
92
92
|
.addColumn('lessons_learned', 'text', (col) => col.notNull())
|
|
93
93
|
.addColumn('suggested_actions', 'text')
|
|
@@ -102,7 +102,7 @@ class AgentSchemaHelper {
|
|
|
102
102
|
.addColumn('entity', 'text', (col) => col.notNull())
|
|
103
103
|
.addColumn('fact', 'text', (col) => col.notNull())
|
|
104
104
|
.addColumn('confidence', 'real', (col) => col.notNull().defaultTo(1.0))
|
|
105
|
-
.addColumn('source_session_id', '
|
|
105
|
+
.addColumn('source_session_id', 'text')
|
|
106
106
|
.addColumn('status', 'text', (col) => col.notNull().defaultTo('proposed'))
|
|
107
107
|
.addColumn('tags', 'text')
|
|
108
108
|
.addColumn('metadata', 'text')
|
|
@@ -114,8 +114,8 @@ class AgentSchemaHelper {
|
|
|
114
114
|
.createTable(actionsTable)
|
|
115
115
|
.ifNotExists()
|
|
116
116
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
117
|
-
.addColumn('session_id', '
|
|
118
|
-
.addColumn('message_id', 'integer'
|
|
117
|
+
.addColumn('session_id', 'text')
|
|
118
|
+
.addColumn('message_id', 'integer')
|
|
119
119
|
.addColumn('tool_name', 'text', (col) => col.notNull())
|
|
120
120
|
.addColumn('arguments', 'text', (col) => col.notNull())
|
|
121
121
|
.addColumn('outcome', 'text')
|
|
@@ -129,7 +129,7 @@ class AgentSchemaHelper {
|
|
|
129
129
|
.createTable(episodesTable)
|
|
130
130
|
.ifNotExists()
|
|
131
131
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
132
|
-
.addColumn('session_id', '
|
|
132
|
+
.addColumn('session_id', 'text')
|
|
133
133
|
.addColumn('name', 'text', (col) => col.notNull())
|
|
134
134
|
.addColumn('summary', 'text')
|
|
135
135
|
.addColumn('status', 'text', (col) => col.notNull().defaultTo('active'))
|
|
@@ -142,7 +142,7 @@ class AgentSchemaHelper {
|
|
|
142
142
|
.createTable(resourcesTable)
|
|
143
143
|
.ifNotExists()
|
|
144
144
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
145
|
-
.addColumn('session_id', '
|
|
145
|
+
.addColumn('session_id', 'text')
|
|
146
146
|
.addColumn('agent_id', 'text')
|
|
147
147
|
.addColumn('model_name', 'text', (col) => col.notNull())
|
|
148
148
|
.addColumn('input_tokens', 'integer', (col) => col.notNull().defaultTo(0))
|
|
@@ -173,7 +173,7 @@ class AgentSchemaHelper {
|
|
|
173
173
|
.addColumn('name', 'text', (col) => col.notNull())
|
|
174
174
|
.addColumn('type', 'text', (col) => col.notNull())
|
|
175
175
|
.addColumn('definition', 'text', (col) => col.notNull())
|
|
176
|
-
.addColumn('
|
|
176
|
+
.addColumn('is_enabled', 'integer', (col) => col.notNull().defaultTo(1))
|
|
177
177
|
.addColumn('metadata', 'text')
|
|
178
178
|
.addColumn('created_at', 'timestamp', (col) => col.notNull())
|
|
179
179
|
.addColumn('updated_at', 'timestamp', (col) => col.notNull())
|
|
@@ -183,7 +183,7 @@ class AgentSchemaHelper {
|
|
|
183
183
|
.createTable(metricsTable)
|
|
184
184
|
.ifNotExists()
|
|
185
185
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
186
|
-
.addColumn('session_id', '
|
|
186
|
+
.addColumn('session_id', 'text')
|
|
187
187
|
.addColumn('agent_id', 'text')
|
|
188
188
|
.addColumn('metric_name', 'text', (col) => col.notNull())
|
|
189
189
|
.addColumn('metric_value', 'real', (col) => col.notNull())
|
|
@@ -198,6 +198,7 @@ class AgentSchemaHelper {
|
|
|
198
198
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
199
199
|
.addColumn('name', 'text', (col) => col.notNull().unique())
|
|
200
200
|
.addColumn('role', 'text')
|
|
201
|
+
.addColumn('status', 'text', (col) => col.notNull().defaultTo('active'))
|
|
201
202
|
.addColumn('capabilities', 'text')
|
|
202
203
|
.addColumn('policies', 'text')
|
|
203
204
|
.addColumn('metadata', 'text')
|
|
@@ -209,7 +210,7 @@ class AgentSchemaHelper {
|
|
|
209
210
|
.createTable(epochsTable)
|
|
210
211
|
.ifNotExists()
|
|
211
212
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
212
|
-
.addColumn('session_id', '
|
|
213
|
+
.addColumn('session_id', 'text')
|
|
213
214
|
.addColumn('summary', 'text', (col) => col.notNull())
|
|
214
215
|
.addColumn('start_message_id', 'integer', (col) => col.notNull())
|
|
215
216
|
.addColumn('end_message_id', 'integer', (col) => col.notNull())
|
|
@@ -236,11 +237,11 @@ class AgentSchemaHelper {
|
|
|
236
237
|
.createTable(rulesTable)
|
|
237
238
|
.ifNotExists()
|
|
238
239
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
239
|
-
.addColumn('
|
|
240
|
+
.addColumn('table_name', 'text', (col) => col.notNull())
|
|
240
241
|
.addColumn('operation', 'text', (col) => col.notNull())
|
|
241
242
|
.addColumn('action', 'text', (col) => col.notNull())
|
|
242
243
|
.addColumn('script', 'text')
|
|
243
|
-
.addColumn('
|
|
244
|
+
.addColumn('is_enabled', 'integer', (col) => col.notNull().defaultTo(1))
|
|
244
245
|
.addColumn('metadata', 'text')
|
|
245
246
|
.addColumn('created_at', 'timestamp', (col) => col.notNull())
|
|
246
247
|
.execute();
|