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
|
@@ -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
|
}
|
|
@@ -10,17 +10,24 @@ export class EventHarvester {
|
|
|
10
10
|
config.telemetryEventsTable || 'agent_telemetry_events';
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Persist a raw telemetry event
|
|
13
|
+
* Persist a raw telemetry event with safety valves for scale.
|
|
14
14
|
*/
|
|
15
15
|
async harvest(sessionId, type, content, metadata) {
|
|
16
|
+
// 1. Safety Valve: Drop excessively large payloads (> 100KB)
|
|
17
|
+
if (content.length > 102400) {
|
|
18
|
+
console.warn(`[EventHarvester] DROPPING EVENT: Content exceeds 100KB safety limit (${content.length} bytes)`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// 2. Metadata Integrity: Ensure metadata is a valid object
|
|
22
|
+
const finalMetadata = metadata && typeof metadata === 'object' ? metadata : {};
|
|
16
23
|
try {
|
|
17
24
|
await this.db
|
|
18
25
|
.insertInto(this.telemetryTable)
|
|
19
26
|
.values({
|
|
20
27
|
session_id: sessionId,
|
|
21
28
|
type,
|
|
22
|
-
content,
|
|
23
|
-
metadata:
|
|
29
|
+
content: content.substring(0, 50000), // Hard truncated for storage safety
|
|
30
|
+
metadata: JSON.stringify(finalMetadata),
|
|
24
31
|
created_at: new Date(),
|
|
25
32
|
})
|
|
26
33
|
.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
|
/**
|
|
@@ -9,9 +9,15 @@ export class ResearchAlchemist {
|
|
|
9
9
|
this.metricsTable = config.researchMetricsTable || 'agent_research_metrics';
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Transmute raw events into research metrics
|
|
12
|
+
* Transmute raw events into research metrics with statistical noise filtering.
|
|
13
13
|
*/
|
|
14
14
|
async transmute(sessionId, metricName, value, metadata) {
|
|
15
|
+
// Hardening: Prevent extreme outliers from skewing discovery data
|
|
16
|
+
const magicCeiling = this.config.research?.magicCeiling || 100;
|
|
17
|
+
if (metricName === 'time_to_magic' && (value < 0 || value > magicCeiling)) {
|
|
18
|
+
console.warn(`[ResearchAlchemist] Filtering outlier magic score: ${value}`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
15
21
|
try {
|
|
16
22
|
await this.db
|
|
17
23
|
.insertInto(this.metricsTable)
|
|
@@ -23,26 +29,61 @@ export class ResearchAlchemist {
|
|
|
23
29
|
created_at: new Date(),
|
|
24
30
|
})
|
|
25
31
|
.execute();
|
|
32
|
+
// Secondary Transmutation: Calculate discovery velocity
|
|
33
|
+
if (metricName === 'discovery_index') {
|
|
34
|
+
await this.calculateDiscoveryVelocity(sessionId);
|
|
35
|
+
}
|
|
26
36
|
}
|
|
27
37
|
catch (e) {
|
|
28
38
|
console.warn(`[ResearchAlchemist] Failed to transmute metric ${metricName}: ${e}`);
|
|
29
39
|
}
|
|
30
40
|
}
|
|
31
41
|
/**
|
|
32
|
-
* Calculate novelty
|
|
42
|
+
* Calculate discovery velocity: rate of novelty acquisition in the last 10 minutes.
|
|
43
|
+
*/
|
|
44
|
+
async calculateDiscoveryVelocity(sessionId) {
|
|
45
|
+
const windowMs = this.config.research?.velocityWindowMinutes * 60 * 1000 || 10 * 60 * 1000;
|
|
46
|
+
const recent = await this.db
|
|
47
|
+
.selectFrom(this.metricsTable)
|
|
48
|
+
.select((eb) => eb.fn.count('id').as('count'))
|
|
49
|
+
.where('session_id', '=', sessionId)
|
|
50
|
+
.where('metric_name', '=', 'discovery_index')
|
|
51
|
+
.where('created_at', '>', new Date(Date.now() - windowMs))
|
|
52
|
+
.executeTakeFirst();
|
|
53
|
+
const count = Number(recent?.count || 0);
|
|
54
|
+
const velocity = count / 10; // novelty per minute
|
|
55
|
+
// Persist velocity as its own research metric
|
|
56
|
+
await this.db
|
|
57
|
+
.insertInto(this.metricsTable)
|
|
58
|
+
.values({
|
|
59
|
+
session_id: sessionId,
|
|
60
|
+
metric_name: 'discovery_velocity',
|
|
61
|
+
value: velocity,
|
|
62
|
+
created_at: new Date(),
|
|
63
|
+
})
|
|
64
|
+
.execute();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Calculate novelty or Discovery Index.
|
|
68
|
+
* Uses cross-session frequency analysis to determine actual novelty.
|
|
33
69
|
*/
|
|
34
70
|
async trackDiscovery(sessionId, taskType) {
|
|
35
|
-
//
|
|
36
|
-
const
|
|
71
|
+
// 1. Check frequency across all recent sessions (Last 500 metrics)
|
|
72
|
+
const frequency = await this.db
|
|
37
73
|
.selectFrom(this.metricsTable)
|
|
38
|
-
.select('id')
|
|
74
|
+
.select((eb) => eb.fn.count('id').as('count'))
|
|
39
75
|
.where('metric_name', '=', 'discovery_index')
|
|
40
|
-
.where('metadata', 'like', `%${taskType}%`)
|
|
76
|
+
.where('metadata', 'like', `%${taskType.replace(/[%_]/g, '')}%`)
|
|
41
77
|
.executeTakeFirst();
|
|
42
|
-
const
|
|
78
|
+
const count = Number(frequency?.count || 0);
|
|
79
|
+
// Discovery Value: Inverse frequency (Inverted Logarithmic Scale)
|
|
80
|
+
// 1.0 = Brand new, 0.0 = Commonplace
|
|
81
|
+
const discoveryValue = Math.max(0, 1.0 - Math.log10(count + 1));
|
|
43
82
|
await this.transmute(sessionId, 'discovery_index', discoveryValue, {
|
|
44
83
|
taskType,
|
|
45
|
-
|
|
84
|
+
occurrenceCount: count,
|
|
85
|
+
isInitialDiscovery: count === 0,
|
|
86
|
+
timestamp: Date.now()
|
|
46
87
|
});
|
|
47
88
|
}
|
|
48
89
|
/**
|
|
@@ -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
|
/**
|
|
@@ -8,6 +8,9 @@ export class TelemetryOrchestrator {
|
|
|
8
8
|
harvester;
|
|
9
9
|
synthesizer;
|
|
10
10
|
alchemist;
|
|
11
|
+
circuitBreakerActive = false;
|
|
12
|
+
failureCount = 0;
|
|
13
|
+
lastFailureTime = 0;
|
|
11
14
|
constructor(db, config = {}) {
|
|
12
15
|
this.db = db;
|
|
13
16
|
this.config = config;
|
|
@@ -16,21 +19,45 @@ export class TelemetryOrchestrator {
|
|
|
16
19
|
this.alchemist = new ResearchAlchemist(db, config);
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
|
-
* Track a raw event and trigger synthesis
|
|
22
|
+
* Track a raw event and trigger synthesis with Circuit Breaking safety.
|
|
20
23
|
*/
|
|
21
24
|
async track(sessionId, type, content, metadata) {
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
// 1. Circuit Breaker Check
|
|
26
|
+
if (this.circuitBreakerActive) {
|
|
27
|
+
if (Date.now() - this.lastFailureTime > 60000) {
|
|
28
|
+
console.log('[TelemetryOrchestrator] Attempting circuit recovery...');
|
|
29
|
+
this.circuitBreakerActive = false;
|
|
30
|
+
this.failureCount = 0;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Drop non-critical events during outage
|
|
34
|
+
if (type !== 'error' && type !== 'magic')
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
27
37
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
await this.
|
|
38
|
+
try {
|
|
39
|
+
// Layer A: Harvest
|
|
40
|
+
await this.harvester.harvest(sessionId, type, content, metadata);
|
|
41
|
+
// Layer B: Synthesize
|
|
42
|
+
if (type === 'prompt' || type === 'action') {
|
|
43
|
+
await this.synthesizer.synthesize(sessionId, content);
|
|
44
|
+
}
|
|
45
|
+
// Layer C: Research triggers
|
|
46
|
+
if (type === 'magic') {
|
|
47
|
+
await this.alchemist.recordMagic(sessionId, metadata?.surpriseScore || 1.0);
|
|
48
|
+
}
|
|
49
|
+
if (type === 'pivot' || type === 'error') {
|
|
50
|
+
await this.synthesizer.trackShift(sessionId, type === 'pivot' ? 'pivot' : 'abandonment');
|
|
51
|
+
}
|
|
31
52
|
}
|
|
32
|
-
|
|
33
|
-
|
|
53
|
+
catch (e) {
|
|
54
|
+
this.failureCount++;
|
|
55
|
+
this.lastFailureTime = Date.now();
|
|
56
|
+
console.error(`[TelemetryOrchestrator] SENSOR FAILURE (${this.failureCount}): ${e}`);
|
|
57
|
+
if (this.failureCount > 5) {
|
|
58
|
+
console.error('[TelemetryOrchestrator] CIRCUIT BREAKER TRIPPED. Entering degraded mode.');
|
|
59
|
+
this.circuitBreakerActive = true;
|
|
60
|
+
}
|
|
34
61
|
}
|
|
35
62
|
}
|
|
36
63
|
/**
|
|
@@ -75,8 +75,12 @@ export async function inspect(tableName, options = {}) {
|
|
|
75
75
|
await showPerformanceOverview(db);
|
|
76
76
|
}
|
|
77
77
|
// Show automation recommendations
|
|
78
|
-
console.log('\n' + chalk.blue.bold('💡 Automation Recommendations:\n'));
|
|
78
|
+
console.log('\n' + chalk.blue.bold('💡 Automation Recommendations & Semantic Insights:\n'));
|
|
79
79
|
await showAutomationRecommendations(schemaInfo, db);
|
|
80
|
+
// PRODUCTION HARDENING: Soft Relationship Discovery
|
|
81
|
+
if (options.relationships) {
|
|
82
|
+
await showSoftRelationshipInsights(schemaInfo, db);
|
|
83
|
+
}
|
|
80
84
|
}
|
|
81
85
|
await db.close();
|
|
82
86
|
}
|
|
@@ -470,6 +474,41 @@ function showTableDetails(table, relationships, db, rowCount = 0) {
|
|
|
470
474
|
}
|
|
471
475
|
console.log(chalk.gray('```'));
|
|
472
476
|
}
|
|
477
|
+
async function showSoftRelationshipInsights(schemaInfo, db) {
|
|
478
|
+
const reasoner = db.agent?.cortex?.reasoner;
|
|
479
|
+
if (!reasoner)
|
|
480
|
+
return;
|
|
481
|
+
try {
|
|
482
|
+
const spinner = new AgenticSpinner();
|
|
483
|
+
spinner.start('Analyzing semantic link matrix...');
|
|
484
|
+
const insights = [];
|
|
485
|
+
for (const table of schemaInfo.tables) {
|
|
486
|
+
// Only analyze tables with potential soft links (id-like columns without FKs)
|
|
487
|
+
const targets = table.columns.filter((c) => c.name.includes('_id') &&
|
|
488
|
+
!table.foreignKeys.some((fk) => fk.column === c.name));
|
|
489
|
+
if (targets.length > 0) {
|
|
490
|
+
const analysis = await reasoner.analyzeSoftLinks(table.name, targets.map((t) => t.name));
|
|
491
|
+
if (analysis && analysis.links.length > 0) {
|
|
492
|
+
insights.push(...analysis.links);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
spinner.stop();
|
|
497
|
+
if (insights.length > 0) {
|
|
498
|
+
console.log(chalk.blue.bold('\n🧠 AI-Inferred Soft Relationships:'));
|
|
499
|
+
insights.forEach(link => {
|
|
500
|
+
console.log(chalk.gray(` • ${link.sourceTable}.${link.sourceColumn} `) +
|
|
501
|
+
chalk.yellow('≈≈≈') +
|
|
502
|
+
chalk.gray(` ${link.targetTable}.${link.targetColumn} `) +
|
|
503
|
+
chalk.cyan(`(Confidence: ${Math.round(link.confidence * 100)}%)`));
|
|
504
|
+
console.log(chalk.italic.gray(` Reason: ${link.reason}`));
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
catch (error) {
|
|
509
|
+
// Fail silently for discovery
|
|
510
|
+
}
|
|
511
|
+
}
|
|
473
512
|
function showRelationships(relationships) {
|
|
474
513
|
if (relationships.length === 0) {
|
|
475
514
|
console.log(chalk.gray('No relationships found.'));
|
|
@@ -84,46 +84,52 @@ export async function watch(options) {
|
|
|
84
84
|
pollInterval: intervalMs,
|
|
85
85
|
enabled: true,
|
|
86
86
|
});
|
|
87
|
-
//
|
|
87
|
+
// PRODUCTION HARDENING: Resilient Polling Loop
|
|
88
|
+
let retryCount = 0;
|
|
89
|
+
const maxRetries = 10;
|
|
90
|
+
let currentInterval = intervalMs;
|
|
88
91
|
const periodicTaskInterval = setInterval(async () => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
try {
|
|
93
|
+
// Reset interval on success
|
|
94
|
+
if (retryCount > 0) {
|
|
95
|
+
console.log(chalk.green('✅ Connection restored.'));
|
|
96
|
+
retryCount = 0;
|
|
97
|
+
currentInterval = intervalMs;
|
|
98
|
+
}
|
|
99
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
100
|
+
const schemaInfo = await db.getSchemaInfo();
|
|
101
|
+
// Show periodic status
|
|
102
|
+
if (Date.now() % (intervalMs * 10) < intervalMs) {
|
|
103
|
+
console.log(chalk.gray(`[${timestamp}] Monitoring active - ${schemaInfo.tables.length} tables`));
|
|
104
|
+
}
|
|
105
|
+
// Periodic optimization if auto-optimize is enabled
|
|
106
|
+
if (autoOptimize &&
|
|
107
|
+
Date.now() - lastOptimizationTime > optimizationInterval) {
|
|
108
|
+
console.log(chalk.blue(`\n🔄 Periodic optimization check at ${timestamp}`));
|
|
94
109
|
const metrics = await db.getSQLitePerformanceMetrics();
|
|
95
110
|
const indexRecs = await db.getSQLiteIndexRecommendations();
|
|
96
111
|
if (indexRecs.recommendations.length > 0) {
|
|
97
112
|
console.log(chalk.yellow(`💡 Found ${indexRecs.recommendations.length} new index recommendations`));
|
|
98
|
-
if (autoIndex) {
|
|
99
|
-
console.log(chalk.gray('Run optimize command to apply index recommendations'));
|
|
100
|
-
}
|
|
101
113
|
}
|
|
102
|
-
// Check if optimization is needed
|
|
103
114
|
if (metrics.cacheHitRate < 0.8 || metrics.averageQueryTime > 100) {
|
|
104
115
|
console.log(chalk.yellow('⚠️ Performance degradation detected, running optimization...'));
|
|
105
116
|
const result = await db.getSQLiteOptimizations();
|
|
106
117
|
console.log(chalk.green(`✅ Generated ${result.appliedOptimizations.length} performance optimization recommendations`));
|
|
107
118
|
}
|
|
108
|
-
else {
|
|
109
|
-
console.log(chalk.green('✅ Performance metrics look good'));
|
|
110
|
-
}
|
|
111
119
|
lastOptimizationTime = Date.now();
|
|
112
120
|
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
console.error(chalk.red('❌ Periodic optimization failed:'), error instanceof Error ? error.message : error);
|
|
115
|
-
}
|
|
116
121
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
console.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
console.log(chalk.gray(`[${timestamp}] Monitoring active`));
|
|
122
|
+
catch (error) {
|
|
123
|
+
retryCount++;
|
|
124
|
+
const backoff = Math.min(30000, intervalMs * Math.pow(2, retryCount));
|
|
125
|
+
console.error(chalk.red(`\n❌ Watcher interrupted (${retryCount}/${maxRetries}):`), error instanceof Error ? error.message : String(error));
|
|
126
|
+
if (retryCount >= maxRetries) {
|
|
127
|
+
console.error(chalk.red.bold('CRITICAL: Max retries exceeded. Schema watcher terminating.'));
|
|
128
|
+
shutdown();
|
|
129
|
+
return;
|
|
126
130
|
}
|
|
131
|
+
console.log(chalk.yellow(`⏳ Retrying in ${backoff}ms...`));
|
|
132
|
+
// Note: interval remains same but we skip logic via retryCount logic or we could re-init
|
|
127
133
|
}
|
|
128
134
|
}, intervalMs);
|
|
129
135
|
// Handle graceful shutdown
|
|
@@ -38,16 +38,26 @@ export class SqliteIntrospector extends DatabaseIntrospector {
|
|
|
38
38
|
}
|
|
39
39
|
async #getTableMetadata(options) {
|
|
40
40
|
const tablesResult = await this.#tablesQuery(this.#db, options).execute();
|
|
41
|
-
//
|
|
41
|
+
// Unified Discovery: Get columns, indexes, and foreign keys for each table
|
|
42
42
|
const columnsByTable = {};
|
|
43
|
+
const indexesByTable = {};
|
|
44
|
+
const fksByTable = {};
|
|
43
45
|
for (const table of tablesResult) {
|
|
44
46
|
try {
|
|
45
|
-
const columns = await
|
|
47
|
+
const [columns, indexes, fks] = await Promise.all([
|
|
48
|
+
sql `PRAGMA table_info(${sql.lit(table.name)})`.execute(this.#db),
|
|
49
|
+
this.getIndexes(table.name),
|
|
50
|
+
this.getForeignKeys(table.name),
|
|
51
|
+
]);
|
|
46
52
|
columnsByTable[table.name] = columns.rows;
|
|
53
|
+
indexesByTable[table.name] = indexes;
|
|
54
|
+
fksByTable[table.name] = fks;
|
|
47
55
|
}
|
|
48
56
|
catch (error) {
|
|
49
|
-
console.warn(`Failed to
|
|
57
|
+
console.warn(`Failed to introspect table ${table.name}:`, error);
|
|
50
58
|
columnsByTable[table.name] = [];
|
|
59
|
+
indexesByTable[table.name] = [];
|
|
60
|
+
fksByTable[table.name] = [];
|
|
51
61
|
}
|
|
52
62
|
}
|
|
53
63
|
return tablesResult.map(({ name, sql, type }) => {
|
|
@@ -66,8 +76,8 @@ export class SqliteIntrospector extends DatabaseIntrospector {
|
|
|
66
76
|
defaultValue: col.dflt_value,
|
|
67
77
|
isPrimaryKey: col.pk > 0,
|
|
68
78
|
})),
|
|
69
|
-
indexes: [],
|
|
70
|
-
foreignKeys: [],
|
|
79
|
+
indexes: indexesByTable[name] || [],
|
|
80
|
+
foreignKeys: fksByTable[name] || [],
|
|
71
81
|
};
|
|
72
82
|
});
|
|
73
83
|
}
|
|
@@ -49,7 +49,7 @@ export class AgentSchemaHelper {
|
|
|
49
49
|
.createTable(messagesTable)
|
|
50
50
|
.ifNotExists()
|
|
51
51
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
52
|
-
.addColumn('session_id', '
|
|
52
|
+
.addColumn('session_id', 'text')
|
|
53
53
|
.addColumn('role', 'text', (col) => col.notNull())
|
|
54
54
|
.addColumn('content', 'text', (col) => col.notNull())
|
|
55
55
|
.addColumn('metadata', 'text')
|
|
@@ -60,7 +60,7 @@ export class AgentSchemaHelper {
|
|
|
60
60
|
.createTable(goalsTable)
|
|
61
61
|
.ifNotExists()
|
|
62
62
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
63
|
-
.addColumn('session_id', '
|
|
63
|
+
.addColumn('session_id', 'text')
|
|
64
64
|
.addColumn('parent_id', 'integer', (col) => col.references(`${goalsTable}.id`).onDelete('cascade'))
|
|
65
65
|
.addColumn('description', 'text', (col) => col.notNull())
|
|
66
66
|
.addColumn('status', 'text', (col) => col.notNull().defaultTo('pending'))
|
|
@@ -74,7 +74,7 @@ export class AgentSchemaHelper {
|
|
|
74
74
|
.createTable(memoriesTable)
|
|
75
75
|
.ifNotExists()
|
|
76
76
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
77
|
-
.addColumn('session_id', '
|
|
77
|
+
.addColumn('session_id', 'text')
|
|
78
78
|
.addColumn('content', 'text', (col) => col.notNull())
|
|
79
79
|
.addColumn('embedding', 'text') // In Postgres with pgvector, this would be 'vector(D)'
|
|
80
80
|
.addColumn('metadata', 'text')
|
|
@@ -85,7 +85,7 @@ export class AgentSchemaHelper {
|
|
|
85
85
|
.createTable(reflectionsTable)
|
|
86
86
|
.ifNotExists()
|
|
87
87
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
88
|
-
.addColumn('session_id', '
|
|
88
|
+
.addColumn('session_id', 'text')
|
|
89
89
|
.addColumn('outcome', 'text', (col) => col.notNull())
|
|
90
90
|
.addColumn('lessons_learned', 'text', (col) => col.notNull())
|
|
91
91
|
.addColumn('suggested_actions', 'text')
|
|
@@ -100,7 +100,7 @@ export class AgentSchemaHelper {
|
|
|
100
100
|
.addColumn('entity', 'text', (col) => col.notNull())
|
|
101
101
|
.addColumn('fact', 'text', (col) => col.notNull())
|
|
102
102
|
.addColumn('confidence', 'real', (col) => col.notNull().defaultTo(1.0))
|
|
103
|
-
.addColumn('source_session_id', '
|
|
103
|
+
.addColumn('source_session_id', 'text')
|
|
104
104
|
.addColumn('status', 'text', (col) => col.notNull().defaultTo('proposed'))
|
|
105
105
|
.addColumn('tags', 'text')
|
|
106
106
|
.addColumn('metadata', 'text')
|
|
@@ -112,8 +112,8 @@ export class AgentSchemaHelper {
|
|
|
112
112
|
.createTable(actionsTable)
|
|
113
113
|
.ifNotExists()
|
|
114
114
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
115
|
-
.addColumn('session_id', '
|
|
116
|
-
.addColumn('message_id', 'integer'
|
|
115
|
+
.addColumn('session_id', 'text')
|
|
116
|
+
.addColumn('message_id', 'integer')
|
|
117
117
|
.addColumn('tool_name', 'text', (col) => col.notNull())
|
|
118
118
|
.addColumn('arguments', 'text', (col) => col.notNull())
|
|
119
119
|
.addColumn('outcome', 'text')
|
|
@@ -127,7 +127,7 @@ export class AgentSchemaHelper {
|
|
|
127
127
|
.createTable(episodesTable)
|
|
128
128
|
.ifNotExists()
|
|
129
129
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
130
|
-
.addColumn('session_id', '
|
|
130
|
+
.addColumn('session_id', 'text')
|
|
131
131
|
.addColumn('name', 'text', (col) => col.notNull())
|
|
132
132
|
.addColumn('summary', 'text')
|
|
133
133
|
.addColumn('status', 'text', (col) => col.notNull().defaultTo('active'))
|
|
@@ -140,7 +140,7 @@ export class AgentSchemaHelper {
|
|
|
140
140
|
.createTable(resourcesTable)
|
|
141
141
|
.ifNotExists()
|
|
142
142
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
143
|
-
.addColumn('session_id', '
|
|
143
|
+
.addColumn('session_id', 'text')
|
|
144
144
|
.addColumn('agent_id', 'text')
|
|
145
145
|
.addColumn('model_name', 'text', (col) => col.notNull())
|
|
146
146
|
.addColumn('input_tokens', 'integer', (col) => col.notNull().defaultTo(0))
|
|
@@ -171,7 +171,7 @@ export class AgentSchemaHelper {
|
|
|
171
171
|
.addColumn('name', 'text', (col) => col.notNull())
|
|
172
172
|
.addColumn('type', 'text', (col) => col.notNull())
|
|
173
173
|
.addColumn('definition', 'text', (col) => col.notNull())
|
|
174
|
-
.addColumn('
|
|
174
|
+
.addColumn('is_enabled', 'integer', (col) => col.notNull().defaultTo(1))
|
|
175
175
|
.addColumn('metadata', 'text')
|
|
176
176
|
.addColumn('created_at', 'timestamp', (col) => col.notNull())
|
|
177
177
|
.addColumn('updated_at', 'timestamp', (col) => col.notNull())
|
|
@@ -181,7 +181,7 @@ export class AgentSchemaHelper {
|
|
|
181
181
|
.createTable(metricsTable)
|
|
182
182
|
.ifNotExists()
|
|
183
183
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
184
|
-
.addColumn('session_id', '
|
|
184
|
+
.addColumn('session_id', 'text')
|
|
185
185
|
.addColumn('agent_id', 'text')
|
|
186
186
|
.addColumn('metric_name', 'text', (col) => col.notNull())
|
|
187
187
|
.addColumn('metric_value', 'real', (col) => col.notNull())
|
|
@@ -196,6 +196,7 @@ export class AgentSchemaHelper {
|
|
|
196
196
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
197
197
|
.addColumn('name', 'text', (col) => col.notNull().unique())
|
|
198
198
|
.addColumn('role', 'text')
|
|
199
|
+
.addColumn('status', 'text', (col) => col.notNull().defaultTo('active'))
|
|
199
200
|
.addColumn('capabilities', 'text')
|
|
200
201
|
.addColumn('policies', 'text')
|
|
201
202
|
.addColumn('metadata', 'text')
|
|
@@ -207,7 +208,7 @@ export class AgentSchemaHelper {
|
|
|
207
208
|
.createTable(epochsTable)
|
|
208
209
|
.ifNotExists()
|
|
209
210
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
210
|
-
.addColumn('session_id', '
|
|
211
|
+
.addColumn('session_id', 'text')
|
|
211
212
|
.addColumn('summary', 'text', (col) => col.notNull())
|
|
212
213
|
.addColumn('start_message_id', 'integer', (col) => col.notNull())
|
|
213
214
|
.addColumn('end_message_id', 'integer', (col) => col.notNull())
|
|
@@ -234,11 +235,11 @@ export class AgentSchemaHelper {
|
|
|
234
235
|
.createTable(rulesTable)
|
|
235
236
|
.ifNotExists()
|
|
236
237
|
.addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())
|
|
237
|
-
.addColumn('
|
|
238
|
+
.addColumn('table_name', 'text', (col) => col.notNull())
|
|
238
239
|
.addColumn('operation', 'text', (col) => col.notNull())
|
|
239
240
|
.addColumn('action', 'text', (col) => col.notNull())
|
|
240
241
|
.addColumn('script', 'text')
|
|
241
|
-
.addColumn('
|
|
242
|
+
.addColumn('is_enabled', 'integer', (col) => col.notNull().defaultTo(1))
|
|
242
243
|
.addColumn('metadata', 'text')
|
|
243
244
|
.addColumn('created_at', 'timestamp', (col) => col.notNull())
|
|
244
245
|
.execute();
|
|
@@ -21,10 +21,10 @@ export async function migrateTableData(sourceDb, targetDb, sourceTable, targetTa
|
|
|
21
21
|
errors: [],
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
-
// Keyset pagination optimization: find a
|
|
25
|
-
const pkColumn = sourceTable.columns.find((c) => c.primaryKey
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
// Keyset pagination optimization: find a primary key or a unique single-column index
|
|
25
|
+
const pkColumn = sourceTable.columns.find((c) => c.primaryKey)?.name ||
|
|
26
|
+
sourceTable.indexes.find((i) => i.unique && i.columns.length === 1)
|
|
27
|
+
?.columns[0];
|
|
28
28
|
let lastId = null;
|
|
29
29
|
// Calculate number of batches (approximate)
|
|
30
30
|
const batchCount = Math.ceil(totalRows / options.batchSize);
|
|
@@ -175,24 +175,46 @@ function compareIndexes(sourceTable, targetTable) {
|
|
|
175
175
|
}
|
|
176
176
|
function compareConstraints(sourceTable, targetTable) {
|
|
177
177
|
const differences = [];
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
178
|
+
// PRODUCTION HARDENING: Deep Structural Audit
|
|
179
|
+
const sourceConstraints = sourceTable.constraints || [];
|
|
180
|
+
const targetConstraints = targetTable.constraints || [];
|
|
181
|
+
for (const source of sourceConstraints) {
|
|
182
|
+
const matching = targetConstraints.find((t) => {
|
|
183
|
+
const typeMatch = t.type === source.type;
|
|
184
|
+
const exprMatch = t.expression === source.expression;
|
|
185
|
+
const colsMatch = JSON.stringify(t.columns?.sort()) ===
|
|
186
|
+
JSON.stringify(source.columns?.sort());
|
|
187
|
+
return typeMatch && (source.type === 'CHECK' ? exprMatch : colsMatch);
|
|
186
188
|
});
|
|
189
|
+
if (!matching) {
|
|
190
|
+
differences.push({
|
|
191
|
+
type: 'constraint_added',
|
|
192
|
+
table: sourceTable.name,
|
|
193
|
+
details: {
|
|
194
|
+
source,
|
|
195
|
+
message: `Constraint of type ${source.type} ${source.name ? `'${source.name}' ` : ''}needs to be added`,
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
}
|
|
187
199
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
type
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
200
|
+
for (const target of targetConstraints) {
|
|
201
|
+
const matching = sourceConstraints.find((s) => {
|
|
202
|
+
const typeMatch = s.type === target.type;
|
|
203
|
+
const exprMatch = s.expression === target.expression;
|
|
204
|
+
const colsMatch = JSON.stringify(s.columns?.sort()) ===
|
|
205
|
+
JSON.stringify(target.columns?.sort());
|
|
206
|
+
return typeMatch && (target.type === 'CHECK' ? exprMatch : colsMatch);
|
|
195
207
|
});
|
|
208
|
+
if (!matching) {
|
|
209
|
+
differences.push({
|
|
210
|
+
type: 'constraint_removed',
|
|
211
|
+
table: sourceTable.name,
|
|
212
|
+
details: {
|
|
213
|
+
target,
|
|
214
|
+
message: `Constraint of type ${target.type} ${target.name ? `'${target.name}' ` : ''}exists in target but not in source`,
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
}
|
|
196
218
|
}
|
|
197
219
|
return differences;
|
|
198
220
|
}
|
|
@@ -385,6 +385,18 @@ export interface AgentPersona {
|
|
|
385
385
|
createdAt: Date;
|
|
386
386
|
updatedAt: Date;
|
|
387
387
|
}
|
|
388
|
+
export interface AgentQuota {
|
|
389
|
+
id: string | number;
|
|
390
|
+
targetType: 'persona' | 'swarm' | 'global';
|
|
391
|
+
targetId: string | null;
|
|
392
|
+
metric: 'cost' | 'tokens_input' | 'tokens_output' | 'tokens_total';
|
|
393
|
+
limit: number;
|
|
394
|
+
period: 'hourly' | 'daily' | 'monthly' | 'infinite';
|
|
395
|
+
currentUsage: number;
|
|
396
|
+
metadata?: Record<string, any>;
|
|
397
|
+
createdAt: Date;
|
|
398
|
+
updatedAt: Date;
|
|
399
|
+
}
|
|
388
400
|
export interface AgentEpoch {
|
|
389
401
|
id: string | number;
|
|
390
402
|
sessionId: string | number;
|